public void AddProxyRule(ProxyRule rule)
 {
     ProxyRules.Add(rule);
 }
Beispiel #2
0
        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);
                }
            }
        }
Beispiel #5
0
        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);
            }
        }