// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Xunit; namespace Microsoft.AspNetCore.Http.Extensions { public class UriHelperTests { [Fact] public void EncodeEmptyPartialUrl() { var result = UriHelper.BuildRelative(); Assert.Equal("/", result); } [Fact] public void EncodePartialUrl() { var result = UriHelper.BuildRelative(new PathString("/un?escaped/base"), new PathString("/un?escaped"), new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); Assert.Equal("/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); } [Fact] public void EncodeEmptyFullUrl() { var result = UriHelper.BuildAbsolute("http", new HostString(string.Empty)); Assert.Equal("http:///", result); } [Fact] public void EncodeFullUrl() { var result = UriHelper.BuildAbsolute("http", new HostString("my.HoΨst:80"), new PathString("/un?escaped/base"), new PathString("/un?escaped"), new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); } [Fact] public void GetEncodedUrlFromRequest() { var request = new DefaultHttpContext().Request; request.Scheme = "http"; request.Host = new HostString("my.HoΨst:80"); request.PathBase = new PathString("/un?escaped/base"); request.Path = new PathString("/un?escaped"); request.QueryString = new QueryString("?name=val%23ue"); Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue", request.GetEncodedUrl()); } [Fact] public void GetDisplayUrlFromRequest() { var request = new DefaultHttpContext().Request; request.Scheme = "http"; request.Host = new HostString("my.HoΨst:80"); request.PathBase = new PathString("/un?escaped/base"); 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()); } [Theory] [InlineData("http://example.com", "http", "example.com", "", "", "")] [InlineData("https://example.com", "https", "example.com", "", "", "")] [InlineData("http://example.com/foo/bar", "http", "example.com", "/foo/bar", "", "")] [InlineData("http://example.com/foo/bar?baz=1", "http", "example.com", "/foo/bar", "?baz=1", "")] [InlineData("http://example.com/foo#col=2", "http", "example.com", "/foo", "", "#col=2")] [InlineData("http://example.com/foo?bar=1#col=2", "http", "example.com", "/foo", "?bar=1", "#col=2")] [InlineData("http://example.com?bar=1#col=2", "http", "example.com", "", "?bar=1", "#col=2")] [InlineData("http://example.com#frag?stillfrag/stillfrag", "http", "example.com", "", "", "#frag?stillfrag/stillfrag")] [InlineData("http://example.com?q/stillq#frag?stillfrag/stillfrag", "http", "example.com", "", "?q/stillq", "#frag?stillfrag/stillfrag")] [InlineData("http://example.com/fo%23o#col=2", "http", "example.com", "/fo#o", "", "#col=2")] [InlineData("http://example.com/fo%3Fo#col=2", "http", "example.com", "/fo?o", "", "#col=2")] [InlineData("ftp://example.com/", "ftp", "example.com", "/", "", "")] [InlineData("https://127.0.0.0:80/bar", "https", "127.0.0.0:80", "/bar", "", "")] [InlineData("http://[1080:0:0:0:8:800:200C:417A]/index.html", "http", "[1080:0:0:0:8:800:200C:417A]", "/index.html", "", "")] [InlineData("http://example.com///", "http", "example.com", "///", "", "")] public void FromAbsoluteUriParsingChecks( string uri, string expectedScheme, string expectedHost, string expectedPath, string expectedQuery, string expectedFragment) { string scheme = null; var host = new HostString(); var path = new PathString(); var query = new QueryString(); var fragment = new FragmentString(); UriHelper.FromAbsolute(uri, out scheme, out host, out path, out query, out fragment); Assert.Equal(scheme, expectedScheme); Assert.Equal(host, new HostString(expectedHost)); Assert.Equal(path, new PathString(expectedPath)); Assert.Equal(query, new QueryString(expectedQuery)); Assert.Equal(fragment, new FragmentString(expectedFragment)); } [Fact] public void FromAbsoluteToBuildAbsolute() { var scheme = "http"; var host = new HostString("example.com"); var path = new PathString("/index.html"); var query = new QueryString("?foo=1"); var fragment = new FragmentString("#col=1"); var request = UriHelper.BuildAbsolute(scheme, host, path:path, query:query, fragment:fragment); string resScheme = null; var resHost = new HostString(); var resPath = new PathString(); var resQuery = new QueryString(); var resFragment = new FragmentString(); UriHelper.FromAbsolute(request, out resScheme, out resHost, out resPath, out resQuery, out resFragment); Assert.Equal(scheme, resScheme); Assert.Equal(host, resHost); Assert.Equal(path, resPath); Assert.Equal(query, resQuery); Assert.Equal(fragment, resFragment); } [Fact] public void BuildAbsoluteNullInputThrowsArgumentNullException() { var resHost = new HostString(); var resPath = new PathString(); var resQuery = new QueryString(); var resFragment = new FragmentString(); Assert.Throws(() => UriHelper.BuildAbsolute(null, resHost, resPath, resPath, resQuery, resFragment)); } [Fact] public void FromAbsoluteNullInputThrowsArgumentNullException() { string resScheme = null; var resHost = new HostString(); var resPath = new PathString(); var resQuery = new QueryString(); var resFragment = new FragmentString(); Assert.Throws(() => UriHelper.FromAbsolute(null, out resScheme, out resHost, out resPath, out resQuery, out resFragment)); } } }