diff --git a/src/Microsoft.Net.Http.Server/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Server/Properties/AssemblyInfo.cs index 76feceeff0..78c1309651 100644 --- a/src/Microsoft.Net.Http.Server/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Server/Properties/AssemblyInfo.cs @@ -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")] \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/AuthenticationTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/AuthenticationTests.cs index 93b21417e8..dc7fb92160 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/AuthenticationTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/AuthenticationTests.cs @@ -29,7 +29,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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 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 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 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 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 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); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/HttpsTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/HttpsTests.cs index 58bf36998c..da34f91cfe 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/HttpsTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/HttpsTests.cs @@ -23,7 +23,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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 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 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(); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/OpaqueUpgradeTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/OpaqueUpgradeTests.cs index 987352df62..6027313f6d 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/OpaqueUpgradeTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/OpaqueUpgradeTests.cs @@ -23,7 +23,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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(); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestBodyTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestBodyTests.cs index 87b6d62dbf..6c801f80b7 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestBodyTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestBodyTests.cs @@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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 responseTask = SendRequestAsync(address, "Hello World"); - var context = await server.AcceptAsync(); + var context = await server.AcceptAsync(Utilities.DefaultTimeout); byte[] input = new byte[100]; Assert.Throws("buffer", () => context.Request.Body.Read(null, 0, 1)); Assert.Throws("offset", () => context.Request.Body.Read(input, -1, 1)); @@ -107,7 +107,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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 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 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 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 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 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); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestHeaderTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestHeaderTests.cs index 2511e80d28..89457057fe 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestHeaderTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestHeaderTests.cs @@ -22,7 +22,7 @@ namespace Microsoft.Net.Http.Server { Task 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"]); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs index f86e9a1124..d907e92e3b 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/RequestTests.cs @@ -22,7 +22,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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(); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseBodyTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseBodyTests.cs index 5177445589..67df513777 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseBodyTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseBodyTests.cs @@ -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(() => 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(() => 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(() => 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(() => 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(() => 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++) diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseCachingTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseCachingTests.cs index ce797fc9a0..5494b6a5de 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseCachingTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseCachingTests.cs @@ -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; diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseHeaderTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseHeaderTests.cs index a485071fd6..69c918b6c9 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseHeaderTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseHeaderTests.cs @@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 responseTask = SendRequestAsync(address); - var context = await server.AcceptAsync(); + var context = await server.AcceptAsync(Utilities.DefaultTimeout); var responseHeaders = context.Response.Headers; diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseSendFileTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseSendFileTests.cs index af06647383..f5e7128531 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseSendFileTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseSendFileTests.cs @@ -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(() => + var context = await server.AcceptAsync(Utilities.DefaultTimeout); + await Assert.ThrowsAsync(() => 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( () => 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( () => 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(() => 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); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseTests.cs index 0fab49a9ae..cc43f1f356 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/ResponseTests.cs @@ -20,7 +20,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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 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 responseTask = SendRequestAsync(address); - var context = await server.AcceptAsync(); + var context = await server.AcceptAsync(Utilities.DefaultTimeout); Assert.Throws(() => { context.Response.StatusCode = 100; }); context.Dispose(); @@ -118,7 +118,7 @@ namespace Microsoft.Net.Http.Server { Task responseTask = SendRequestAsync(address); - var context = await server.AcceptAsync(); + var context = await server.AcceptAsync(Utilities.DefaultTimeout); Assert.Throws(() => { context.Response.StatusCode = 0; }); context.Dispose(); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/ServerTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/ServerTests.cs index cc5899745e..3dab88abbb 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/ServerTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/ServerTests.cs @@ -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 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(() => 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(() => 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(); diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/Utilities.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/Utilities.cs index 0d5066f752..65e4ffe3ec 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/Utilities.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/Utilities.cs @@ -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; } + + /// + /// AcceptAsync extension with timeout. This extension should be used in all tests to prevent + /// unexpected hangs when a request does not arrive. + /// + internal static async Task 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."); + } + } } } diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/WebSocketTests.cs b/test/Microsoft.Net.Http.Server.FunctionalTests/WebSocketTests.cs index eadc50f7cf..5aa8990690 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/WebSocketTests.cs +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/WebSocketTests.cs @@ -23,7 +23,7 @@ namespace Microsoft.Net.Http.Server { Task 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 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 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; diff --git a/test/Microsoft.Net.Http.Server.FunctionalTests/project.json b/test/Microsoft.Net.Http.Server.FunctionalTests/project.json index 66007106c1..090e5e1874 100644 --- a/test/Microsoft.Net.Http.Server.FunctionalTests/project.json +++ b/test/Microsoft.Net.Http.Server.FunctionalTests/project.json @@ -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"