public async Task Invoke(HttpContext context) { if (_serviceProxy.Matches(context.Request)) { _logger.LogInformation($"{context.Request.Path}: Handling request using '{typeof(T)}'."); // Build Request var proxyRequest = CreateProxyRequest(context); _serviceProxy.ModifyRequest(context.Request, proxyRequest); //proxyRequest.Headers.Host = proxyRequest.RequestUri.Host; _logger.LogInformation($"{context.Request.Path}: Proxing request to '{proxyRequest.Method} {proxyRequest.RequestUri}'."); if (_logger.IsEnabled(LogLevel.Trace)) { var headers = proxyRequest.Headers.Concat(proxyRequest.Content?.Headers ?? Enumerable.Empty <KeyValuePair <string, IEnumerable <string> > >()); foreach (var(key, value) in headers) { _logger.LogTrace($"{context.Request.Path} Proxy request header '{key}': {string.Join(", ", value)}"); } } // Send Request using var responseMessage = await _httpClient.SendAsync(proxyRequest, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted); // Build our response. context.Response.StatusCode = (int)responseMessage.StatusCode; CopyFromTargetResponseHeaders(responseMessage, context); _serviceProxy.ModifyResponse(context.Request, context.Response); await using (var contentStream = await responseMessage.Content.ReadAsStreamAsync()) { var memoryStream = new MemoryStream(); await contentStream.CopyToAsync(memoryStream); _serviceProxy.ModifyResponseBody(context.Request, context.Response, memoryStream); memoryStream.Position = 0; await memoryStream.CopyToAsync(context.Response.Body); } context.Response.ContentLength = null; _logger.LogInformation($"{context.Request.Path}: Proxied with the result of '{context.Response.StatusCode}'."); return; } await _nextMiddleware(context); }