public void AddProxyRule(ProxyRule rule) { ProxyRules.Add(rule); }
public static async Task HandleWebSocket(HttpContext context, HttpRequestMessage proxyRequest, ProxyRule proxyRule, CancellationToken token) { var outerWebSocket = await context.WebSockets.AcceptWebSocketAsync(); ClientWebSocket innerWebSocket = new ClientWebSocket(); var uri = new UriBuilder(proxyRequest.RequestUri) { Scheme = "ws" }; await innerWebSocket.ConnectAsync(uri.Uri, token); var forwardIncomingTask = ForwardIncoming(outerWebSocket, innerWebSocket, token); var forwardOutgoingTask = ForwardOutgoing(innerWebSocket, outerWebSocket, token); await forwardIncomingTask; await forwardOutgoingTask; }
private async Task ProxyTheRequest(HttpClient httpClient, HttpContext context, HttpRequestMessage proxyRequest, ProxyRule proxyRule, IEnumerable <string> headersToRemove) { using (var responseMessage = await httpClient.SendAsync(proxyRequest, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted)) { if (proxyRule.PreProcessResponse || proxyRule.ResponseModifier == null) { 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(); } foreach (var h in headersToRemove) { context.Response.Headers.Remove(h); } 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); } } if (proxyRule.ResponseModifier != null) { await proxyRule.ResponseModifier.Invoke(responseMessage, context); } } }
private async Task ProxyTheRequest(HttpContext context, HttpRequestMessage proxyRequest, ProxyRule proxyRule) { using (var responseMessage = await _httpClient.SendAsync(proxyRequest, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted)) { if (proxyRule.PreProcessResponse || proxyRule.ResponseModifier == null) { 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); } } if (proxyRule.ResponseModifier != null) { await proxyRule.ResponseModifier.Invoke(responseMessage, context); } } }
private async Task ProxyTheRequest(HttpContext context, HttpRequestMessage proxyRequest, ProxyRule proxyRule, ProxyResultBuilder resultBuilder) { using (var responseMessage = await _httpClient.SendAsync(proxyRequest, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted)) { if (proxyRule.PreProcessResponse || proxyRule.ResponseModifier == null) { 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(); } //this was throwing an exception attempting to add body on a 204 response. is there another way to check? if (responseMessage.StatusCode != HttpStatusCode.NoContent) { await responseMessage.Content.LoadIntoBufferAsync(); await responseMessage.Content.CopyToAsync(context.Response.Body); } } } if (proxyRule.ResponseModifier != null) { await proxyRule.ResponseModifier.Invoke(responseMessage, context); } await resultBuilder.HttpResponse(responseMessage); } }