Пример #1
0
        public Task <bool> ExecuteAsync(ProxyContext context)
        {
            var outgoingHeaders = context.Headers;
            var httpContext     = context.HttpContext;
            var httpRequest     = httpContext.Request;
            var options         = httpContext.RequestServices.GetRequiredService <IOptions <ProxyOptions> >().Value;

            var(success, redirection, matches) = options.GetBestRedirection(httpRequest.Path);
            if (success)
            {
                var replacements = PrepareReplacements(httpRequest, matches.Groups);

                context.DestinationUri = new Uri(Replace(redirection.Pass, replacements));

                foreach (var setHeader in redirection.SetHeaders)
                {
                    var headerValue = Replace(setHeader.Value, replacements);
                    outgoingHeaders.Add(setHeader.Key, headerValue);
                }
            }

            return(Task.FromResult(false));
        }
Пример #2
0
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost
        .CreateDefaultBuilder(args)
        .ConfigureServices((context, services) =>
        {
            ServicePointManager.DefaultConnectionLimit = 1024;
            services.Configure <ProxyOptions>(context.Configuration.GetSection("Proxy"));
            var client = new HttpClient(new HttpClientHandler {
                AllowAutoRedirect = false, UseCookies = false
            });
            client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("nc-proxy", "1"));
            services.AddSingleton(client);
        })
        .Configure((applicationBuilder) =>
                   applicationBuilder
                   .Run(async(context) =>
        {
            var proxyContext = new ProxyContext(context);
            foreach (var module in _modules)
            {
                var @continue = await module.ExecuteAsync(proxyContext).ConfigureAwait(false);
                if (!@continue)
                {
                    break;
                }
            }

            using (var requestMessage = proxyContext.CreateRequest())
            {
                AddConnectionLeaseTimeout(proxyContext.DestinationUri);
                using (var responseMessage = await context.SendProxyRequestAsync(requestMessage).ConfigureAwait(false))
                {
                    await context.CopyProxyResponseAsync(responseMessage).ConfigureAwait(false);
                }
            }
        }));