예제 #1
0
        /// <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;
		}
예제 #32
0
        /// <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));
        }
예제 #33
0
 public RunWatchers(WsProxy proxy) : base(proxy)
 {
 }
예제 #34
0
        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);
                }
            }
        }
예제 #35
0
        protected WsProxy Proxy; // NB: <-- singleton

        protected WsStepAsync(WsProxy proxy)
        {
            Proxy = proxy;
        }