From c25d9b68abc21502cd46be37461b674be5ad22b3 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Tue, 6 Sep 2016 15:58:08 -0700 Subject: [PATCH] Use socket in Path encoding and unescaping cases --- .../RequestTests.cs | 135 ------------------ .../RequestTests.cs | 89 ++++++++++++ 2 files changed, 89 insertions(+), 135 deletions(-) diff --git a/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/RequestTests.cs b/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/RequestTests.cs index 58f4b6739e..ce7db01208 100644 --- a/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/RequestTests.cs +++ b/test/Microsoft.AspNetCore.Server.WebListener.FunctionalTests/RequestTests.cs @@ -252,141 +252,6 @@ namespace Microsoft.AspNetCore.Server.WebListener } } - [Theory] - [InlineData("%D0%A4", "Ф")] - [InlineData("%d0%a4", "Ф")] - [InlineData("%E0%A4%AD", "भ")] - [InlineData("%e0%A4%Ad", "भ")] - [InlineData("%F0%A4%AD%A2", "𤭢")] - [InlineData("%F0%a4%Ad%a2", "𤭢")] - [InlineData("%48%65%6C%6C%6F%20%57%6F%72%6C%64", "Hello World")] - [InlineData("%48%65%6C%6C%6F%2D%C2%B5%40%C3%9F%C3%B6%C3%A4%C3%BC%C3%A0%C3%A1", "Hello-µ@ßöäüàá")] - // Test the borderline cases of overlong UTF8. - [InlineData("%C2%80", "\u0080")] - [InlineData("%E0%A0%80", "\u0800")] - [InlineData("%F0%90%80%80", "\U00010000")] - [InlineData("%63", "c")] - [InlineData("%32", "2")] - [InlineData("%20", " ")] - // Mixed - [InlineData("%%32", "%2")] - [InlineData("%%20", "% ")] - public async Task Request_PathDecodingValidUTF8(string requestPath, string expect) - { - string root; - using (var server = Utilities.CreateHttpServerReturnRoot("/", out root, httpContext => - { - Assert.Equal(expect, httpContext.Request.Path.Value.TrimStart('/')); - return Task.FromResult(0); - })) - { - var response = await SendRequestAsync(root + "/" + requestPath); - Assert.Equal(string.Empty, response); - } - } - - [Theory] - [InlineData("%C3%84ra%20Benetton", "Ära Benetton")] - [InlineData("%E6%88%91%E8%87%AA%E6%A8%AA%E5%88%80%E5%90%91%E5%A4%A9%E7%AC%91%E5%8E%BB%E7%95%99%E8%82%9D%E8%83%86%E4%B8%A4%E6%98%86%E4%BB%91", "我自横刀向天笑去留肝胆两昆仑")] - public async Task Request_PathDecodingInternationalized(string requestPath, string expect) - { - string root; - using (var server = Utilities.CreateHttpServerReturnRoot("/", out root, httpContext => - { - Assert.Equal(expect, httpContext.Request.Path.Value.TrimStart('/')); - return Task.FromResult(0); - })) - { - var response = await SendRequestAsync(root + "/" + requestPath); - Assert.Equal(string.Empty, response); - } - } - - [Theory] - // Incomplete - [InlineData("%", "%")] - [InlineData("%%", "%%")] - [InlineData("%A", "%A")] - [InlineData("%Y", "%Y")] - public async Task Request_PathDecodingInvalidUTF8(string requestPath, string expect) - { - string root; - using (var server = Utilities.CreateHttpServerReturnRoot("/", out root, httpContext => - { - var actualPath = httpContext.Request.Path.Value.TrimStart('/'); - Assert.Equal(expect, actualPath); - - return Task.FromResult(0); - })) - { - var response = await SendRequestAsync(root + "/" + requestPath); - Assert.Equal(string.Empty, response); - } - } - - [Theory] - // Overlong ASCII - [InlineData("%C0%A4", "%C0%A4")] - [InlineData("%C1%BF", "%C1%BF")] - [InlineData("%E0%80%AF", "%E0%80%AF")] - [InlineData("%E0%9F%BF", "%E0%9F%BF")] - [InlineData("%F0%80%80%AF", "%F0%80%80%AF")] - [InlineData("%F0%80%BF%BF", "%F0%80%BF%BF")] - // Mixed - [InlineData("%C0%A4%32", "%C0%A42")] - [InlineData("%32%C0%A4%32", "2%C0%A42")] - [InlineData("%C0%32%A4", "%C02%A4")] - public async Task Request_ServerErrorFromInvalidUTF8(string requestPath, string expectedPath) - { - string root; - using (var server = Utilities.CreateHttpServerReturnRoot("/", out root, httpContext => - { - var actualPath = httpContext.Request.Path.Value.TrimStart('/'); - Assert.Equal(expectedPath, actualPath); - - return Task.FromResult(0); - })) - { - using (var client = new HttpClient()) - { - var response = await client.GetAsync(root + "/" + requestPath); - Assert.Equal(HttpStatusCode.OK, response.StatusCode); - } - } - } - - [InlineData("%F0%8F%8F%BF")] - public async Task Request_InvalidCodePointCausesBadRequest(string requestPath) - { - string root; - using (var server = Utilities.CreateHttpServerReturnRoot("/", out root, httpContext => Task.FromResult(0))) - { - using (var client = new HttpClient()) - { - var response = await client.GetAsync(root + "/" + requestPath); - Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - } - } - } - - [Theory] - [InlineData("%2F", "%2F")] - [InlineData("foo%2Fbar", "foo%2Fbar")] - [InlineData("foo%2F%20bar", "foo%2F bar")] - public async Task Request_PathDecodingSkipForwardSlash(string requestPath, string expect) - { - string root; - using (var server = Utilities.CreateHttpServerReturnRoot("/", out root, httpContext => - { - Assert.Equal(expect, httpContext.Request.Path.Value.TrimStart('/')); - return Task.FromResult(0); - })) - { - var response = await SendRequestAsync(root + "/" + requestPath); - Assert.Equal(string.Empty, response); - } - } - [Fact] public async Task Request_DoubleEscapingAllowed() { diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs index fa28c81d5b..aa2d76fd29 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs @@ -170,6 +170,95 @@ namespace Microsoft.Net.Http.Server } } + [Theory] + [InlineData("%D0%A4", "Ф")] + [InlineData("%d0%a4", "Ф")] + [InlineData("%E0%A4%AD", "भ")] + [InlineData("%e0%A4%Ad", "भ")] + [InlineData("%F0%A4%AD%A2", "𤭢")] + [InlineData("%F0%a4%Ad%a2", "𤭢")] + [InlineData("%48%65%6C%6C%6F%20%57%6F%72%6C%64", "Hello World")] + [InlineData("%48%65%6C%6C%6F%2D%C2%B5%40%C3%9F%C3%B6%C3%A4%C3%BC%C3%A0%C3%A1", "Hello-µ@ßöäüàá")] + // Test the borderline cases of overlong UTF8. + [InlineData("%C2%80", "\u0080")] + [InlineData("%E0%A0%80", "\u0800")] + [InlineData("%F0%90%80%80", "\U00010000")] + [InlineData("%63", "c")] + [InlineData("%32", "2")] + [InlineData("%20", " ")] + // Internationalized + [InlineData("%C3%84ra%20Benetton", "Ära Benetton")] + [InlineData("%E6%88%91%E8%87%AA%E6%A8%AA%E5%88%80%E5%90%91%E5%A4%A9%E7%AC%91%E5%8E%BB%E7%95%99%E8%82%9D%E8%83%86%E4%B8%A4%E6%98%86%E4%BB%91", "我自横刀向天笑去留肝胆两昆仑")] + // Skip forward slash + [InlineData("%2F", "%2F")] + [InlineData("foo%2Fbar", "foo%2Fbar")] + [InlineData("foo%2F%20bar", "foo%2F bar")] + public async Task Request_PathDecodingValidUTF8(string requestPath, string expect) + { + string root; + string actualPath; + using (var server = Utilities.CreateHttpServerReturnRoot("/", out root)) + { + var responseTask = SendSocketRequestAsync(root, "/" + requestPath); + var context = await server.AcceptAsync(); + actualPath = context.Request.Path; + context.Dispose(); + + var response = await responseTask; + Assert.Equal("200", response.Substring(9)); + } + + Assert.Equal(expect, actualPath.TrimStart('/')); + } + + [Theory] + [InlineData("/%%32")] + [InlineData("/%%20")] + [InlineData("/%F0%8F%8F%BF")] + [InlineData("/%")] + [InlineData("/%%")] + [InlineData("/%A")] + [InlineData("/%Y")] + public async Task Request_PathDecodingInvalidUTF8(string requestPath) + { + string root; + using (var server = Utilities.CreateHttpServerReturnRoot("/", out root)) + { + var responseTask = SendSocketRequestAsync(root, requestPath); + var contextTask = server.AcceptAsync(); + + var response = await responseTask; + Assert.Equal("400", response.Substring(9)); + } + } + + [Theory] + // Overlong ASCII + [InlineData("/%C0%A4", "/%C0%A4")] + [InlineData("/%C1%BF", "/%C1%BF")] + [InlineData("/%E0%80%AF", "/%E0%80%AF")] + [InlineData("/%E0%9F%BF", "/%E0%9F%BF")] + [InlineData("/%F0%80%80%AF", "/%F0%80%80%AF")] + [InlineData("/%F0%80%BF%BF", "/%F0%80%BF%BF")] + // Mixed + [InlineData("/%C0%A4%32", "/%C0%A42")] + [InlineData("/%32%C0%A4%32", "/2%C0%A42")] + [InlineData("/%C0%32%A4", "/%C02%A4")] + public async Task Request_OverlongUTF8Path(string requestPath, string expectedPath) + { + string root; + using (var server = Utilities.CreateHttpServerReturnRoot("/", out root)) + { + var responseTask = SendSocketRequestAsync(root, requestPath); + var context = await server.AcceptAsync(); + Assert.Equal(expectedPath, context.Request.Path); + context.Dispose(); + + var response = await responseTask; + Assert.Equal("200", response.Substring(9)); + } + } + private async Task SendRequestAsync(string uri) { using (HttpClient client = new HttpClient())