// 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 System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Net.Http.Headers;
using Xunit;
namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite
{
public class MiddlewareTests
{
[Fact]
public async Task Invoke_RedirectPathToPathAndQuery()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
app.Run(context => context.Response.WriteAsync(context.Response.Headers[HeaderNames.Location]));
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetAsync("article/10/hey");
Assert.Equal(response.Headers.Location.OriginalString, "/article.aspx?id=10&title=hey");
}
[Fact]
public async Task Invoke_RewritePathToPathAndQuery()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
app.Run(context => context.Response.WriteAsync(context.Request.Path + context.Request.QueryString));
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetStringAsync("/article/10/hey");
Assert.Equal(response, "/article.aspx?id=10&title=hey");
}
[Fact]
public async Task Invoke_RewriteBasedOnQueryStringParameters()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
app.Run(context => context.Response.WriteAsync(context.Request.Path + context.Request.QueryString));
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetStringAsync("page.asp?p2=321&p1=123");
Assert.Equal(response, "/newpage.aspx?param1=123¶m2=321");
}
[Fact]
public async Task Invoke_RedirectToLowerCase()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
app.Run(context => context.Response.WriteAsync(context.Response.Headers[HeaderNames.Location]));
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetAsync("HElLo");
Assert.Equal(response.Headers.Location.OriginalString, "/hello");
}
[Fact]
public async Task Invoke_RedirectRemoveTrailingSlash()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetAsync("hey/hello/");
Assert.Equal(response.Headers.Location.OriginalString, "/hey/hello");
}
[Fact]
public async Task Invoke_RedirectAddTrailingSlash()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetAsync("hey/hello");
Assert.Equal(response.Headers.Location.OriginalString, "/hey/hello/");
}
[Fact]
public async Task Invoke_RedirectToHttps()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetAsync(new Uri("http://example.com"));
Assert.Equal(response.Headers.Location.OriginalString, "https://example.com/");
}
[Fact]
public async Task Invoke_RewriteToHttps()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
app.Run(context => context.Response.WriteAsync(
context.Request.Scheme +
"://" +
context.Request.Host +
context.Request.Path +
context.Request.QueryString));
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetStringAsync(new Uri("http://example.com"));
Assert.Equal(response, "https://example.com/");
}
[Fact]
public async Task Invoke_ReverseProxyToAnotherSite()
{
var options = new RewriteOptions().ImportFromUrlRewrite(new StringReader(@"
"));
var builder = new WebHostBuilder()
.Configure(app =>
{
app.UseRewriter(options);
app.Run(context => context.Response.WriteAsync(
context.Request.Scheme +
"://" +
context.Request.Host +
context.Request.Path +
context.Request.QueryString));
});
var server = new TestServer(builder);
var response = await server.CreateClient().GetStringAsync(new Uri("http://example.com/"));
Assert.Equal(response, "http://internalserver/");
}
}
}