// 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/"); } } }