From 45b0d0d0de331b347a73e62b90dc73b2b38d6db8 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Mon, 3 Jun 2019 22:31:38 -0700 Subject: [PATCH] Save condition backcollection between runs (#10776) --- .../ApacheModRewrite/ApacheModRewriteRule.cs | 6 +++-- .../ModRewriteMiddlewareTest.cs | 22 ++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Middleware/Rewrite/src/Internal/ApacheModRewrite/ApacheModRewriteRule.cs b/src/Middleware/Rewrite/src/Internal/ApacheModRewrite/ApacheModRewriteRule.cs index 32be7fe80d..04abcb1221 100644 --- a/src/Middleware/Rewrite/src/Internal/ApacheModRewrite/ApacheModRewriteRule.cs +++ b/src/Middleware/Rewrite/src/Internal/ApacheModRewrite/ApacheModRewriteRule.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; @@ -39,6 +39,8 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite context.Logger?.ModRewriteNotMatchedRule(); return; } + + condBackReferences = condResult.BackReferences; } // At this point, we know our rule passed, first apply pre conditions, @@ -51,4 +53,4 @@ namespace Microsoft.AspNetCore.Rewrite.Internal.ApacheModRewrite } } } -} \ No newline at end of file +} diff --git a/src/Middleware/Rewrite/test/ApacheModRewrite/ModRewriteMiddlewareTest.cs b/src/Middleware/Rewrite/test/ApacheModRewrite/ModRewriteMiddlewareTest.cs index f22f340f18..67deba236d 100644 --- a/src/Middleware/Rewrite/test/ApacheModRewrite/ModRewriteMiddlewareTest.cs +++ b/src/Middleware/Rewrite/test/ApacheModRewrite/ModRewriteMiddlewareTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -308,5 +308,25 @@ namespace Microsoft.AspNetCore.Rewrite.Tests.ModRewrite Assert.Equal("/foo", response.Headers.Location.OriginalString); } + + [Fact] + public async Task CapturedVariablesInConditionsArePreservedToRewriteRule() + { + var options = new RewriteOptions().AddApacheModRewrite(new StringReader(@"RewriteCond %{REQUEST_URI} /home +RewriteCond %{QUERY_STRING} report_id=(.+) +RewriteRule (.*) http://localhost:80/home/report/%1 [R=301,L,QSD]")); + var builder = new WebHostBuilder().Configure(app => + { + app.UseRewriter(options); + app.Run(context => context.Response.WriteAsync( + context.Request.Path + + context.Request.QueryString)); + }); + + var server = new TestServer(builder) { BaseAddress = new Uri("http://localhost:5000/foo") }; + var response = await server.CreateClient().GetAsync("/home?report_id=123"); + + Assert.Equal("http://localhost:80/home/report/123", response.Headers.Location.OriginalString); + } } }