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

Commit 9f720ed

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

File tree

3 files changed

+89
-5
lines changed
  • src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http
  • test

3 files changed

+89
-5
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: 47 additions & 0 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;
@@ -137,6 +139,51 @@ public async Task DoesNotHangOnConnectionCloseRequest()
137139
}
138140
}
139141

142+
[Fact]
143+
public async Task StreamsAreNotPersistedAcrossRequests()
144+
{
145+
var requestBodyPersisted = false;
146+
var responseBodyPersisted = false;
147+
148+
var builder = new WebHostBuilder()
149+
.UseKestrel()
150+
.UseUrls($"http://127.0.0.1:0")
151+
.Configure(app =>
152+
{
153+
app.Run(async context =>
154+
{
155+
if (context.Request.Body is MemoryStream)
156+
{
157+
requestBodyPersisted = true;
158+
}
159+
160+
if (context.Response.Body is MemoryStream)
161+
{
162+
responseBodyPersisted = true;
163+
}
164+
165+
context.Request.Body = new MemoryStream();
166+
context.Response.Body = new MemoryStream();
167+
168+
await context.Response.WriteAsync("hello, world");
169+
});
170+
});
171+
172+
using (var host = builder.Build())
173+
{
174+
host.Start();
175+
176+
using (var client = new HttpClient { BaseAddress = new Uri($"http://127.0.0.1:{host.GetPort()}") })
177+
{
178+
await client.GetAsync("/");
179+
await client.GetAsync("/");
180+
181+
Assert.False(requestBodyPersisted);
182+
Assert.False(responseBodyPersisted);
183+
}
184+
}
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)