From 3041d0230eec9b761b7c98087d6880d098ecbf72 Mon Sep 17 00:00:00 2001 From: Xin Li Date: Tue, 7 Mar 2023 13:28:05 +0800 Subject: [PATCH] Proxy Http Reason Phase --- src/Core/Extensions/Http.cs | 8 ++++++++ src/Test/Http/HttpHelpers.cs | 26 ++++++++++++++++++++++++++ src/Test/Http/HttpIntegrationTests.cs | 9 +++++++++ 3 files changed, 43 insertions(+) diff --git a/src/Core/Extensions/Http.cs b/src/Core/Extensions/Http.cs index 3aade0e..439f1ff 100644 --- a/src/Core/Extensions/Http.cs +++ b/src/Core/Extensions/Http.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using AspNetCore.Proxy.Builders; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.DependencyInjection; namespace AspNetCore.Proxy @@ -124,6 +125,13 @@ private static Task WriteProxiedHttpResponseAsync(this HttpContext context, Http var response = context.Response; response.StatusCode = (int)responseMessage.StatusCode; + + var httpResponseFeature = context.Features.Get(); + if (httpResponseFeature != null) + { + httpResponseFeature.ReasonPhrase = responseMessage.ReasonPhrase; + } + foreach (var header in responseMessage.Headers) { response.Headers[header.Key] = header.Value.ToArray(); diff --git a/src/Test/Http/HttpHelpers.cs b/src/Test/Http/HttpHelpers.cs index d20e3dd..58782d3 100644 --- a/src/Test/Http/HttpHelpers.cs +++ b/src/Test/Http/HttpHelpers.cs @@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection; using AspNetCore.Proxy.Options; using System.Diagnostics.CodeAnalysis; +using Microsoft.AspNetCore.Http.Features; [assembly: SuppressMessage("Readability", "RCS1090", Justification = "Not a library, so no need for `ConfigureAwait`.")] @@ -143,6 +144,31 @@ public Task GetWithCustomResponse(int postId) return this.HttpProxyAsync($"https://jsonplaceholder.typicode.com/posts/{postId}", options); } + [Route("api/controller/customreasonphase")] + public void GetWithCustomReasonPhase(int postId) + { + } + + [Route("api/controller/customreasonphase/proxy")] + public Task GetWithCustomReasonPhase() + { + var options = HttpProxyOptionsBuilder.Instance.WithIntercept( + async (ctx) => + { + var httpResponseFeature = ctx.Features.Get(); + if (httpResponseFeature != null) + { + httpResponseFeature.ReasonPhrase = "I am dummy!"; + } + + return true; + + }).Build(); + + return this.HttpProxyAsync("https://postman-echo.com/post", options); + } + + [Route("api/controller/timeoutclient/{postId}")] public Task GetWithTimeoutClient(int postId) { diff --git a/src/Test/Http/HttpIntegrationTests.cs b/src/Test/Http/HttpIntegrationTests.cs index 6894779..b94dd45 100644 --- a/src/Test/Http/HttpIntegrationTests.cs +++ b/src/Test/Http/HttpIntegrationTests.cs @@ -206,6 +206,15 @@ public async Task CanGetIntercept() Assert.Equal("This was intercepted and not proxied!", await response.Content.ReadAsStringAsync()); } + [Fact] + public async Task CanProxyReasonPhase() + { + var response = await _client.GetAsync("api/controller/customreasonphase/proxy"); + + response.EnsureSuccessStatusCode(); + Assert.Equal("I am dummy!", response.ReasonPhrase); + } + [Fact] public async Task CanProxyConcurrentCalls() {