Skip to content

Commit a3eb8b4

Browse files
Make RedirectRule honor specified scheme (#41745)
Make RedirectRule honor specified scheme.
1 parent 2f4bd9b commit a3eb8b4

File tree

2 files changed

+33
-1
lines changed

2 files changed

+33
-1
lines changed

src/Middleware/Rewrite/src/RedirectRule.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ public void ApplyRule(RewriteContext context)
6565
{
6666
var host = default(HostString);
6767
var schemeSplit = newPath.IndexOf(Uri.SchemeDelimiter, StringComparison.Ordinal);
68+
string scheme = request.Scheme;
6869
if (schemeSplit >= 0)
6970
{
71+
scheme = newPath.Substring(0, schemeSplit);
7072
schemeSplit += Uri.SchemeDelimiter.Length;
7173
var pathSplit = newPath.IndexOf('/', schemeSplit);
7274

@@ -97,7 +99,7 @@ public void ApplyRule(RewriteContext context)
9799
}
98100

99101
encodedPath = host.HasValue
100-
? UriHelper.BuildAbsolute(request.Scheme, host, pathBase, resolvedPath, resolvedQuery, default)
102+
? UriHelper.BuildAbsolute(scheme, host, pathBase, resolvedPath, resolvedQuery, default)
101103
: UriHelper.BuildRelative(pathBase, resolvedPath, resolvedQuery, default);
102104
}
103105

src/Middleware/Rewrite/test/MiddlewareTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,36 @@ public async Task CheckRedirectToHttpsUrl(string baseAddress, string hostPathAnd
329329
Assert.Equal("https://" + expectedHostPathAndQuery, response.Headers.Location.OriginalString);
330330
}
331331

332+
[Theory]
333+
[InlineData("http://example.com/test", "http://www.example.com/")]
334+
[InlineData("http://example.com/test", "https://www.example.com/")]
335+
[InlineData("https://example.com/test", "http://www.example.com/")]
336+
[InlineData("https://example.com/test", "https://www.example.com/")]
337+
public async Task CheckRedirectUsesConfiguredScheme(string hostSchemePathAndQuery, string redirectReplacement)
338+
{
339+
var options = new RewriteOptions().AddRedirect("test", redirectReplacement);
340+
using var host = new HostBuilder()
341+
.ConfigureWebHost(webHostBuilder =>
342+
{
343+
webHostBuilder
344+
.UseTestServer()
345+
.Configure(app =>
346+
{
347+
app.UseRewriter(options);
348+
});
349+
}).Build();
350+
351+
await host.StartAsync();
352+
353+
var server = host.GetTestServer();
354+
server.BaseAddress = new Uri("http://example.com");
355+
var response = await server.CreateClient().GetAsync(new Uri(hostSchemePathAndQuery));
356+
357+
// Regardless of whether we GET with http or https, the redirect should honor
358+
// the scheme specified in the configuration.
359+
Assert.Equal(redirectReplacement, response.Headers.Location.OriginalString);
360+
}
361+
332362
[Fact]
333363
public async Task CheckPermanentRedirectToHttps()
334364
{

0 commit comments

Comments
 (0)