From ddf5b44de6cca9e419a2a9d4aa252d5e83c13c22 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 22 Aug 2016 14:58:31 -0700 Subject: [PATCH 1/3] Updating to version 1.0.1. --- samples/LargeResponseApp/project.json | 2 +- samples/SampleApp/project.json | 4 ++-- src/Microsoft.AspNetCore.Server.Kestrel.Https/project.json | 4 ++-- src/Microsoft.AspNetCore.Server.Kestrel/project.json | 2 +- .../project.json | 4 ++-- test/Microsoft.AspNetCore.Server.KestrelTests/project.json | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/LargeResponseApp/project.json b/samples/LargeResponseApp/project.json index 564a1b623a..dbf8d5adcb 100644 --- a/samples/LargeResponseApp/project.json +++ b/samples/LargeResponseApp/project.json @@ -1,7 +1,7 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNetCore.Server.Kestrel": "1.0.0" + "Microsoft.AspNetCore.Server.Kestrel": "1.0.1" }, "buildOptions": { "emitEntryPoint": true diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index 721f53351c..e6b62ac106 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,8 +1,8 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", - "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.0", + "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", + "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.1", "Microsoft.Extensions.Logging.Console": "1.0.0" }, "buildOptions": { diff --git a/src/Microsoft.AspNetCore.Server.Kestrel.Https/project.json b/src/Microsoft.AspNetCore.Server.Kestrel.Https/project.json index f8ee43e9a7..42633e4761 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel.Https/project.json +++ b/src/Microsoft.AspNetCore.Server.Kestrel.Https/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0", + "version": "1.0.1", "description": "HTTPS support for the ASP.NET Core Kestrel cross-platform web server.", "buildOptions": { "keyFile": "../../tools/Key.snk", @@ -19,7 +19,7 @@ ] }, "dependencies": { - "Microsoft.AspNetCore.Server.Kestrel": "1.0.0" + "Microsoft.AspNetCore.Server.Kestrel": "1.0.1" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/project.json b/src/Microsoft.AspNetCore.Server.Kestrel/project.json index b6ca5d51c7..4cf319e351 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/project.json +++ b/src/Microsoft.AspNetCore.Server.Kestrel/project.json @@ -1,5 +1,5 @@ { - "version": "1.0.0", + "version": "1.0.1", "description": "ASP.NET Core Kestrel cross-platform web server.", "packOptions": { "repository": { diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/project.json b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/project.json index d21afa6546..12ce280144 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/project.json +++ b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/project.json @@ -3,8 +3,8 @@ "dependencies": { "dotnet-test-xunit": "1.0.0-rc3-000000-01", "Microsoft.AspNetCore.Http.Abstractions": "1.0.0", - "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", - "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.0", + "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", + "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.1", "Microsoft.AspNetCore.Testing": "1.0.0-rtm-21431", "Microsoft.Extensions.Logging.Console": "1.0.0", "Newtonsoft.Json": "9.0.1", diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/project.json b/test/Microsoft.AspNetCore.Server.KestrelTests/project.json index 7928752b7e..125f43cbc6 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/project.json +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/project.json @@ -2,8 +2,8 @@ "version": "1.0.0-*", "dependencies": { "dotnet-test-xunit": "1.0.0-rc3-000000-01", - "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", - "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.0", + "Microsoft.AspNetCore.Server.Kestrel": "1.0.1", + "Microsoft.AspNetCore.Server.Kestrel.Https": "1.0.1", "Microsoft.AspNetCore.Testing": "1.0.0-rtm-21431", "xunit": "2.1.0" }, From 8a30c1f804f10bd054c0ebcfa26ba9219c35c224 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 22 Aug 2016 15:03:54 -0700 Subject: [PATCH 2/3] Reset frame streams on each request (#1028). --- .../Internal/Http/Frame.cs | 7 +-- .../RequestTests.cs | 47 +++++++++++++++++++ .../FrameTests.cs | 40 +++++++++++++++- 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs index 9e45c3f695..d014f3d2b9 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs @@ -242,11 +242,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http if (_frameStreams == null) { _frameStreams = new Streams(this); - RequestBody = _frameStreams.RequestBody; - ResponseBody = _frameStreams.ResponseBody; - DuplexStream = _frameStreams.DuplexStream; } + RequestBody = _frameStreams.RequestBody; + ResponseBody = _frameStreams.ResponseBody; + DuplexStream = _frameStreams.DuplexStream; + _frameStreams.RequestBody.StartAcceptingReads(messageBody); _frameStreams.ResponseBody.StartAcceptingWrites(); } diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/RequestTests.cs b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/RequestTests.cs index 487306a386..a01b84f7b8 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/RequestTests.cs +++ b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/RequestTests.cs @@ -1,7 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Globalization; +using System.IO; using System.Net; using System.Net.Http; using System.Net.Sockets; @@ -137,6 +139,51 @@ namespace Microsoft.AspNetCore.Server.Kestrel.FunctionalTests } } + [Fact] + public async Task StreamsAreNotPersistedAcrossRequests() + { + var requestBodyPersisted = false; + var responseBodyPersisted = false; + + var builder = new WebHostBuilder() + .UseKestrel() + .UseUrls($"http://127.0.0.1:0") + .Configure(app => + { + app.Run(async context => + { + if (context.Request.Body is MemoryStream) + { + requestBodyPersisted = true; + } + + if (context.Response.Body is MemoryStream) + { + responseBodyPersisted = true; + } + + context.Request.Body = new MemoryStream(); + context.Response.Body = new MemoryStream(); + + await context.Response.WriteAsync("hello, world"); + }); + }); + + using (var host = builder.Build()) + { + host.Start(); + + using (var client = new HttpClient { BaseAddress = new Uri($"http://127.0.0.1:{host.GetPort()}") }) + { + await client.GetAsync("/"); + await client.GetAsync("/"); + + Assert.False(requestBodyPersisted); + Assert.False(responseBodyPersisted); + } + } + } + private async Task TestRemoteIPAddress(string registerAddress, string requestAddress, string expectAddress) { var builder = new WebHostBuilder() diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameTests.cs index 52c44bb2b4..c7ada35248 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using System.Text; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Server.Kestrel; @@ -453,9 +454,10 @@ namespace Microsoft.AspNetCore.Server.KestrelTests var frame = new Frame(application: null, context: connectionContext); frame.InitializeHeaders(); - // Act var originalRequestHeaders = frame.RequestHeaders; frame.RequestHeaders = new FrameRequestHeaders(); + + // Act frame.InitializeHeaders(); // Assert @@ -476,13 +478,47 @@ namespace Microsoft.AspNetCore.Server.KestrelTests var frame = new Frame(application: null, context: connectionContext); frame.InitializeHeaders(); - // Act var originalResponseHeaders = frame.ResponseHeaders; frame.ResponseHeaders = new FrameResponseHeaders(); + + // Act frame.InitializeHeaders(); // Assert Assert.Same(originalResponseHeaders, frame.ResponseHeaders); } + + [Fact] + public void InitializeStreamsResetsStreams() + { + // Arrange + var connectionContext = new ConnectionContext() + { + DateHeaderValueManager = new DateHeaderValueManager(), + ServerAddress = ServerAddress.FromUrl("http://localhost:5000"), + ServerOptions = new KestrelServerOptions(), + SocketOutput = new MockSocketOuptut() + }; + var frame = new Frame(application: null, context: connectionContext); + frame.InitializeHeaders(); + + var messageBody = MessageBody.For("HTTP/1.1", (FrameRequestHeaders)frame.RequestHeaders, frame); + frame.InitializeStreams(messageBody); + + var originalRequestBody = frame.RequestBody; + var originalResponseBody = frame.ResponseBody; + var originalDuplexStream = frame.DuplexStream; + frame.RequestBody = new MemoryStream(); + frame.ResponseBody = new MemoryStream(); + frame.DuplexStream = new MemoryStream(); + + // Act + frame.InitializeStreams(messageBody); + + // Assert + Assert.Same(originalRequestBody, frame.RequestBody); + Assert.Same(originalResponseBody, frame.ResponseBody); + Assert.Same(originalDuplexStream, frame.DuplexStream); + } } } From bfa10db25837c9b5aee1f96235ed484a410ccd76 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 29 Aug 2016 17:18:35 -0700 Subject: [PATCH 3/3] Run functional tests sequentially to mitigate flakiness on OS X. --- .../Properties/AssemblyInfo.cs | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/Properties/AssemblyInfo.cs diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b1fa884228 --- /dev/null +++ b/test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using Xunit; + +[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly)] \ No newline at end of file