示例#1
0
        private Func <Task <HttpResponseMessage>, HttpResponseMessage> ContinuationFunction(HttpClient client, HttpContentHeaders contentHeaders, Route route, Models.Routing routing)
        {
            return(task =>
            {
                client.Dispose();

                if (task.IsCanceled)
                {
                    _proxyLogging.LogResponseCancelled(route, client.DefaultRequestHeaders, contentHeaders, task.Exception);
                    if (route.IsPrimary)
                    {
                        //Will display underlying exception
                        return task.Result;
                    }
                    return null;
                }

                if (task.IsFaulted)
                {
                    _proxyLogging.LogResponseFaulted(route, client.DefaultRequestHeaders, contentHeaders, task.Exception);
                    if (route.IsPrimary)
                    {
                        //Will display underlying exception
                        return task.Result;
                    }
                    return null;
                }

                if (task.IsCompleted)
                {
                    var memoryStream = new MemoryStream();
                    var encoding = System.Text.Encoding.UTF8;

                    int replacements = SearchReplace(task.Result.Content.ReadAsStreamAsync().Result, memoryStream,
                                                     encoding.GetBytes(routing.RewriteFrom.ToLower()), encoding.GetBytes(routing.RewriteTo));

                    _proxyLogging.LogResponseContent(new MemoryStream(memoryStream.GetBuffer()), route.Identifier);

                    if (route.IsPrimary)
                    {
                        var result = new HttpResponseMessage(task.Result.StatusCode);
                        result.Headers.Clear();

                        result.Headers.Add("X-Response-From", route.Uri.ToString());

                        // May be useful for debugging
                        //result.Headers.Add("X-MemoryStream-Length", $"{memoryStream.Length}");
                        result.Headers.Add("X-Replacement", $"{routing.RewriteFrom} to {routing.RewriteTo}: {replacements}");

                        result.Content = new ByteArrayContent(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
                        result.Content.Headers.Add("Content-Length", $"{memoryStream.Length}");
                        foreach (var header in task.Result.Content.Headers)
                        {
                            if (!result.Content.Headers.Contains(header.Key))
                            {
                                result.Content.Headers.Add(header.Key, header.Value);
                            }
                        }

                        return result;
                    }
                    else
                    {
                        return null;
                    }
                }

                throw new Exception("Unhandled");
            });
        }
示例#2
0
        private Task <HttpResponseMessage> GetAsyncRequest(HttpRequestMessage request, Route route, Models.Routing routing)
        {
            var client = RoutingHttpClientFactory.Create(request, route.Uri);

            return(client.GetAsync(route.Uri).ContinueWith(ContinuationFunction(client, null, route, routing)));
        }
示例#3
0
        private Task <HttpResponseMessage> PostAsyncRequest(HttpRequestMessage request, HttpContent requestHttpContent, Route route, Models.Routing routing)
        {
            var client         = RoutingHttpClientFactory.Create(request, route.Uri);
            var contentHeaders = request.Content?.Headers;

            return(client.PostAsync(route.Uri, requestHttpContent).ContinueWith(ContinuationFunction(client, contentHeaders, route, routing)));
        }