/// <summary> /// Proxies a request inside of a controller's method body from the request on the controller's route. /// </summary> /// <param name="controller">The ASP.NET <see cref="ControllerBase"/>.</param> /// <param name="httpEndpoint">The HTTP endpoint to use.</param> /// <param name="wsEndpoint">The WS endpoint to use.</param> /// <param name="httpProxyOptions">The HTTP options.</param> /// <param name="wsProxyOptions">The WS options.</param> /// <returns>A <see cref="Task"/> which completes when the request has been successfully proxied and written to the response.</returns> public static Task ProxyAsync(this ControllerBase controller, string httpEndpoint, string wsEndpoint, HttpProxyOptions httpProxyOptions = null, WsProxyOptions wsProxyOptions = null) { var httpProxy = new HttpProxy((c, a) => new ValueTask <string>(httpEndpoint), httpProxyOptions); var wsProxy = new WsProxy((c, a) => new ValueTask <string>(wsEndpoint), wsProxyOptions); var proxy = new Builders.Proxy(null, httpProxy, wsProxy); return(controller.HttpContext.ExecuteProxyOperationAsync(proxy)); }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VJobCandidateEmployment> Convert(WsProxy.VJobCandidateEmployment[] items) { VList<VJobCandidateEmployment> outItems = new VList<VJobCandidateEmployment>(); foreach(WsProxy.VJobCandidateEmployment item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VProductAndDescription> Convert(WsProxy.VProductAndDescription[] items) { VList<VProductAndDescription> outItems = new VList<VProductAndDescription>(); foreach(WsProxy.VProductAndDescription item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<SpecialOfferProduct> Convert(WsProxy.SpecialOfferProduct[] items) { Nettiers.AdventureWorks.Entities.TList<SpecialOfferProduct> outItems = new Nettiers.AdventureWorks.Entities.TList<SpecialOfferProduct>(); foreach(WsProxy.SpecialOfferProduct item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<StudentMasterIndex> Convert(WsProxy.StudentMasterIndex[] items) { Nettiers.AdventureWorks.Entities.TList<StudentMasterIndex> outItems = new Nettiers.AdventureWorks.Entities.TList<StudentMasterIndex>(); foreach(WsProxy.StudentMasterIndex item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<NullFkeyChild> Convert(WsProxy.NullFkeyChild[] items) { Nettiers.AdventureWorks.Entities.TList<NullFkeyChild> outItems = new Nettiers.AdventureWorks.Entities.TList<NullFkeyChild>(); foreach(WsProxy.NullFkeyChild item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<Individual> Convert(WsProxy.Individual[] items) { Nettiers.AdventureWorks.Entities.TList<Individual> outItems = new Nettiers.AdventureWorks.Entities.TList<Individual>(); foreach(WsProxy.Individual item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VVendor> Convert(WsProxy.VVendor[] items) { VList<VVendor> outItems = new VList<VVendor>(); foreach(WsProxy.VVendor item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<TransactionHistoryArchive> Convert(WsProxy.TransactionHistoryArchive[] items) { Nettiers.AdventureWorks.Entities.TList<TransactionHistoryArchive> outItems = new Nettiers.AdventureWorks.Entities.TList<TransactionHistoryArchive>(); foreach(WsProxy.TransactionHistoryArchive item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<Vendor> Convert(WsProxy.Vendor[] items) { Nettiers.AdventureWorks.Entities.TList<Vendor> outItems = new Nettiers.AdventureWorks.Entities.TList<Vendor>(); foreach(WsProxy.Vendor item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VIndividualCustomer> Convert(WsProxy.VIndividualCustomer[] items) { VList<VIndividualCustomer> outItems = new VList<VIndividualCustomer>(); foreach(WsProxy.VIndividualCustomer item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<TimestampPk> Convert(WsProxy.TimestampPk[] items) { Nettiers.AdventureWorks.Entities.TList<TimestampPk> outItems = new Nettiers.AdventureWorks.Entities.TList<TimestampPk>(); foreach(WsProxy.TimestampPk item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VEmployeeDepartmentHistory> Convert(WsProxy.VEmployeeDepartmentHistory[] items) { VList<VEmployeeDepartmentHistory> outItems = new VList<VEmployeeDepartmentHistory>(); foreach(WsProxy.VEmployeeDepartmentHistory item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VSalesPerson> Convert(WsProxy.VSalesPerson[] items) { VList<VSalesPerson> outItems = new VList<VSalesPerson>(); foreach(WsProxy.VSalesPerson item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<TestIssue117Tablec> Convert(WsProxy.TestIssue117Tablec[] items) { Nettiers.AdventureWorks.Entities.TList<TestIssue117Tablec> outItems = new Nettiers.AdventureWorks.Entities.TList<TestIssue117Tablec>(); foreach(WsProxy.TestIssue117Tablec item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<CustomerAddress> Convert(WsProxy.CustomerAddress[] items) { Nettiers.AdventureWorks.Entities.TList<CustomerAddress> outItems = new Nettiers.AdventureWorks.Entities.TList<CustomerAddress>(); foreach(WsProxy.CustomerAddress item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<ErrorLog> Convert(WsProxy.ErrorLog[] items) { Nettiers.AdventureWorks.Entities.TList<ErrorLog> outItems = new Nettiers.AdventureWorks.Entities.TList<ErrorLog>(); foreach(WsProxy.ErrorLog item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<StateProvince> Convert(WsProxy.StateProvince[] items) { Nettiers.AdventureWorks.Entities.TList<StateProvince> outItems = new Nettiers.AdventureWorks.Entities.TList<StateProvince>(); foreach(WsProxy.StateProvince item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<Illustration> Convert(WsProxy.Illustration[] items) { Nettiers.AdventureWorks.Entities.TList<Illustration> outItems = new Nettiers.AdventureWorks.Entities.TList<Illustration>(); foreach(WsProxy.Illustration item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<SalesOrderDetail> Convert(WsProxy.SalesOrderDetail[] items) { Nettiers.AdventureWorks.Entities.TList<SalesOrderDetail> outItems = new Nettiers.AdventureWorks.Entities.TList<SalesOrderDetail>(); foreach(WsProxy.SalesOrderDetail item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<Department> Convert(WsProxy.Department[] items) { Nettiers.AdventureWorks.Entities.TList<Department> outItems = new Nettiers.AdventureWorks.Entities.TList<Department>(); foreach(WsProxy.Department item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<CountryRegionCurrency> Convert(WsProxy.CountryRegionCurrency[] items) { Nettiers.AdventureWorks.Entities.TList<CountryRegionCurrency> outItems = new Nettiers.AdventureWorks.Entities.TList<CountryRegionCurrency>(); foreach(WsProxy.CountryRegionCurrency item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<ProductSubcategory> Convert(WsProxy.ProductSubcategory[] items) { Nettiers.AdventureWorks.Entities.TList<ProductSubcategory> outItems = new Nettiers.AdventureWorks.Entities.TList<ProductSubcategory>(); foreach(WsProxy.ProductSubcategory item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VIndividualDemographics> Convert(WsProxy.VIndividualDemographics[] items) { VList<VIndividualDemographics> outItems = new VList<VIndividualDemographics>(); foreach(WsProxy.VIndividualDemographics item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<ShipMethod> Convert(WsProxy.ShipMethod[] items) { Nettiers.AdventureWorks.Entities.TList<ShipMethod> outItems = new Nettiers.AdventureWorks.Entities.TList<ShipMethod>(); foreach(WsProxy.ShipMethod item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<EmployeeDepartmentHistory> Convert(WsProxy.EmployeeDepartmentHistory[] items) { Nettiers.AdventureWorks.Entities.TList<EmployeeDepartmentHistory> outItems = new Nettiers.AdventureWorks.Entities.TList<EmployeeDepartmentHistory>(); foreach(WsProxy.EmployeeDepartmentHistory item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<PurchaseOrderHeader> Convert(WsProxy.PurchaseOrderHeader[] items) { Nettiers.AdventureWorks.Entities.TList<PurchaseOrderHeader> outItems = new Nettiers.AdventureWorks.Entities.TList<PurchaseOrderHeader>(); foreach(WsProxy.PurchaseOrderHeader item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static VList<VJobCandidateEducation> Convert(WsProxy.VJobCandidateEducation[] items) { VList<VJobCandidateEducation> outItems = new VList<VJobCandidateEducation>(); foreach(WsProxy.VJobCandidateEducation item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<SalesTerritoryHistory> Convert(WsProxy.SalesTerritoryHistory[] items) { Nettiers.AdventureWorks.Entities.TList<SalesTerritoryHistory> outItems = new Nettiers.AdventureWorks.Entities.TList<SalesTerritoryHistory>(); foreach(WsProxy.SalesTerritoryHistory item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<ProductReview> Convert(WsProxy.ProductReview[] items) { Nettiers.AdventureWorks.Entities.TList<ProductReview> outItems = new Nettiers.AdventureWorks.Entities.TList<ProductReview>(); foreach(WsProxy.ProductReview item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Convert a collection from the ws proxy to a nettiers collection. /// </summary> public static Nettiers.AdventureWorks.Entities.TList<SalesOrderHeaderSalesReason> Convert(WsProxy.SalesOrderHeaderSalesReason[] items) { Nettiers.AdventureWorks.Entities.TList<SalesOrderHeaderSalesReason> outItems = new Nettiers.AdventureWorks.Entities.TList<SalesOrderHeaderSalesReason>(); foreach(WsProxy.SalesOrderHeaderSalesReason item in items) { outItems.Add(Convert(item)); } return outItems; }
/// <summary> /// Proxies a request inside of a controller's method body from the request on the controller's route. /// </summary> /// <param name="controller">The ASP.NET <see cref="ControllerBase"/>.</param> /// <param name="wsEndpoint">The WS endpoint to use.</param> /// <param name="wsProxyOptions">The WS options.</param> /// <returns>A <see cref="Task"/> which completes when the request has been successfully proxied and written to the response.</returns> public static Task WsProxyAsync(this ControllerBase controller, string wsEndpoint, WsProxyOptions wsProxyOptions = null) { var wsProxy = new WsProxy((c, a) => new ValueTask <string>(wsEndpoint), wsProxyOptions); return(controller.HttpContext.ExecuteWsProxyOperationAsync(wsProxy)); }
public RunWatchers(WsProxy proxy) : base(proxy) { }
internal static async Task ExecuteWsProxyOperationAsync(this HttpContext context, WsProxy wsProxy) { var uri = await context.GetEndpointFromComputerAsync(wsProxy.EndpointComputer).ConfigureAwait(false); var options = wsProxy.Options; try { if (!context.WebSockets.IsWebSocketRequest) { throw new InvalidOperationException("An HTTP request cannot be routed as a WebSocket proxy operation."); } if (!uri.StartsWith("ws", StringComparison.OrdinalIgnoreCase)) { throw new InvalidOperationException("Only forwarded addresses starting with 'ws://' or 'ws://' are supported for WebSocket requests."); } // If `true`, this proxy call has been intercepted. if (options?.Intercept != null && await options.Intercept(context).ConfigureAwait(false)) { return; } using var socketToEndpoint = new ClientWebSocket(); foreach (var protocol in context.WebSockets.WebSocketRequestedProtocols) { socketToEndpoint.Options.AddSubProtocol(protocol); } foreach (var headerEntry in context.Request.Headers) { if (!Helpers.WebSocketNotForwardedHeaders.Contains(headerEntry.Key, StringComparer.OrdinalIgnoreCase)) { socketToEndpoint.Options.SetRequestHeader(headerEntry.Key, headerEntry.Value); } } if (options?.BeforeConnect != null) { await options.BeforeConnect(context, socketToEndpoint.Options).ConfigureAwait(false); } await socketToEndpoint.ConnectAsync(new Uri(uri), context.RequestAborted).ConfigureAwait(false); using var socketToClient = await context.WebSockets.AcceptWebSocketAsync(socketToEndpoint.SubProtocol).ConfigureAwait(false); var bufferSize = options?.BufferSize ?? 4096; await Task.WhenAll(PumpWebSocket(socketToEndpoint, socketToClient, bufferSize, context.RequestAborted), PumpWebSocket(socketToClient, socketToEndpoint, bufferSize, context.RequestAborted)).ConfigureAwait(false); } catch (Exception e) { if (!context.Response.HasStarted) { if (options?.HandleFailure == null) { // If the failures are not caught, then write a generic response. context.Response.StatusCode = 502 /* BAD GATEWAY */; await context.Response.WriteAsync($"Request could not be proxied.\n\n{e.Message}\n\n{e.StackTrace}").ConfigureAwait(false); return; } await options.HandleFailure(context, e).ConfigureAwait(false); } } }
protected WsProxy Proxy; // NB: <-- singleton protected WsStepAsync(WsProxy proxy) { Proxy = proxy; }