Skip to content

Commit 37fce36

Browse files
committed
Make OwinHttpRequestContext.VirtualPathRoot unescaped
- #203 - now consistent with other overrides of this property
1 parent f9577cb commit 37fce36

File tree

5 files changed

+95
-2
lines changed

5 files changed

+95
-2
lines changed

src/System.Web.Http.Owin/OwinHttpRequestContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public override string VirtualPathRoot
182182
{
183183
// Set the virtual path root for link resolution and link generation to work
184184
// OWIN spec requires request path base to be either the empty string or start with "/"
185-
string requestPathBase = _context.Request.PathBase.ToString();
185+
string requestPathBase = _context.Request.PathBase.Value;
186186
_virtualPathRoot = String.IsNullOrEmpty(requestPathBase) ? "/" : requestPathBase;
187187
_virtualPathRootSet = true;
188188
}

test/System.Web.Http.Owin.Test/OwinHttpRequestContextTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,30 @@ public void VirtualPathRootGet_ReturnsContextRequestPathBase()
564564
}
565565
}
566566

567+
// Regression test for #203.
568+
[Fact]
569+
public void VirtualPathRootGet_ReturnsUnescapedContextRequestPathBase()
570+
{
571+
// Arrange
572+
var expectedVirtualPathRoot = "/a b";
573+
var owinRequestMock = new Mock<IOwinRequest>(MockBehavior.Strict);
574+
owinRequestMock
575+
.Setup(r => r.PathBase)
576+
.Returns(new PathString(expectedVirtualPathRoot));
577+
578+
var owinContext = CreateStubOwinContext(owinRequestMock.Object);
579+
using (var request = CreateRequest())
580+
{
581+
var context = CreateProductUnderTest(owinContext, request);
582+
583+
// Act
584+
var virtualPathRoot = context.VirtualPathRoot;
585+
586+
// Assert
587+
Assert.Equal(expectedVirtualPathRoot, virtualPathRoot);
588+
}
589+
}
590+
567591
[Theory]
568592
[InlineData(null)]
569593
[InlineData("")]

test/System.Web.Http.SelfHost.Test/SelfHostHttpRequestContextTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,28 @@ public void VirtualPathRootGet_ReturnsConfigurationVirtualPathRoot()
580580
}
581581
}
582582

583+
[Theory]
584+
[InlineData("a b")]
585+
[InlineData("/a b")]
586+
[InlineData("/a%20b")]
587+
public void VirtualPathRootGet_ReturnsUnescapedConfigurationVirtualPathRoot(string configurationVirtualPathRoot)
588+
{
589+
// Arrange
590+
var expectedVirtualPathRoot = "/a b";
591+
using (var serviceModelContext = CreateStubServiceModelContext())
592+
using (var configuration = CreateConfiguration(configurationVirtualPathRoot))
593+
using (var request = CreateRequest())
594+
{
595+
var context = CreateProductUnderTest(serviceModelContext, configuration, request);
596+
597+
// Act
598+
var virtualPathRoot = context.VirtualPathRoot;
599+
600+
// Assert
601+
Assert.Equal(expectedVirtualPathRoot, virtualPathRoot);
602+
}
603+
}
604+
583605
[Fact]
584606
public void VirtualPathRootSet_UpdatesVirtualPathRoot()
585607
{

test/System.Web.Http.Test/Controllers/RequestBackedHttpRequestContextTests.cs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ public void VirtualPathRootGet_ReturnsConfigurationVirtualPathRoot_WhenConfigura
609609
{
610610
// Arrange
611611
string expectedVirtualPathRoot = "/";
612-
612+
613613
using (HttpConfiguration configuration = new HttpConfiguration(new HttpRouteCollection(
614614
expectedVirtualPathRoot)))
615615
{
@@ -624,6 +624,28 @@ public void VirtualPathRootGet_ReturnsConfigurationVirtualPathRoot_WhenConfigura
624624
}
625625
}
626626

627+
[Theory]
628+
[InlineData("a b")]
629+
[InlineData("/a b")]
630+
[InlineData("/a%20b")]
631+
public void VirtualPathRootGet_ReturnsUnescapedConfigurationVirtualPathRoot(string configurationVirtualPathRoot)
632+
{
633+
// Arrange
634+
var expectedVirtualPathRoot = "/a b";
635+
using (var routeCollection = new HttpRouteCollection(configurationVirtualPathRoot))
636+
using (var configuration = new HttpConfiguration(routeCollection))
637+
{
638+
var context = CreateProductUnderTest();
639+
context.Configuration = configuration;
640+
641+
// Act
642+
var virtualPathRoot = context.VirtualPathRoot;
643+
644+
// Assert
645+
Assert.Equal(expectedVirtualPathRoot, virtualPathRoot);
646+
}
647+
}
648+
627649
[Fact]
628650
public void VirtualPathRootGet_IgnoresConfiguration_AfterVirtualPathRootSet()
629651
{

test/System.Web.Http.WebHost.Test/WebHostHttpRequestContextTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,31 @@ public void VirtualPathRootGet_ReturnsConfigurationVirtualPathRoot()
753753
}
754754
}
755755

756+
[Theory]
757+
[InlineData("a b")]
758+
[InlineData("/a b")]
759+
[InlineData("/a%20b")]
760+
public void VirtualPathRootGet_ReturnsUnescapedConfigurationVirtualPathRoot(string configurationVirtualPathRoot)
761+
{
762+
// Arrange
763+
var expectedVirtualPathRoot = "/a b";
764+
var webContext = CreateDummyWebContext();
765+
var webRequest = CreateDummyWebRequest();
766+
767+
using (var request = CreateRequest())
768+
using (var configuration = CreateConfiguration(configurationVirtualPathRoot))
769+
{
770+
var context = CreateProductUnderTest(webContext, webRequest, request);
771+
context.Configuration = configuration;
772+
773+
// Act
774+
var virtualPathRoot = context.VirtualPathRoot;
775+
776+
// Assert
777+
Assert.Equal(expectedVirtualPathRoot, virtualPathRoot);
778+
}
779+
}
780+
756781
[Fact]
757782
public void VirtualPathRootSet_UpdatesVirtualPathRoot()
758783
{

0 commit comments

Comments
 (0)