Skip to content
This repository was archived by the owner on Dec 18, 2018. It is now read-only.

Commit a4b6cb7

Browse files
author
Cesar Blum Silveira
committed
Reset frame streams on each request (#940).
1 parent a09bce0 commit a4b6cb7

File tree

3 files changed

+102
-18
lines changed
  • src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http
  • test

3 files changed

+102
-18
lines changed

src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,12 @@ public void InitializeStreams(MessageBody messageBody)
242242
if (_frameStreams == null)
243243
{
244244
_frameStreams = new Streams(this);
245-
RequestBody = _frameStreams.RequestBody;
246-
ResponseBody = _frameStreams.ResponseBody;
247-
DuplexStream = _frameStreams.DuplexStream;
248245
}
249246

247+
RequestBody = _frameStreams.RequestBody;
248+
ResponseBody = _frameStreams.ResponseBody;
249+
DuplexStream = _frameStreams.DuplexStream;
250+
250251
_frameStreams.RequestBody.StartAcceptingReads(messageBody);
251252
_frameStreams.ResponseBody.StartAcceptingWrites();
252253
}

test/Microsoft.AspNetCore.Server.Kestrel.FunctionalTests/RequestTests.cs

Lines changed: 60 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

4+
using System;
45
using System.Globalization;
6+
using System.IO;
57
using System.Net;
68
using System.Net.Http;
79
using System.Net.Sockets;
@@ -97,19 +99,6 @@ public void LargeUpload(long contentLength, bool checkBytes)
9799
}
98100
}
99101

100-
[Fact]
101-
public Task RemoteIPv4Address()
102-
{
103-
return TestRemoteIPAddress("127.0.0.1", "127.0.0.1", "127.0.0.1");
104-
}
105-
106-
[ConditionalFact]
107-
[IPv6SupportedCondition]
108-
public Task RemoteIPv6Address()
109-
{
110-
return TestRemoteIPAddress("[::1]", "[::1]", "::1");
111-
}
112-
113102
[Fact]
114103
public async Task DoesNotHangOnConnectionCloseRequest()
115104
{
@@ -137,6 +126,64 @@ public async Task DoesNotHangOnConnectionCloseRequest()
137126
}
138127
}
139128

129+
[Fact]
130+
public async Task StreamsAreNotPersistedAcrossRequests()
131+
{
132+
var requestBodyPersisted = false;
133+
var responseBodyPersisted = false;
134+
135+
var builder = new WebHostBuilder()
136+
.UseKestrel()
137+
.UseUrls($"http://127.0.0.1:0")
138+
.Configure(app =>
139+
{
140+
app.Run(async context =>
141+
{
142+
if (context.Request.Body is MemoryStream)
143+
{
144+
requestBodyPersisted = true;
145+
}
146+
147+
if (context.Response.Body is MemoryStream)
148+
{
149+
responseBodyPersisted = true;
150+
}
151+
152+
context.Request.Body = new MemoryStream();
153+
context.Response.Body = new MemoryStream();
154+
155+
await context.Response.WriteAsync("hello, world");
156+
});
157+
});
158+
159+
using (var host = builder.Build())
160+
{
161+
host.Start();
162+
163+
using (var client = new HttpClient { BaseAddress = new Uri($"http://127.0.0.1:{host.GetPort()}") })
164+
{
165+
await client.GetAsync("/");
166+
await client.GetAsync("/");
167+
168+
Assert.False(requestBodyPersisted);
169+
Assert.False(responseBodyPersisted);
170+
}
171+
}
172+
}
173+
174+
[Fact]
175+
public Task RemoteIPv4Address()
176+
{
177+
return TestRemoteIPAddress("127.0.0.1", "127.0.0.1", "127.0.0.1");
178+
}
179+
180+
[ConditionalFact]
181+
[IPv6SupportedCondition]
182+
public Task RemoteIPv6Address()
183+
{
184+
return TestRemoteIPAddress("[::1]", "[::1]", "::1");
185+
}
186+
140187
private async Task TestRemoteIPAddress(string registerAddress, string requestAddress, string expectAddress)
141188
{
142189
var builder = new WebHostBuilder()

test/Microsoft.AspNetCore.Server.KestrelTests/FrameTests.cs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.IO;
56
using System.Text;
67
using Microsoft.AspNetCore.Http.Features;
78
using Microsoft.AspNetCore.Server.Kestrel;
@@ -453,9 +454,10 @@ public void InitializeHeadersResetsRequestHeaders()
453454
var frame = new Frame<object>(application: null, context: connectionContext);
454455
frame.InitializeHeaders();
455456

456-
// Act
457457
var originalRequestHeaders = frame.RequestHeaders;
458458
frame.RequestHeaders = new FrameRequestHeaders();
459+
460+
// Act
459461
frame.InitializeHeaders();
460462

461463
// Assert
@@ -476,13 +478,47 @@ public void InitializeHeadersResetsResponseHeaders()
476478
var frame = new Frame<object>(application: null, context: connectionContext);
477479
frame.InitializeHeaders();
478480

479-
// Act
480481
var originalResponseHeaders = frame.ResponseHeaders;
481482
frame.ResponseHeaders = new FrameResponseHeaders();
483+
484+
// Act
482485
frame.InitializeHeaders();
483486

484487
// Assert
485488
Assert.Same(originalResponseHeaders, frame.ResponseHeaders);
486489
}
490+
491+
[Fact]
492+
public void InitializeStreamsResetsStreams()
493+
{
494+
// Arrange
495+
var connectionContext = new ConnectionContext()
496+
{
497+
DateHeaderValueManager = new DateHeaderValueManager(),
498+
ServerAddress = ServerAddress.FromUrl("http://localhost:5000"),
499+
ServerOptions = new KestrelServerOptions(),
500+
SocketOutput = new MockSocketOuptut()
501+
};
502+
var frame = new Frame<object>(application: null, context: connectionContext);
503+
frame.InitializeHeaders();
504+
505+
var messageBody = MessageBody.For("HTTP/1.1", (FrameRequestHeaders)frame.RequestHeaders, frame);
506+
frame.InitializeStreams(messageBody);
507+
508+
var originalRequestBody = frame.RequestBody;
509+
var originalResponseBody = frame.ResponseBody;
510+
var originalDuplexStream = frame.DuplexStream;
511+
frame.RequestBody = new MemoryStream();
512+
frame.ResponseBody = new MemoryStream();
513+
frame.DuplexStream = new MemoryStream();
514+
515+
// Act
516+
frame.InitializeStreams(messageBody);
517+
518+
// Assert
519+
Assert.Same(originalRequestBody, frame.RequestBody);
520+
Assert.Same(originalResponseBody, frame.ResponseBody);
521+
Assert.Same(originalDuplexStream, frame.DuplexStream);
522+
}
487523
}
488524
}

0 commit comments

Comments
 (0)