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)); }
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); } } }));