Skip to content

Commit 5dc0d14

Browse files
authored
Handle relative referer headers similar to ASP.NET Framework (#547)
1 parent 2018b8d commit 5dc0d14

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

src/Microsoft.AspNetCore.SystemWebAdapters/HttpRequest.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,13 @@ public bool IsLocal
196196

197197
public string ApplicationPath => Request.HttpContext.RequestServices.GetRequiredService<IOptions<SystemWebAdaptersOptions>>().Value.AppDomainAppVirtualPath;
198198

199-
public Uri? UrlReferrer => TypedHeaders.Referer;
199+
// ASP.NET Framework would assume a relative referer is relative to the current app
200+
public Uri? UrlReferrer => TypedHeaders.Referer switch
201+
{
202+
{ IsAbsoluteUri: true } abs => abs,
203+
{ } relative => new Uri(Url, relative),
204+
null => null,
205+
};
200206

201207
public int TotalBytes => (int)InputStream.Length;
202208

test/Microsoft.AspNetCore.SystemWebAdapters.Tests/HttpRequestTests.cs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Web;
1313
using AutoFixture;
1414
using Microsoft.AspNetCore.Http;
15+
using Microsoft.AspNetCore.Http.Extensions;
1516
using Microsoft.AspNetCore.Http.Features;
1617
using Microsoft.AspNetCore.SystemWebAdapters.Features;
1718
using Microsoft.AspNetCore.SystemWebAdapters.Internal;
@@ -535,10 +536,52 @@ public void UrlReferrer()
535536
// Act
536537
var result = request.UrlReferrer;
537538

538-
// AssertexpectedResult
539+
// Assert
539540
Assert.Equal(new Uri(referrer), result);
540541
}
541542

543+
[Fact]
544+
public void UrlRelativeReferrer()
545+
{
546+
// Arrange
547+
var referrer = "/some-relative-url";
548+
var headers = new HeaderDictionary
549+
{
550+
{ HeaderNames.Referer, referrer },
551+
};
552+
553+
var coreRequest = new Mock<HttpRequestCore>();
554+
coreRequest.Setup(c => c.Scheme).Returns("https");
555+
coreRequest.Setup(c => c.Host).Returns(new HostString("microsoft.com"));
556+
coreRequest.Setup(c => c.Headers).Returns(headers);
557+
558+
var request = new HttpRequest(coreRequest.Object);
559+
560+
// Act
561+
var result = request.UrlReferrer;
562+
563+
// Assert
564+
Assert.NotNull(result);
565+
Assert.True(result.IsAbsoluteUri);
566+
Assert.Equal(new Uri("https://microsoft.com/some-relative-url"), result);
567+
}
568+
569+
[Fact]
570+
public void NoReferer()
571+
{
572+
// Arrange
573+
var coreRequest = new Mock<HttpRequestCore>();
574+
coreRequest.Setup(c => c.Headers).Returns(new HeaderDictionary());
575+
576+
var request = new HttpRequest(coreRequest.Object);
577+
578+
// Act
579+
var result = request.UrlReferrer;
580+
581+
// Assert
582+
Assert.Null(result);
583+
}
584+
542585
[Fact]
543586
public void TotalBytes()
544587
{

0 commit comments

Comments
 (0)