Return FINISH_REQUEST on request failure (#469)

This commit is contained in:
Justin Kotalik 2017-11-01 15:48:04 -07:00 committed by GitHub
parent bcc10d3012
commit a42c8a33b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 6 deletions

View File

@ -805,7 +805,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
return _readWebSocketsOperation;
}
public abstract Task ProcessRequestAsync();
public abstract Task<bool> ProcessRequestAsync();
public void OnStarting(Func<object, Task> callback, object state)
{

View File

@ -19,9 +19,10 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
_application = application;
}
public override async Task ProcessRequestAsync()
public override async Task<bool> ProcessRequestAsync()
{
var context = default(TContext);
var success = true;
try
{
@ -37,6 +38,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
catch (Exception ex)
{
ReportApplicationError(ex);
success = false;
}
finally
{
@ -61,6 +63,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
// If the request was aborted and no response was sent, there's no
// meaningful status code to log.
StatusCode = 0;
success = false;
}
try
@ -71,6 +74,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
{
// TODO Log this
_applicationException = _applicationException ?? ex;
success = false;
}
finally
{
@ -90,6 +94,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
await _readingTask;
}
}
return success;
}
}
}

View File

@ -74,10 +74,10 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
if (task.IsCompleted)
{
context.Dispose();
return NativeMethods.REQUEST_NOTIFICATION_STATUS.RQ_NOTIFICATION_CONTINUE;
return ConvertRequestCompletionResults(task.Result);
}
task.ContinueWith((t, state) => CompleteRequest((IISHttpContext)state), context);
task.ContinueWith((t, state) => CompleteRequest((IISHttpContext)state, t), context);
return NativeMethods.REQUEST_NOTIFICATION_STATUS.RQ_NOTIFICATION_PENDING;
}
@ -96,15 +96,21 @@ namespace Microsoft.AspNetCore.Server.IISIntegration
return NativeMethods.REQUEST_NOTIFICATION_STATUS.RQ_NOTIFICATION_PENDING;
}
private static void CompleteRequest(IISHttpContext context)
private static void CompleteRequest(IISHttpContext context, Task<bool> completedTask)
{
// Post completion after completing the request to resume the state machine
context.PostCompletion(NativeMethods.REQUEST_NOTIFICATION_STATUS.RQ_NOTIFICATION_CONTINUE);
context.PostCompletion(ConvertRequestCompletionResults(completedTask.Result));
// Dispose the context
context.Dispose();
}
private static NativeMethods.REQUEST_NOTIFICATION_STATUS ConvertRequestCompletionResults(bool success)
{
return success ? NativeMethods.REQUEST_NOTIFICATION_STATUS.RQ_NOTIFICATION_CONTINUE
: NativeMethods.REQUEST_NOTIFICATION_STATUS.RQ_NOTIFICATION_FINISH_REQUEST;
}
private class IISContextFactory<T> : IISContextFactory
{
private readonly IHttpApplication<T> _application;