diff --git a/Modules/ReverseProxy/Http/HttpProxy.cs b/Modules/ReverseProxy/Http/HttpProxy.cs index fc60f8754..4c51242f5 100644 --- a/Modules/ReverseProxy/Http/HttpProxy.cs +++ b/Modules/ReverseProxy/Http/HttpProxy.cs @@ -91,6 +91,14 @@ private HttpRequestMessage ConfigureRequest(IRequest request) var req = new HttpRequestMessage(new HttpMethod(request.Header.Method.ToString()), GetRequestUri(request)); + // important: set the body before the header so we can override "Content-" related headers here + var content = request.GetBody(); + + if (content is not null && CanSendBody(request)) + { + req.Content = new RequestBody(content); + } + for (var i = 0; i < headers.Count; i++) { var header = headers.GetStringEntry(i); @@ -119,13 +127,6 @@ private HttpRequestMessage ConfigureRequest(IRequest request) req.Headers.Add("Forwarded", string.Join(", ", forwardings.Select(GetForwarding))); - var content = request.GetBody(); - - if (content is not null && CanSendBody(request)) - { - req.Content = new RequestBody(content); - } - return req; } diff --git a/Testing/Acceptance/Modules/ReverseProxy/ReverseProxyTests.cs b/Testing/Acceptance/Modules/ReverseProxy/ReverseProxyTests.cs index 625c95f6f..811fd3d01 100644 --- a/Testing/Acceptance/Modules/ReverseProxy/ReverseProxyTests.cs +++ b/Testing/Acceptance/Modules/ReverseProxy/ReverseProxyTests.cs @@ -63,6 +63,26 @@ public async Task TestHead(ServerEngine engine) await headed.AssertStatusAsync(HttpStatusCode.OK); } + [TestMethod] + [MultiEngineTest] + public async Task TestContentTypeIsRelayed(ServerEngine engine) + { + await using var setup = await TestSetup.CreateAsync(engine, r => + { + var contentType = r.Header.Headers.GetEntry("Content-Type"); + return r.Respond().Content(contentType ?? "(none)").Build(); + }); + + var runner = setup.Runner; + + var request = runner.GetRequest(method: new HttpMethod("SEARCH")); + request.Content = new StringContent("", System.Text.Encoding.UTF8, "application/xml"); + + using var response = await runner.GetResponseAsync(request); + + Assert.AreEqual("application/xml; charset=utf-8", await response.GetContentAsync()); + } + [TestMethod] [MultiEngineTest] public async Task TestForwardingChainIsRelayed(ServerEngine engine)