public async Task Invoke(HttpContext context) { var uri = GeRequestUri(context); var resultBuilder = new ProxyResultBuilder(uri); var matchedRule = _options.ProxyRules.FirstOrDefault(r => r.Matcher(uri)); if (matchedRule == null) { await _next(context); _options.Reporter.Invoke(resultBuilder.NotProxied(context.Response.StatusCode)); return; } if (matchedRule.RequiresAuthentication && !UserIsAuthenticated(context)) { AuthenticateResult authResult = AuthenticateResult.Fail("Authentication failure"); foreach (var authScheme in matchedRule.AuthenticationSchemes) { authResult = await context.AuthenticateAsync(authScheme); if (authResult.Succeeded) { context.User = authResult.Principal; break; } } if (!authResult.Succeeded) { context.Response.StatusCode = StatusCodes.Status401Unauthorized; _options.Reporter.Invoke(resultBuilder.NotAuthenticated()); return; } } var proxyRequest = new HttpRequestMessage(new HttpMethod(context.Request.Method), uri); SetProxyRequestBody(proxyRequest, context); SetProxyRequestHeaders(proxyRequest, context); matchedRule.Modifier(proxyRequest, context.User); proxyRequest.Headers.Host = !proxyRequest.RequestUri.IsDefaultPort ? $"{proxyRequest.RequestUri.Host}:{proxyRequest.RequestUri.Port}" : proxyRequest.RequestUri.Host; try { await ProxyTheRequest(context, proxyRequest, matchedRule); } catch (HttpRequestException) { context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; } _options.Reporter.Invoke(resultBuilder.Proxied(proxyRequest.RequestUri, context.Response.StatusCode)); }
public async Task Invoke(HttpContext context) { var uri = GeRequestUri(context); var resultBuilder = new ProxyResultBuilder(uri); var matchedRule = _options.ProxyRules.FirstOrDefault(r => r.Matcher.Invoke(uri)); if (matchedRule == null) { await _next(context); _options.Reporter.Invoke(resultBuilder.NotProxied(context.Response.StatusCode)); return; } if (matchedRule.RequiresAuthentication && !UserIsAuthenticated(context)) { context.Response.StatusCode = StatusCodes.Status401Unauthorized; _options.Reporter.Invoke(resultBuilder.NotAuthenticated()); return; } var proxyRequest = new HttpRequestMessage(new HttpMethod(context.Request.Method), uri); SetProxyRequestBody(proxyRequest, context); SetProxyRequestHeaders(proxyRequest, context); matchedRule.Modifier.Invoke(proxyRequest, context.User); proxyRequest.Headers.Host = proxyRequest.RequestUri.Host; if (proxyRequest.Content != null) { await proxyRequest.Content.LoadIntoBufferAsync(); } await resultBuilder.HttpRequest(proxyRequest); try { await ProxyTheRequest(context, proxyRequest, matchedRule, resultBuilder); } catch (HttpRequestException) { context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; } _options.Reporter.Invoke(resultBuilder.Proxied(proxyRequest.RequestUri, context.Response.StatusCode)); }
public async Task Invoke(HttpContext context) { var uri = GeRequestUri(context); var resultBuilder = new ProxyResultBuilder(uri); var matchedRule = _options.ProxyRules.FirstOrDefault(r => r.Matcher.Invoke(uri)); if (matchedRule == null) { await _next(context); _options.Reporter?.Invoke(resultBuilder.NotProxied(context.Response.StatusCode)); return; } if (matchedRule.RequiresAuthentication && !UserIsAuthenticated(context)) { context.Response.StatusCode = StatusCodes.Status401Unauthorized; _options.Reporter?.Invoke(resultBuilder.NotAuthenticated()); return; } var proxyRequest = new HttpRequestMessage(new HttpMethod(context.Request.Method), uri); var client = matchedRule.GetClient != null?matchedRule.GetClient(context.Request, context.User) : _httpClient; SetProxyRequestBody(proxyRequest, context); SetProxyRequestHeaders(proxyRequest, context); matchedRule.Modifier.Invoke(proxyRequest, context.User); proxyRequest.Headers.Host = !proxyRequest.RequestUri.IsDefaultPort ? $"{proxyRequest.RequestUri.Host}:{proxyRequest.RequestUri.Port}" : proxyRequest.RequestUri.Host; try { await ProxyTheRequest(client, context, proxyRequest, matchedRule, matchedRule.HeadersToRemove); } catch (HttpRequestException err) { matchedRule.ErrorHandler?.Invoke(err); context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; } _options.Reporter?.Invoke(resultBuilder.Proxied(proxyRequest.RequestUri, context.Response.StatusCode)); }