Add extension method for AcceptAsync with timeout

- Update tests for Win7 and Win2008R2 specific behaviour for caching responses without content-type
This commit is contained in:
John Luo 2016-10-25 14:31:37 -07:00
parent 72ccc60977
commit f96ba3a254
16 changed files with 268 additions and 189 deletions

View File

@ -8,4 +8,4 @@ using System.Resources;
[assembly: NeutralResourcesLanguage("en-us")]
[assembly: AssemblyCompany("Microsoft Corporation.")]
[assembly: AssemblyCopyright("© Microsoft Corporation. All rights reserved.")]
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]
[assembly: AssemblyProduct("Microsoft ASP.NET Core")]

View File

@ -29,7 +29,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.False(context.User.Identity.IsAuthenticated);
Assert.Equal(authType, context.Response.AuthenticationChallenges);
@ -54,7 +54,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var contextTask = server.AcceptAsync(); // Fails when the server shuts down, the challenge happens internally.
var contextTask = server.AcceptAsync(Utilities.DefaultTimeout); // Fails when the server shuts down, the challenge happens internally.
var response = await responseTask;
Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
Assert.Equal(authType.ToString(), response.Headers.WwwAuthenticate.ToString(), StringComparer.OrdinalIgnoreCase);
@ -74,7 +74,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.False(context.User.Identity.IsAuthenticated);
Assert.Equal(authType, context.Response.AuthenticationChallenges);
@ -101,7 +101,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.False(context.User.Identity.IsAuthenticated);
Assert.Equal(authType, context.Response.AuthenticationChallenges);
@ -127,14 +127,14 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, useDefaultCredentials: true);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.False(context.User.Identity.IsAuthenticated);
Assert.Equal(authType, context.Response.AuthenticationChallenges);
context.Response.StatusCode = 401;
context.Dispose();
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.True(context.User.Identity.IsAuthenticated);
Assert.Equal(authType, context.Response.AuthenticationChallenges);
@ -158,7 +158,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, useDefaultCredentials: true);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.True(context.User.Identity.IsAuthenticated);
Assert.Equal(authType, context.Response.AuthenticationChallenges);
@ -178,7 +178,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, useDefaultCredentials: true);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.True(context.User.Identity.IsAuthenticated);
Assert.Equal(AuthenticationSchemes.Kerberos, context.Response.AuthenticationChallenges);
@ -198,7 +198,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.NotNull(context.User);
Assert.False(context.User.Identity.IsAuthenticated);
Assert.Equal(AuthenticationSchemes.Kerberos, context.Response.AuthenticationChallenges);

View File

@ -23,7 +23,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(Address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
string response = await responseTask;
@ -38,7 +38,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(Address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] body = Encoding.UTF8.GetBytes("Hello World");
context.Response.ContentLength = body.Length;
await context.Response.Body.WriteAsync(body, 0, body.Length);
@ -56,7 +56,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(Address, "Hello World");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
string input = new StreamReader(context.Request.Body).ReadToEnd();
Assert.Equal("Hello World", input);
context.Response.ContentLength = 11;
@ -77,7 +77,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(Address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cert = await context.Request.GetClientCertificateAsync();
Assert.Null(cert);
context.Dispose();
@ -96,7 +96,7 @@ namespace Microsoft.Net.Http.Server
Assert.NotNull(clientCert);
Task<string> responseTask = SendRequestAsync(Address, clientCert);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cert = await context.Request.GetClientCertificateAsync();
Assert.NotNull(cert);
context.Dispose();

View File

@ -23,7 +23,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> clientTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] body = Encoding.UTF8.GetBytes("Hello World");
context.Response.Body.Write(body, 0, body.Length);
@ -45,7 +45,7 @@ namespace Microsoft.Net.Http.Server
{
Task<Stream> clientTask = SendOpaqueRequestAsync("GET", address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.True(context.IsUpgradableRequest);
context.Response.Headers["Upgrade"] = "WebSocket"; // Win8.1 blocks anything but WebSocket
Stream serverStream = await context.UpgradeAsync();
@ -89,7 +89,7 @@ namespace Microsoft.Net.Http.Server
{
Task<Stream> clientTask = SendOpaqueRequestAsync(method, address, extraHeader);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.True(context.IsUpgradableRequest);
context.Response.Headers["Upgrade"] = "WebSocket"; // Win8.1 blocks anything but WebSocket
Stream serverStream = await context.UpgradeAsync();
@ -129,7 +129,7 @@ namespace Microsoft.Net.Http.Server
using (var server = Utilities.CreateHttpServer(out address))
{
var clientTask = SendOpaqueRequestAsync(method, address, extraHeader);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.False(context.IsUpgradableRequest);
context.Dispose();

View File

@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, "Hello World");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[100];
int read = context.Request.Body.Read(input, 0, input.Length);
context.Response.ContentLength = read;
@ -43,7 +43,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, "Hello World");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[100];
int read = await context.Request.Body.ReadAsync(input, 0, input.Length);
context.Response.ContentLength = read;
@ -62,7 +62,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, "Hello World");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[100];
int read = context.Request.Body.EndRead(context.Request.Body.BeginRead(input, 0, input.Length, null, null));
context.Response.ContentLength = read;
@ -82,7 +82,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, "Hello World");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[100];
Assert.Throws<ArgumentNullException>("buffer", () => context.Request.Body.Read(null, 0, 1));
Assert.Throws<ArgumentOutOfRangeException>("offset", () => context.Request.Body.Read(input, -1, 1));
@ -107,7 +107,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, content);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
int read = context.Request.Body.Read(input, 0, input.Length);
Assert.Equal(5, read);
@ -130,7 +130,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, content);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
int read = await context.Request.Body.ReadAsync(input, 0, input.Length);
Assert.Equal(5, read);
@ -152,7 +152,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendSocketRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[11];
int read = await context.Request.Body.ReadAsync(input, 0, input.Length);
Assert.Equal(10, read);
@ -178,7 +178,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, "Hello World");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
var cts = new CancellationTokenSource();
@ -203,7 +203,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, content);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
var cts = new CancellationTokenSource();
int read = await context.Request.Body.ReadAsync(input, 0, input.Length, cts.Token);
@ -227,7 +227,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, content);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5));
@ -252,7 +252,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, content);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
var cts = new CancellationTokenSource();
int read = await context.Request.Body.ReadAsync(input, 0, input.Length, cts.Token);
@ -277,7 +277,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address, content);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
var cts = new CancellationTokenSource();
int read = await context.Request.Body.ReadAsync(input, 0, input.Length, cts.Token);
@ -305,7 +305,7 @@ namespace Microsoft.Net.Http.Server
var client = new HttpClient();
var responseTask = client.PostAsync(address, content);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] input = new byte[10];
int read = await context.Request.Body.ReadAsync(input, 0, input.Length, context.DisconnectToken);
Assert.False(context.DisconnectToken.IsCancellationRequested);

View File

@ -22,7 +22,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var requestHeaders = context.Request.Headers;
// NOTE: The System.Net client only sends the Connection: keep-alive header on the first connection per service-point.
// Assert.Equal(2, requestHeaders.Count);
@ -48,7 +48,7 @@ namespace Microsoft.Net.Http.Server
string[] customValues = new string[] { "custom1, and custom2", "custom3" };
Task responseTask = SendRequestAsync(address, "Custom-Header", customValues);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var requestHeaders = context.Request.Headers;
Assert.Equal(4, requestHeaders.Count);
Assert.Equal(new Uri(address).Authority, requestHeaders["Host"]);
@ -75,7 +75,7 @@ namespace Microsoft.Net.Http.Server
string[] customValues = new string[] { "custom1, and custom测试2", "custom3" };
Task responseTask = SendRequestAsync(address, "Custom-Header", customValues);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var requestHeaders = context.Request.Headers;
Assert.Equal(4, requestHeaders.Count);
Assert.Equal(new Uri(address).Authority, requestHeaders["Host"]);

View File

@ -22,7 +22,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(root + "/basepath/SomePath?SomeQuery");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// General fields
var request = context.Request;
@ -66,7 +66,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(root + requestPath);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// General fields
var request = context.Request;
@ -94,7 +94,7 @@ namespace Microsoft.Net.Http.Server
using (var server = Utilities.CreateHttpServerReturnRoot("/", out root))
{
var responseTask = SendSocketRequestAsync(root, requestPath);
var contextTask = server.AcceptAsync();
var contextTask = server.AcceptAsync(Utilities.DefaultTimeout);
var response = await responseTask;
var responseStatusCode = response.Substring(9); // Skip "HTTP/1.1 "
Assert.Equal("400", responseStatusCode);
@ -108,7 +108,7 @@ namespace Microsoft.Net.Http.Server
using (var server = Utilities.CreateHttpServerReturnRoot("/", out root))
{
var responseTask = SendSocketRequestAsync(root, "/%252F");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal("/%2F", context.Request.Path);
}
}
@ -120,7 +120,7 @@ namespace Microsoft.Net.Http.Server
using (var server = Utilities.CreateHttpServerReturnRoot("/", out root))
{
var responseTask = SendSocketRequestAsync(root, "*", "OPTIONS");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal("", context.Request.PathBase);
Assert.Equal("", context.Request.Path);
Assert.Equal("*", context.Request.RawUrl);
@ -159,7 +159,7 @@ namespace Microsoft.Net.Http.Server
Task<string> responseTask = SendRequestAsync(root + requestUri);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var request = context.Request;
Assert.Equal(expectedPath, request.Path);
@ -202,7 +202,7 @@ namespace Microsoft.Net.Http.Server
using (var server = Utilities.CreateHttpServerReturnRoot("/", out root))
{
var responseTask = SendSocketRequestAsync(root, "/" + requestPath);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
actualPath = context.Request.Path;
context.Dispose();
@ -227,7 +227,7 @@ namespace Microsoft.Net.Http.Server
using (var server = Utilities.CreateHttpServerReturnRoot("/", out root))
{
var responseTask = SendSocketRequestAsync(root, requestPath);
var contextTask = server.AcceptAsync();
var contextTask = server.AcceptAsync(Utilities.DefaultTimeout);
var response = await responseTask;
Assert.Equal("400", response.Substring(9));
@ -252,7 +252,7 @@ namespace Microsoft.Net.Http.Server
using (var server = Utilities.CreateHttpServerReturnRoot("/", out root))
{
var responseTask = SendSocketRequestAsync(root, requestPath);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal(expectedPath, context.Request.Path);
context.Dispose();

View File

@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Body.Write(new byte[10], 0, 10);
await context.Response.Body.WriteAsync(new byte[10], 0, 10);
context.Dispose();
@ -47,7 +47,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Body.Write(new byte[10], 0, 10);
context.Response.Body.Flush();
await context.Response.Body.WriteAsync(new byte[10], 0, 10);
@ -70,7 +70,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["transfeR-Encoding"] = "CHunked";
Stream stream = context.Response.Body;
var responseBytes = Encoding.ASCII.GetBytes("10\r\nManually Chunked\r\n0\r\n\r\n");
@ -95,7 +95,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = " 30 ";
var stream = context.Response.Body;
#if NET451
@ -126,12 +126,12 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = " 20 ";
context.Dispose();
#if !NETCOREAPP1_1
// HttpClient retries the request because it didn't get a response.
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = " 20 ";
context.Dispose();
#endif
@ -147,7 +147,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = " 20 ";
context.Response.Body.Write(new byte[5], 0, 5);
context.Dispose();
@ -164,7 +164,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = " 10 ";
context.Response.Body.Write(new byte[5], 0, 5);
Assert.Throws<InvalidOperationException>(() => context.Response.Body.Write(new byte[6], 0, 6));
@ -182,7 +182,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = " 10 ";
context.Response.Body.Write(new byte[10], 0, 10);
Assert.Throws<ObjectDisposedException>(() => context.Response.Body.Write(new byte[6], 0, 6));
@ -207,7 +207,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Body.Write(new byte[10], 0, 0);
Assert.True(context.Response.HasStarted);
await context.Response.Body.WriteAsync(new byte[10], 0, 0);
@ -231,7 +231,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
// First write sends headers
await context.Response.Body.WriteAsync(new byte[10], 0, 10, cts.Token);
@ -252,7 +252,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(10));
// First write sends headers
@ -275,7 +275,7 @@ namespace Microsoft.Net.Http.Server
server.Settings.ThrowWriteExceptions = true;
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -284,7 +284,7 @@ namespace Microsoft.Net.Http.Server
context.Dispose();
#if NET451
// .NET 4.5 HttpClient automatically retries a request if it does not get a response.
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -304,7 +304,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -313,7 +313,7 @@ namespace Microsoft.Net.Http.Server
context.Dispose();
#if NET451
// .NET 4.5 HttpClient automatically retries a request if it does not get a response.
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -334,7 +334,7 @@ namespace Microsoft.Net.Http.Server
server.Settings.ThrowWriteExceptions = true;
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
// First write sends headers
await context.Response.Body.WriteAsync(new byte[10], 0, 10, cts.Token);
@ -355,7 +355,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
// First write sends headers
await context.Response.Body.WriteAsync(new byte[10], 0, 10, cts.Token);
@ -378,7 +378,7 @@ namespace Microsoft.Net.Http.Server
var cts = new CancellationTokenSource();
var responseTask = SendRequestAsync(address, cts.Token);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
cts.Cancel();
await Assert.ThrowsAsync<TaskCanceledException>(() => responseTask);
@ -408,7 +408,7 @@ namespace Microsoft.Net.Http.Server
var cts = new CancellationTokenSource();
var responseTask = SendRequestAsync(address, cts.Token);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
cts.Cancel();
@ -439,7 +439,7 @@ namespace Microsoft.Net.Http.Server
var cts = new CancellationTokenSource();
var responseTask = SendRequestAsync(address, cts.Token);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
cts.Cancel();
await Assert.ThrowsAsync<TaskCanceledException>(() => responseTask);
@ -462,7 +462,7 @@ namespace Microsoft.Net.Http.Server
var cts = new CancellationTokenSource();
var responseTask = SendRequestAsync(address, cts.Token);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
cts.Cancel();
await Assert.ThrowsAsync<TaskCanceledException>(() => responseTask);
@ -488,7 +488,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
context.Response.Body.Write(new byte[10], 0, 10);
@ -522,7 +522,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
await context.Response.Body.WriteAsync(new byte[10], 0, 10);
@ -555,7 +555,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
context.Response.Body.Write(new byte[10], 0, 10);
@ -585,7 +585,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
await context.Response.Body.WriteAsync(new byte[10], 0, 10);
@ -593,7 +593,7 @@ namespace Microsoft.Net.Http.Server
response.EnsureSuccessStatusCode();
response.Dispose();
}
Assert.True(context.DisconnectToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(5)));
// It can take several tries before Write notices the disconnect.
for (int i = 0; i < 10; i++)

View File

@ -24,6 +24,7 @@ namespace Microsoft.Net.Http.Server
}
[ConditionalFact]
[OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win2008R2, WindowsVersions.Win7, SkipReason = "Content type not required for caching on Win7 and Win2008R2.")]
public async Task Caching_SetTtlWithoutContentType_NotCached()
{
string address;
@ -31,7 +32,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
// Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -44,7 +45,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
// Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -57,6 +58,38 @@ namespace Microsoft.Net.Http.Server
}
}
[ConditionalFact]
public async Task Caching_SetTtlWithoutContentType_Cached_OnWin7AndWin2008R2()
{
if (Utilities.IsWin8orLater)
{
return;
}
string address;
using (var server = Utilities.CreateHttpServer(out address))
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
// Http.sys does not require a content-type to cache on Win7 and Win2008R2
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
context.Dispose();
var response = await responseTask;
Assert.Equal(200, (int)response.StatusCode);
Assert.Equal("1", response.Headers.GetValues("x-request-count").FirstOrDefault());
Assert.Equal(new byte[0], await response.Content.ReadAsByteArrayAsync());
// Send a second request and make sure we get the same response (without listening for one on the server).
response = await SendRequestAsync(address);
Assert.Equal(200, (int)response.StatusCode);
Assert.Equal("1", response.Headers.GetValues("x-request-count").FirstOrDefault());
Assert.Equal(new byte[0], await response.Content.ReadAsByteArrayAsync());
}
}
[ConditionalFact]
public async Task Caching_SetTtlWithContentType_Cached()
{
@ -65,7 +98,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -94,7 +127,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -125,7 +158,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.Headers["age"] = "12345";
@ -157,7 +190,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(0);
@ -170,7 +203,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
// Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -191,7 +224,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromMilliseconds(900);
@ -204,7 +237,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
// Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -225,7 +258,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(-10);
@ -238,7 +271,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
// Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -259,7 +292,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.MaxValue;
@ -286,7 +319,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength = 10;
@ -317,7 +350,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength = 10;
@ -348,7 +381,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -362,7 +395,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
context.Dispose();
@ -381,7 +414,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -396,7 +429,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
context.Dispose();
@ -415,7 +448,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength = 10;
@ -446,7 +479,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -460,7 +493,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
context.Dispose();
@ -479,7 +512,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength =_fileLength;
@ -520,7 +553,7 @@ namespace Microsoft.Net.Http.Server
var responseTask = SendRequestAsync(address + status);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = status;
context.Response.Headers["x-request-count"] = status.ToString();
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
@ -571,7 +604,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address, method);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = context.Request.Method + "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -584,7 +617,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address, method);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = context.Request.Method + "2";
// Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -597,7 +630,7 @@ namespace Microsoft.Net.Http.Server
}
}
// RFC violation. http://tools.ietf.org/html/rfc7234#section-4.4
// RFC violation. http://tools.ietf.org/html/rfc7234#section-4.4
// "A cache MUST invalidate the effective Request URI ... when a non-error status code
// is received in response to an unsafe request method."
[ConditionalTheory]
@ -630,7 +663,7 @@ namespace Microsoft.Net.Http.Server
// Cache the first response
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = context.Request.Method + "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -644,7 +677,7 @@ namespace Microsoft.Net.Http.Server
// Try to clear the cache with a second request
responseTask = SendRequestAsync(address, method);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = context.Request.Method + "2";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Dispose();
@ -675,7 +708,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address, "GET", "x-vary", "vary1");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.Headers["vary"] = "x-vary";
@ -706,7 +739,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address, "GET", "Authorization", "Basic abc123");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -719,7 +752,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address, "GET", "Authorization", "Basic abc123");
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Dispose();
@ -740,7 +773,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -753,7 +786,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address, "GET", "Authorization", "Basic abc123");
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "2";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Dispose();
@ -776,7 +809,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address, "GET", "Pragma", "no-cache");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -805,7 +838,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -833,7 +866,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address, "GET", "Cache-Control", "no-cache");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -861,7 +894,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -889,7 +922,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -917,7 +950,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.CacheTtl = TimeSpan.FromSeconds(10);
@ -944,7 +977,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address, "GET", "Range", "bytes=0-10");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = 206;
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
@ -961,7 +994,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address, "GET", "Range", "bytes=0-10");
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = 206;
context.Response.Headers["x-request-count"] = "2";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
@ -988,7 +1021,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength = 100;
@ -1018,7 +1051,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength = 100;
@ -1047,7 +1080,7 @@ namespace Microsoft.Net.Http.Server
var responseLength = _fileLength / 2; // Make sure it handles partial files.
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength = responseLength;
@ -1079,7 +1112,7 @@ namespace Microsoft.Net.Http.Server
var responseLength = _fileLength / 2; // Make sure it handles partial files.
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["x-request-count"] = "1";
context.Response.Headers["content-type"] = "some/thing"; // Http.sys requires a content-type to cache
context.Response.ContentLength = responseLength;

View File

@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
HttpResponseMessage response = await responseTask;
@ -46,7 +46,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, usehttp11: false);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
HttpResponseMessage response = await responseTask;
@ -69,7 +69,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendHeadRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
HttpResponseMessage response = await responseTask;
@ -91,7 +91,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendHeadRequestAsync(address, usehttp11: false);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
HttpResponseMessage response = await responseTask;
@ -114,7 +114,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendHeadRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.ContentLength = 20;
context.Dispose();
@ -137,7 +137,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = 204; // No Content
context.Dispose();
@ -160,7 +160,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendHeadRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = 204; // No Content
context.Dispose();
@ -184,7 +184,7 @@ namespace Microsoft.Net.Http.Server
WebRequest request = WebRequest.Create(address);
Task<WebResponse> responseTask = request.GetResponseAsync();
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;
responseHeaders["WWW-Authenticate"] = "custom1";
context.Dispose();
@ -209,7 +209,7 @@ namespace Microsoft.Net.Http.Server
WebRequest request = WebRequest.Create(address);
Task<WebResponse> responseTask = request.GetResponseAsync();
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;
responseHeaders["WWW-Authenticate"] = new[] { "custom1, and custom2", "custom3" };
context.Dispose();
@ -238,7 +238,7 @@ namespace Microsoft.Net.Http.Server
WebRequest request = WebRequest.Create(address);
Task<WebResponse> responseTask = request.GetResponseAsync();
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;
responseHeaders["Custom-Header1"] = new[] { "custom1, and custom2", "custom3" };
context.Dispose();
@ -266,7 +266,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;
responseHeaders["Connection"] = "Close";
context.Dispose();
@ -286,7 +286,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, usehttp11: false);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
HttpResponseMessage response = await responseTask;
@ -309,7 +309,7 @@ namespace Microsoft.Net.Http.Server
request.Version = new Version(1, 0);
Task<HttpResponseMessage> responseTask = client.SendAsync(request);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;
responseHeaders["Transfer-Encoding"] = "chunked";
var responseBytes = Encoding.ASCII.GetBytes("10\r\nManually Chunked\r\n0\r\n\r\n");
@ -337,7 +337,7 @@ namespace Microsoft.Net.Http.Server
// Http.Sys does not support 1.0 keep-alives.
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, usehttp11: false, sendKeepAlive: true);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
HttpResponseMessage response = await responseTask;
@ -355,7 +355,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;
responseHeaders["Custom1"] = new[] { "value1a", "value1b" };
@ -391,7 +391,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;
responseHeaders["Custom1"] = new[] { "value1a", "value1b" };
@ -445,7 +445,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var responseHeaders = context.Response.Headers;

View File

@ -18,7 +18,7 @@ namespace Microsoft.Net.Http.Server
private readonly string AbsoluteFilePath;
private readonly string RelativeFilePath;
private readonly long FileLength;
public ResponseSendFileTests()
{
AbsoluteFilePath = Directory.GetFiles(Directory.GetCurrentDirectory()).First();
@ -34,16 +34,16 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
await Assert.ThrowsAsync<FileNotFoundException>(() =>
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await Assert.ThrowsAsync<FileNotFoundException>(() =>
context.Response.SendFileAsync("Missing.txt", 0, null, CancellationToken.None));
context.Dispose();
var response = await responseTask;
response.EnsureSuccessStatusCode();
}
}
[ConditionalFact]
public async Task ResponseSendFile_NoHeaders_DefaultsToChunked()
{
@ -52,7 +52,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None);
context.Dispose();
@ -73,7 +73,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await context.Response.SendFileAsync(RelativeFilePath, 0, null, CancellationToken.None);
context.Dispose();
@ -94,7 +94,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None);
context.Dispose();
@ -115,7 +115,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None);
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None);
context.Dispose();
@ -137,7 +137,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await context.Response.SendFileAsync(AbsoluteFilePath, 0, FileLength / 2, CancellationToken.None);
context.Dispose();
@ -158,7 +158,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await Assert.ThrowsAsync<ArgumentOutOfRangeException>(
() => context.Response.SendFileAsync(AbsoluteFilePath, 1234567, null, CancellationToken.None));
context.Dispose();
@ -176,7 +176,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await Assert.ThrowsAsync<ArgumentOutOfRangeException>(
() => context.Response.SendFileAsync(AbsoluteFilePath, 0, 1234567, CancellationToken.None));
context.Dispose();
@ -194,7 +194,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await context.Response.SendFileAsync(AbsoluteFilePath, 0, 0, CancellationToken.None);
context.Dispose();
@ -219,7 +219,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
await context.Response.SendFileAsync(emptyFilePath, 0, null, CancellationToken.None);
Assert.True(context.Response.HasStarted);
await context.Response.Body.WriteAsync(new byte[10], 0, 10, CancellationToken.None);
@ -243,7 +243,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = FileLength.ToString();
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None);
@ -265,7 +265,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = "10";
await context.Response.SendFileAsync(AbsoluteFilePath, 0, 10, CancellationToken.None);
context.Dispose();
@ -288,7 +288,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.Headers["Content-lenGth"] = "0";
await context.Response.SendFileAsync(AbsoluteFilePath, 0, 0, CancellationToken.None);
context.Dispose();
@ -311,7 +311,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
// First write sends headers
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, cts.Token);
@ -332,7 +332,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(10));
// First write sends headers
@ -355,7 +355,7 @@ namespace Microsoft.Net.Http.Server
server.Settings.ThrowWriteExceptions = true;
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -364,7 +364,7 @@ namespace Microsoft.Net.Http.Server
context.Dispose();
#if NET451
// .NET 4.5 HttpClient automatically retries a request if it does not get a response.
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -384,7 +384,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -393,7 +393,7 @@ namespace Microsoft.Net.Http.Server
context.Dispose();
#if NET451
// .NET 4.5 HttpClient automatically retries a request if it does not get a response.
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
cts = new CancellationTokenSource();
cts.Cancel();
// First write sends headers
@ -414,7 +414,7 @@ namespace Microsoft.Net.Http.Server
server.Settings.ThrowWriteExceptions = true;
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
// First write sends headers
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, cts.Token);
@ -435,7 +435,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var cts = new CancellationTokenSource();
// First write sends headers
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, cts.Token);
@ -458,7 +458,7 @@ namespace Microsoft.Net.Http.Server
var cts = new CancellationTokenSource();
var responseTask = SendRequestAsync(address, cts.Token);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
cts.Cancel();
@ -490,7 +490,7 @@ namespace Microsoft.Net.Http.Server
var cts = new CancellationTokenSource();
var responseTask = SendRequestAsync(address, cts.Token);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
cts.Cancel();
await Assert.ThrowsAsync<TaskCanceledException>(() => responseTask);
@ -504,7 +504,7 @@ namespace Microsoft.Net.Http.Server
}
}
[ConditionalFact]
[ConditionalFact(Skip = "Tests hanging: https://github.com/aspnet/WebListener/issues/270")]
public async Task ResponseSendFileExceptions_ClientDisconnectsBeforeSecondSend_SendThrows()
{
string address;
@ -516,7 +516,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None);
@ -538,7 +538,7 @@ namespace Microsoft.Net.Http.Server
}
}
[ConditionalFact]
[ConditionalFact(Skip = "Tests hanging: https://github.com/aspnet/WebListener/issues/270")]
public async Task ResponseSendFile_ClientDisconnectsBeforeSecondSend_SendCompletesSilently()
{
string address;
@ -549,7 +549,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address, HttpCompletionOption.ResponseHeadersRead);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
// First write sends headers
await context.Response.SendFileAsync(AbsoluteFilePath, 0, null, CancellationToken.None);

View File

@ -20,7 +20,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal(200, context.Response.StatusCode);
context.Dispose();
@ -40,7 +40,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = 201;
// TODO: env["owin.ResponseProtocol"] = "HTTP/1.0"; // Http.Sys ignores this value
context.Dispose();
@ -61,7 +61,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = 201;
context.Response.ReasonPhrase = "CustomReasonPhrase";
// TODO: env["owin.ResponseProtocol"] = "HTTP/1.0"; // Http.Sys ignores this value
@ -83,7 +83,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.StatusCode = 901;
context.Dispose();
@ -102,7 +102,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Throws<ArgumentOutOfRangeException>(() => { context.Response.StatusCode = 100; });
context.Dispose();
@ -118,7 +118,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Throws<ArgumentOutOfRangeException>(() => { context.Response.StatusCode = 0; });
context.Dispose();

View File

@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
var response = await responseTask;
@ -40,7 +40,7 @@ namespace Microsoft.Net.Http.Server
{
Task<string> responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Response.ContentLength = 11;
using (var writer = new StreamWriter(context.Response.Body))
{
@ -60,7 +60,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address, "Hello World");
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
string input = new StreamReader(context.Request.Body).ReadToEnd();
Assert.Equal("Hello World", input);
context.Response.ContentLength = 11;
@ -87,7 +87,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var ct = context.DisconnectToken;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");
@ -118,7 +118,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
client.CancelPendingRequests();
await Assert.ThrowsAsync<TaskCanceledException>(() => responseTask);
@ -149,7 +149,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = client.GetAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
var response = await responseTask;
@ -178,7 +178,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var ct = context.DisconnectToken;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");
@ -188,7 +188,7 @@ namespace Microsoft.Net.Http.Server
Assert.True(ct.IsCancellationRequested, "IsCancellationRequested");
#if !NETCOREAPP1_1
// HttpClient re-tries the request because it doesn't know if the request was received.
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Abort();
#endif
await Assert.ThrowsAsync<HttpRequestException>(() => responseTask);
@ -206,7 +206,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
var ct = context.DisconnectToken;
Assert.True(ct.CanBeCanceled, "CanBeCanceled");
Assert.False(ct.IsCancellationRequested, "IsCancellationRequested");
@ -237,7 +237,7 @@ namespace Microsoft.Net.Http.Server
server.Settings.RequestQueueLimit = 1001;
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
context.Dispose();
var response = await responseTask;
@ -253,7 +253,7 @@ namespace Microsoft.Net.Http.Server
{
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal(string.Empty, context.Request.PathBase);
Assert.Equal("/", context.Request.Path);
context.Dispose();
@ -266,7 +266,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal("/pathbase", context.Request.PathBase);
Assert.Equal("/", context.Request.Path);
context.Dispose();
@ -286,7 +286,7 @@ namespace Microsoft.Net.Http.Server
server.Settings.UrlPrefixes.Add(address);
var responseTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal("/pathbase", context.Request.PathBase);
Assert.Equal("/", context.Request.Path);
context.Dispose();
@ -298,7 +298,7 @@ namespace Microsoft.Net.Http.Server
responseTask = SendRequestAsync(address);
context = await server.AcceptAsync();
context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.Equal(string.Empty, context.Request.PathBase);
Assert.Equal("/pathbase/", context.Request.Path);
context.Dispose();

View File

@ -2,19 +2,37 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Internal;
namespace Microsoft.Net.Http.Server
{
internal static class Utilities
{
// When tests projects are run in parallel, overlapping port ranges can cause a race condition when looking for free
// ports during dynamic port allocation. To avoid this, make sure the port range here is different from the range in
// When tests projects are run in parallel, overlapping port ranges can cause a race condition when looking for free
// ports during dynamic port allocation. To avoid this, make sure the port range here is different from the range in
// Microsoft.AspNetCore.Server.WebListener.
private const int BasePort = 8001;
private const int MaxPort = 11000;
private static int NextPort = BasePort;
private static object PortLock = new object();
internal static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(15);
// Minimum support for Windows 7 is assumed.
internal static readonly bool IsWin8orLater;
static Utilities()
{
var win8Version = new Version(6, 2);
#if NET451
IsWin8orLater = (Environment.OSVersion.Version >= win8Version);
#else
IsWin8orLater = (new Version(RuntimeEnvironment.OperatingSystemVersion) >= win8Version);
#endif
}
internal static WebListener CreateHttpAuthServer(AuthenticationSchemes authScheme, bool allowAnonymos, out string baseAddress)
{
var listener = CreateHttpServer(out baseAddress);
@ -74,5 +92,25 @@ namespace Microsoft.Net.Http.Server
listener.Start();
return listener;
}
/// <summary>
/// AcceptAsync extension with timeout. This extension should be used in all tests to prevent
/// unexpected hangs when a request does not arrive.
/// </summary>
internal static async Task<RequestContext> AcceptAsync(this WebListener server, TimeSpan timeout)
{
var acceptTask = server.AcceptAsync();
var completedTask = await Task.WhenAny(acceptTask, Task.Delay(timeout));
if (completedTask == acceptTask)
{
return await acceptTask;
}
else
{
server.Dispose();
throw new TimeoutException("AcceptAsync has timed out.");
}
}
}
}

View File

@ -23,7 +23,7 @@ namespace Microsoft.Net.Http.Server
{
Task<HttpResponseMessage> clientTask = SendRequestAsync(address);
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
byte[] body = Encoding.UTF8.GetBytes("Hello World");
context.Response.Body.Write(body, 0, body.Length);
@ -43,7 +43,7 @@ namespace Microsoft.Net.Http.Server
{
Task<WebSocket> clientTask = SendWebSocketRequestAsync(ConvertToWebSocketAddress(address));
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.True(context.IsUpgradableRequest);
WebSocket serverWebSocket = await context.AcceptWebSocketAsync();
WebSocket clientWebSocket = await clientTask;
@ -60,7 +60,7 @@ namespace Microsoft.Net.Http.Server
{
Task<WebSocket> clientTask = SendWebSocketRequestAsync(ConvertToWebSocketAddress(address));
var context = await server.AcceptAsync();
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
Assert.True(context.IsWebSocketRequest);
WebSocket serverWebSocket = await context.AcceptWebSocketAsync();
WebSocket clientWebSocket = await clientTask;

View File

@ -1,5 +1,9 @@
{
"testRunner": "xunit",
"buildOptions": {
"warningsAsErrors": true,
"keyFile": "../../tools/Key.snk"
},
"dependencies": {
"dotnet-test-xunit": "2.2.0-*",
"Microsoft.AspNetCore.Testing": "1.1.0-*",
@ -9,6 +13,10 @@
"frameworks": {
"netcoreapp1.1": {
"dependencies": {
"Microsoft.Extensions.RuntimeEnvironment.Sources": {
"type": "build",
"version": "1.1.0-*"
},
"Microsoft.NETCore.App": {
"version": "1.1.0-*",
"type": "platform"