private async Task ProxyTheRequest(HttpContext context, HttpRequestMessage proxyRequest, IProxyRule proxyRule) { using (var responseMessage = await _httpClient.SendAsync(proxyRequest, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted)) { if (proxyRule.PreProcessResponse) { context.Response.StatusCode = (int)responseMessage.StatusCode; context.Response.ContentType = responseMessage.Content?.Headers.ContentType?.MediaType; foreach (var header in responseMessage.Headers) { context.Response.Headers[header.Key] = header.Value.ToArray(); } // SendAsync removes chunking from the response. // This removes the header so it doesn't expect a chunked response. context.Response.Headers.Remove("transfer-encoding"); if (responseMessage.Content != null) { foreach (var contentHeader in responseMessage.Content.Headers) { context.Response.Headers[contentHeader.Key] = contentHeader.Value.ToArray(); } await responseMessage.Content.CopyToAsync(context.Response.Body); } } await proxyRule.ResponseModifier(responseMessage, context); } }
public void AddProxyRule(IProxyRule rule) { ProxyRules.Add(rule); }