Add new HeadersSent API.
This commit is contained in:
parent
ff0714fe6a
commit
f6c1a559a0
|
|
@ -348,6 +348,11 @@ namespace Microsoft.AspNet.Server.WebListener
|
|||
set { _responseHeaders = value; }
|
||||
}
|
||||
|
||||
bool IHttpResponseFeature.HeadersSent
|
||||
{
|
||||
get { return Response.HeadersSent; }
|
||||
}
|
||||
|
||||
void IHttpResponseFeature.OnSendingHeaders(Action<object> callback, object state)
|
||||
{
|
||||
Response.OnSendingHeaders(callback, state);
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ namespace Microsoft.AspNet.Server.WebListener
|
|||
catch (Exception ex)
|
||||
{
|
||||
LogHelper.LogException(_logger, "ProcessRequestAsync", ex);
|
||||
if (requestContext.Response.SentHeaders)
|
||||
if (requestContext.Response.HeadersSent)
|
||||
{
|
||||
requestContext.Abort();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ namespace Microsoft.Net.Http.Server
|
|||
|
||||
public Task<Stream> UpgradeAsync()
|
||||
{
|
||||
if (!IsUpgradableRequest || _response.SentHeaders)
|
||||
if (!IsUpgradableRequest || _response.HeadersSent)
|
||||
{
|
||||
throw new InvalidOperationException();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ namespace Microsoft.Net.Http.Server
|
|||
}
|
||||
}
|
||||
|
||||
public bool SentHeaders
|
||||
public bool HeadersSent
|
||||
{
|
||||
get
|
||||
{
|
||||
|
|
@ -356,7 +356,7 @@ namespace Microsoft.Net.Http.Server
|
|||
UnsafeNclNativeMethods.HttpApi.HTTP_FLAGS flags,
|
||||
bool isOpaqueUpgrade)
|
||||
{
|
||||
Debug.Assert(!SentHeaders, "HttpListenerResponse::SendHeaders()|SentHeaders is true.");
|
||||
Debug.Assert(!HeadersSent, "HttpListenerResponse::SendHeaders()|SentHeaders is true.");
|
||||
|
||||
// TODO: Verbose log headers
|
||||
_responseState = ResponseState.SentHeaders;
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ namespace Microsoft.Net.Http.Server
|
|||
// Send headers
|
||||
public override void Flush()
|
||||
{
|
||||
if (_closed || _requestContext.Response.SentHeaders)
|
||||
if (_closed || _requestContext.Response.HeadersSent)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -127,7 +127,7 @@ namespace Microsoft.Net.Http.Server
|
|||
// Send headers
|
||||
public override Task FlushAsync(CancellationToken cancellationToken)
|
||||
{
|
||||
if (_closed || _requestContext.Response.SentHeaders)
|
||||
if (_closed || _requestContext.Response.HeadersSent)
|
||||
{
|
||||
return Helpers.CompletedTask();
|
||||
}
|
||||
|
|
@ -275,7 +275,7 @@ namespace Microsoft.Net.Http.Server
|
|||
uint dataToWrite = (uint)size;
|
||||
SafeLocalFree bufferAsIntPtr = null;
|
||||
IntPtr pBufferAsIntPtr = IntPtr.Zero;
|
||||
bool sentHeaders = _requestContext.Response.SentHeaders;
|
||||
bool sentHeaders = _requestContext.Response.HeadersSent;
|
||||
try
|
||||
{
|
||||
if (size == 0)
|
||||
|
|
@ -398,7 +398,7 @@ namespace Microsoft.Net.Http.Server
|
|||
uint statusCode;
|
||||
uint bytesSent = 0;
|
||||
flags |= _leftToWrite == size ? UnsafeNclNativeMethods.HttpApi.HTTP_FLAGS.NONE : UnsafeNclNativeMethods.HttpApi.HTTP_FLAGS.HTTP_SEND_RESPONSE_FLAG_MORE_DATA;
|
||||
bool sentHeaders = _requestContext.Response.SentHeaders;
|
||||
bool sentHeaders = _requestContext.Response.HeadersSent;
|
||||
ResponseStreamAsyncResult asyncResult = new ResponseStreamAsyncResult(this, state, callback, buffer, offset, size, _requestContext.Response.BoundaryType == BoundaryType.Chunked, sentHeaders);
|
||||
|
||||
// Update m_LeftToWrite now so we can queue up additional BeginWrite's without waiting for EndWrite.
|
||||
|
|
@ -543,7 +543,7 @@ namespace Microsoft.Net.Http.Server
|
|||
uint statusCode;
|
||||
uint bytesSent = 0;
|
||||
flags |= _leftToWrite == size ? UnsafeNclNativeMethods.HttpApi.HTTP_FLAGS.NONE : UnsafeNclNativeMethods.HttpApi.HTTP_FLAGS.HTTP_SEND_RESPONSE_FLAG_MORE_DATA;
|
||||
bool sentHeaders = _requestContext.Response.SentHeaders;
|
||||
bool sentHeaders = _requestContext.Response.HeadersSent;
|
||||
ResponseStreamAsyncResult asyncResult = new ResponseStreamAsyncResult(this, null, null, buffer, offset, size, _requestContext.Response.BoundaryType == BoundaryType.Chunked, sentHeaders, cancellationRegistration);
|
||||
|
||||
// Update m_LeftToWrite now so we can queue up additional BeginWrite's without waiting for EndWrite.
|
||||
|
|
@ -649,7 +649,7 @@ namespace Microsoft.Net.Http.Server
|
|||
uint statusCode;
|
||||
uint bytesSent = 0;
|
||||
flags |= _leftToWrite == size ? UnsafeNclNativeMethods.HttpApi.HTTP_FLAGS.NONE : UnsafeNclNativeMethods.HttpApi.HTTP_FLAGS.HTTP_SEND_RESPONSE_FLAG_MORE_DATA;
|
||||
bool sentHeaders = _requestContext.Response.SentHeaders;
|
||||
bool sentHeaders = _requestContext.Response.HeadersSent;
|
||||
ResponseStreamAsyncResult asyncResult = new ResponseStreamAsyncResult(this, null, null, fileName, offset, size,
|
||||
_requestContext.Response.BoundaryType == BoundaryType.Chunked, sentHeaders, cancellationRegistration);
|
||||
|
||||
|
|
@ -768,7 +768,7 @@ namespace Microsoft.Net.Http.Server
|
|||
LogHelper.LogError(_requestContext.Logger, "ResponseStream::Dispose", "Fewer bytes were written than were specified in the Content-Length.");
|
||||
return;
|
||||
}
|
||||
bool sentHeaders = _requestContext.Response.SentHeaders;
|
||||
bool sentHeaders = _requestContext.Response.HeadersSent;
|
||||
if (sentHeaders && _leftToWrite == 0)
|
||||
{
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -245,7 +245,9 @@ namespace Microsoft.AspNet.Server.WebListener
|
|||
responseHeaders.Add("Custom1", new string[] { "value1a", "value1b" });
|
||||
responseHeaders.Add("Custom2", new string[] { "value2a, value2b" });
|
||||
var body = responseInfo.Body;
|
||||
Assert.False(responseInfo.HeadersSent);
|
||||
body.Flush();
|
||||
Assert.True(responseInfo.HeadersSent);
|
||||
Assert.Throws<InvalidOperationException>(() => responseInfo.StatusCode = 404);
|
||||
Assert.Throws<InvalidOperationException>(() => responseHeaders.Add("Custom3", new string[] { "value3a, value3b", "value3c" }));
|
||||
return Task.FromResult(0);
|
||||
|
|
@ -275,7 +277,9 @@ namespace Microsoft.AspNet.Server.WebListener
|
|||
responseHeaders.Add("Custom1", new string[] { "value1a", "value1b" });
|
||||
responseHeaders.Add("Custom2", new string[] { "value2a, value2b" });
|
||||
var body = responseInfo.Body;
|
||||
Assert.False(responseInfo.HeadersSent);
|
||||
await body.FlushAsync();
|
||||
Assert.True(responseInfo.HeadersSent);
|
||||
Assert.Throws<InvalidOperationException>(() => responseInfo.StatusCode = 404);
|
||||
Assert.Throws<InvalidOperationException>(() => responseHeaders.Add("Custom3", new string[] { "value3a, value3b", "value3c" }));
|
||||
}))
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ namespace Microsoft.AspNet.Server.WebListener
|
|||
{
|
||||
var httpContext = new DefaultHttpContext((IFeatureCollection)env);
|
||||
Assert.Equal(200, httpContext.Response.StatusCode);
|
||||
Assert.False(httpContext.Response.HeadersSent);
|
||||
return Task.FromResult(0);
|
||||
}))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -232,7 +232,9 @@ namespace Microsoft.Net.Http.Server
|
|||
responseHeaders.SetValues("Custom1", "value1a", "value1b");
|
||||
responseHeaders.SetValues("Custom2", "value2a, value2b");
|
||||
var body = context.Response.Body;
|
||||
Assert.False(context.Response.HeadersSent);
|
||||
body.Flush();
|
||||
Assert.True(context.Response.HeadersSent);
|
||||
var ex = Assert.Throws<InvalidOperationException>(() => context.Response.StatusCode = 404);
|
||||
Assert.Equal("Headers already sent.", ex.Message);
|
||||
ex = Assert.Throws<InvalidOperationException>(() => responseHeaders.Add("Custom3", new string[] { "value3a, value3b", "value3c" }));
|
||||
|
|
@ -266,7 +268,9 @@ namespace Microsoft.Net.Http.Server
|
|||
responseHeaders.SetValues("Custom1", "value1a", "value1b");
|
||||
responseHeaders.SetValues("Custom2", "value2a, value2b");
|
||||
var body = context.Response.Body;
|
||||
Assert.False(context.Response.HeadersSent);
|
||||
await body.FlushAsync();
|
||||
Assert.True(context.Response.HeadersSent);
|
||||
var ex = Assert.Throws<InvalidOperationException>(() => context.Response.StatusCode = 404);
|
||||
Assert.Equal("Headers already sent.", ex.Message);
|
||||
ex = Assert.Throws<InvalidOperationException>(() => responseHeaders.Add("Custom3", new string[] { "value3a, value3b", "value3c" }));
|
||||
|
|
|
|||
Loading…
Reference in New Issue