diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index 633e591186..a6b5846a7d 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -195,17 +195,18 @@ namespace Microsoft.AspNetCore.Http.Extensions /// public static string GetDisplayUrl(this HttpRequest request) { - var host = request.Host.Value; - var pathBase = request.PathBase.Value; - var path = request.Path.Value; - var queryString = request.QueryString.Value; + var scheme = request.Scheme ?? string.Empty; + var host = request.Host.Value ?? string.Empty; + var pathBase = request.PathBase.Value ?? string.Empty; + var path = request.Path.Value ?? string.Empty; + var queryString = request.QueryString.Value ?? string.Empty; // PERF: Calculate string length to allocate correct buffer size for StringBuilder. - var length = request.Scheme.Length + SchemeDelimiter.Length + host.Length + var length = scheme.Length + SchemeDelimiter.Length + host.Length + pathBase.Length + path.Length + queryString.Length; return new StringBuilder(length) - .Append(request.Scheme) + .Append(scheme) .Append(SchemeDelimiter) .Append(host) .Append(pathBase) diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index 11b045af4f..ba604d576e 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -55,17 +55,19 @@ namespace Microsoft.AspNetCore.Http.Extensions Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue", request.GetEncodedUrl()); } - [Fact] - public void GetDisplayUrlFromRequest() + [Theory] + [InlineData("/un?escaped/base")] + [InlineData(null)] + public void GetDisplayUrlFromRequest(string pathBase) { var request = new DefaultHttpContext().Request; request.Scheme = "http"; request.Host = new HostString("my.HoΨst:80"); - request.PathBase = new PathString("/un?escaped/base"); + request.PathBase = new PathString(pathBase); request.Path = new PathString("/un?escaped"); request.QueryString = new QueryString("?name=val%23ue"); - Assert.Equal("http://my.hoψst:80/un?escaped/base/un?escaped?name=val%23ue", request.GetDisplayUrl()); + Assert.Equal("http://my.hoψst:80" + pathBase + "/un?escaped?name=val%23ue", request.GetDisplayUrl()); } [Theory]