From 187e89f6f0ee67728a50f987d63234c1900130fd Mon Sep 17 00:00:00 2001 From: Filip W Date: Tue, 30 Oct 2018 20:32:26 +0100 Subject: [PATCH] Do not throw a null reference from request.GetDisplayUrl() (#1057) --- .../UriHelper.cs | 13 +++++++------ .../UriHelperTests.cs | 10 ++++++---- 2 files changed, 13 insertions(+), 10 deletions(-) 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]