Use socket in Path encoding and unescaping cases

This commit is contained in:
Troy Dai 2016-09-06 15:58:08 -07:00
Родитель 7592086060
Коммит c25d9b68ab
2 изменённых файлов: 89 добавлений и 135 удалений

Просмотреть файл

@ -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()
{

Просмотреть файл

@ -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<string> SendRequestAsync(string uri)
{
using (HttpClient client = new HttpClient())