Reset frame streams on each request (#940).
This commit is contained in:
parent
a09bce0c07
commit
9f720eda90
|
|
@ -242,11 +242,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http
|
||||||
if (_frameStreams == null)
|
if (_frameStreams == null)
|
||||||
{
|
{
|
||||||
_frameStreams = new Streams(this);
|
_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.RequestBody.StartAcceptingReads(messageBody);
|
||||||
_frameStreams.ResponseBody.StartAcceptingWrites();
|
_frameStreams.ResponseBody.StartAcceptingWrites();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// 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.Globalization;
|
||||||
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Net.Sockets;
|
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)
|
private async Task TestRemoteIPAddress(string registerAddress, string requestAddress, string expectAddress)
|
||||||
{
|
{
|
||||||
var builder = new WebHostBuilder()
|
var builder = new WebHostBuilder()
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.AspNetCore.Http.Features;
|
using Microsoft.AspNetCore.Http.Features;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel;
|
using Microsoft.AspNetCore.Server.Kestrel;
|
||||||
|
|
@ -453,9 +454,10 @@ namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
var frame = new Frame<object>(application: null, context: connectionContext);
|
var frame = new Frame<object>(application: null, context: connectionContext);
|
||||||
frame.InitializeHeaders();
|
frame.InitializeHeaders();
|
||||||
|
|
||||||
// Act
|
|
||||||
var originalRequestHeaders = frame.RequestHeaders;
|
var originalRequestHeaders = frame.RequestHeaders;
|
||||||
frame.RequestHeaders = new FrameRequestHeaders();
|
frame.RequestHeaders = new FrameRequestHeaders();
|
||||||
|
|
||||||
|
// Act
|
||||||
frame.InitializeHeaders();
|
frame.InitializeHeaders();
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -476,13 +478,47 @@ namespace Microsoft.AspNetCore.Server.KestrelTests
|
||||||
var frame = new Frame<object>(application: null, context: connectionContext);
|
var frame = new Frame<object>(application: null, context: connectionContext);
|
||||||
frame.InitializeHeaders();
|
frame.InitializeHeaders();
|
||||||
|
|
||||||
// Act
|
|
||||||
var originalResponseHeaders = frame.ResponseHeaders;
|
var originalResponseHeaders = frame.ResponseHeaders;
|
||||||
frame.ResponseHeaders = new FrameResponseHeaders();
|
frame.ResponseHeaders = new FrameResponseHeaders();
|
||||||
|
|
||||||
|
// Act
|
||||||
frame.InitializeHeaders();
|
frame.InitializeHeaders();
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Same(originalResponseHeaders, frame.ResponseHeaders);
|
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<object>(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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue