Use socket in Path encoding and unescaping cases
This commit is contained in:
Родитель
7592086060
Коммит
c25d9b68ab
|
@ -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())
|
||||
|
|
Загрузка…
Ссылка в новой задаче