From 190e394011e8b18860780a913f27c4f63e86a968 Mon Sep 17 00:00:00 2001 From: "tom.pallister" Date: Wed, 2 Nov 2016 20:22:07 +0000 Subject: [PATCH] now returns response content headers --- .../DownstreamRouteFinderMiddleware.cs | 2 +- src/Ocelot/Headers/RemoveOutputHeaders.cs | 7 ++++--- src/Ocelot/Responder/HttpContextResponder.cs | 19 +++++++++++++++++-- ...RemoveHeaders.cs => RemoveHeadersTests.cs} | 4 ++-- 4 files changed, 24 insertions(+), 8 deletions(-) rename test/Ocelot.UnitTests/Headers/{RemoveHeaders.cs => RemoveHeadersTests.cs} (95%) diff --git a/src/Ocelot/DownstreamRouteFinder/Middleware/DownstreamRouteFinderMiddleware.cs b/src/Ocelot/DownstreamRouteFinder/Middleware/DownstreamRouteFinderMiddleware.cs index 7c8b12ed..c25c655c 100644 --- a/src/Ocelot/DownstreamRouteFinder/Middleware/DownstreamRouteFinderMiddleware.cs +++ b/src/Ocelot/DownstreamRouteFinder/Middleware/DownstreamRouteFinderMiddleware.cs @@ -21,7 +21,7 @@ namespace Ocelot.DownstreamRouteFinder.Middleware } public async Task Invoke(HttpContext context) - { + { var upstreamUrlPath = context.Request.Path.ToString(); var downstreamRoute = _downstreamRouteFinder.FindDownstreamRoute(upstreamUrlPath, context.Request.Method); diff --git a/src/Ocelot/Headers/RemoveOutputHeaders.cs b/src/Ocelot/Headers/RemoveOutputHeaders.cs index c683bd39..7a40534b 100644 --- a/src/Ocelot/Headers/RemoveOutputHeaders.cs +++ b/src/Ocelot/Headers/RemoveOutputHeaders.cs @@ -3,6 +3,8 @@ using Ocelot.Responses; namespace Ocelot.Headers { + using System; + public class RemoveOutputHeaders : IRemoveOutputHeaders { /// @@ -10,14 +12,13 @@ namespace Ocelot.Headers /// in a given context such as transfer encoding chunked when ASP.NET is not /// returning the response in this manner /// - private readonly string[] _unsupportedHeaders = + private readonly string[] _unsupportedRequestHeaders = { "Transfer-Encoding" }; - public Response Remove(HttpResponseHeaders headers) { - foreach (var unsupported in _unsupportedHeaders) + foreach (var unsupported in _unsupportedRequestHeaders) { headers.Remove(unsupported); } diff --git a/src/Ocelot/Responder/HttpContextResponder.cs b/src/Ocelot/Responder/HttpContextResponder.cs index abc9e834..cd989cbd 100644 --- a/src/Ocelot/Responder/HttpContextResponder.cs +++ b/src/Ocelot/Responder/HttpContextResponder.cs @@ -9,6 +9,8 @@ using Ocelot.Responses; namespace Ocelot.Responder { + using System.Collections.Generic; + /// /// Cannot unit test things in this class due to methods not being implemented /// on .net concretes used for testing @@ -28,12 +30,17 @@ namespace Ocelot.Responder foreach (var httpResponseHeader in response.Headers) { - context.Response.Headers.Add(httpResponseHeader.Key, new StringValues(httpResponseHeader.Value.ToArray())); + AddHeaderIfDoesntExist(context, httpResponseHeader); + } + + foreach (var httpResponseHeader in response.Content.Headers) + { + AddHeaderIfDoesntExist(context, httpResponseHeader); } var content = await response.Content.ReadAsStreamAsync(); - context.Response.Headers.Add("Content-Length", new[] { content.Length.ToString() }); + AddHeaderIfDoesntExist(context, new KeyValuePair>("Content-Length", new []{ content.Length.ToString() }) ); context.Response.OnStarting(state => { @@ -54,6 +61,14 @@ namespace Ocelot.Responder return new OkResponse(); } + private static void AddHeaderIfDoesntExist(HttpContext context, KeyValuePair> httpResponseHeader) + { + if (!context.Response.Headers.ContainsKey(httpResponseHeader.Key)) + { + context.Response.Headers.Add(httpResponseHeader.Key, new StringValues(httpResponseHeader.Value.ToArray())); + } + } + public async Task SetErrorResponseOnContext(HttpContext context, int statusCode) { context.Response.OnStarting(x => diff --git a/test/Ocelot.UnitTests/Headers/RemoveHeaders.cs b/test/Ocelot.UnitTests/Headers/RemoveHeadersTests.cs similarity index 95% rename from test/Ocelot.UnitTests/Headers/RemoveHeaders.cs rename to test/Ocelot.UnitTests/Headers/RemoveHeadersTests.cs index 784f89aa..7a7bd4cc 100644 --- a/test/Ocelot.UnitTests/Headers/RemoveHeaders.cs +++ b/test/Ocelot.UnitTests/Headers/RemoveHeadersTests.cs @@ -7,13 +7,13 @@ using Xunit; namespace Ocelot.UnitTests.Headers { - public class RemoveHeaders + public class RemoveHeadersTests { private HttpResponseHeaders _headers; private readonly Ocelot.Headers.RemoveOutputHeaders _removeOutputHeaders; private Response _result; - public RemoveHeaders() + public RemoveHeadersTests() { _removeOutputHeaders = new Ocelot.Headers.RemoveOutputHeaders(); }