157 lines
6.8 KiB
C#
157 lines
6.8 KiB
C#
// 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<ArgumentNullException>(() => 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<ArgumentNullException>(() => UriHelper.FromAbsolute(null, out resScheme, out resHost, out resPath, out resQuery, out resFragment));
|
|
|
|
}
|
|
}
|
|
}
|