Check HasStarted before calling Flush/Start in StartAsync (#8041)

This commit is contained in:
Justin Kotalik 2019-02-28 22:45:24 -08:00 committed by GitHub
parent 3509323ad1
commit 5fd53d9d07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 0 deletions

View File

@ -151,6 +151,11 @@ namespace Microsoft.AspNetCore.Http.Internal
public override Task StartAsync(CancellationToken cancellationToken = default)
{
if (HasStarted)
{
return Task.CompletedTask;
}
if (HttpResponseStartFeature == null)
{
return HttpResponseFeature.Body.FlushAsync(cancellationToken);

View File

@ -110,6 +110,10 @@ namespace Microsoft.AspNetCore.Http.Internal
mock.Setup(o => o.StartAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
features.Set(mock.Object);
var responseMock = new Mock<IHttpResponseFeature>();
responseMock.Setup(o => o.HasStarted).Returns(false);
features.Set(responseMock.Object);
var context = new DefaultHttpContext(features);
await context.Response.StartAsync();
@ -126,12 +130,35 @@ namespace Microsoft.AspNetCore.Http.Internal
mock.Setup(o => o.StartAsync(It.Is<CancellationToken>((localCt) => localCt.Equals(ct)))).Returns(Task.CompletedTask);
features.Set(mock.Object);
var responseMock = new Mock<IHttpResponseFeature>();
responseMock.Setup(o => o.HasStarted).Returns(false);
features.Set(responseMock.Object);
var context = new DefaultHttpContext(features);
await context.Response.StartAsync(ct);
mock.Verify(m => m.StartAsync(default), Times.Once());
}
[Fact]
public async Task ResponseStart_DoesNotCallStartIfHasStartedIsTrue()
{
var features = new FeatureCollection();
var startMock = new Mock<IHttpResponseStartFeature>();
startMock.Setup(o => o.StartAsync(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
features.Set(startMock.Object);
var responseMock = new Mock<IHttpResponseFeature>();
responseMock.Setup(o => o.HasStarted).Returns(true);
features.Set(responseMock.Object);
var context = new DefaultHttpContext(features);
await context.Response.StartAsync();
startMock.Verify(m => m.StartAsync(default), Times.Never());
}
[Fact]
public async Task ResponseStart_CallsResponseBodyFlushIfNotSet()
{