Exemple #1
0
        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);
        }