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"); }); }
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))); }
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))); }