Skip to content

Commit a849c80

Browse files
authored
Fix the RedirectHandler (in Mvc.Testing) for relative URIs (dotnet#41742)
This was a case of double bugs cancelling each other. The `Testing/RedirectHandler/Redirect303` route was redirecting to `Testing/Builder` instead of `/Testing/Builder`, hiding the fact that the relative URL in the RedirectHandler was not handled properly. A new test covering relative URLs has been added.
1 parent 0af1274 commit a849c80

File tree

4 files changed

+34
-5
lines changed

4 files changed

+34
-5
lines changed

src/Mvc/Mvc.Testing/src/Handlers/RedirectHandler.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,7 @@ private static void UpdateRedirectRequest(
144144
{
145145
if (!location.IsAbsoluteUri && response.RequestMessage.RequestUri is Uri requestUri)
146146
{
147-
location = new Uri(
148-
new Uri(requestUri.GetLeftPart(UriPartial.Authority)),
149-
location);
147+
location = new Uri(requestUri, location);
150148
}
151149

152150
redirect.RequestUri = location;

src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,19 @@ public async Task TestingInfrastructure_RedirectHandlerUsesOriginalRequestHeader
109109
Assert.Equal("false", modifiedHeaderWasSent);
110110
}
111111

112+
[Fact]
113+
public async Task TestingInfrastructure_RedirectHandlerHandlesRelativeLocation()
114+
{
115+
// Act
116+
var request = new HttpRequestMessage(HttpMethod.Get, "Testing/RedirectHandler/Relative/");
117+
var client = Factory.CreateDefaultClient(
118+
new RedirectHandler());
119+
var response = await client.SendAsync(request);
120+
121+
// Assert
122+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
123+
}
124+
112125
[Fact]
113126
public async Task TestingInfrastructure_RedirectHandlerFollowsStatusCode303()
114127
{

src/Mvc/test/WebSites/BasicWebSite/Controllers/TestingController.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,19 @@ public IActionResult RedirectHandlerHeadersRedirect()
7777
}
7878
}
7979

80+
[HttpGet("Testing/RedirectHandler/Relative/")]
81+
public IActionResult RedirectHandlerRelative()
82+
{
83+
return Redirect("Ok");
84+
}
85+
86+
[HttpGet("Testing/RedirectHandler/Relative/Ok")]
87+
public IActionResult RedirectHandlerRelativeOk() => Ok();
88+
8089
[HttpGet("Testing/RedirectHandler/Redirect303")]
8190
public IActionResult RedirectHandlerStatusCode303()
8291
{
83-
return new RedirectUsingStatusCode("Testing/Builder", HttpStatusCode.SeeOther);
92+
return new RedirectUsingStatusCode("/Testing/Builder", HttpStatusCode.SeeOther);
8493
}
8594

8695
public class RedirectUsingStatusCode : ActionResult

src/Mvc/test/WebSites/GenericHostWebSite/Controllers/TestingController.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,19 @@ public IActionResult RedirectHandlerHeadersRedirect()
6363
}
6464
}
6565

66+
[HttpGet("Testing/RedirectHandler/Relative/")]
67+
public IActionResult RedirectHandlerRelative()
68+
{
69+
return Redirect("Ok");
70+
}
71+
72+
[HttpGet("Testing/RedirectHandler/Relative/Ok")]
73+
public IActionResult RedirectHandlerRelativeOk() => Ok();
74+
6675
[HttpGet("Testing/RedirectHandler/Redirect303")]
6776
public IActionResult RedirectHandlerStatusCode303()
6877
{
69-
return new RedirectUsingStatusCode("Testing/Builder", HttpStatusCode.SeeOther);
78+
return new RedirectUsingStatusCode("/Testing/Builder", HttpStatusCode.SeeOther);
7079
}
7180

7281
public class RedirectUsingStatusCode : ActionResult

0 commit comments

Comments
 (0)