public override async Task <bool> ProcessRequestAsync() { InitializeContext(); var context = default(TContext); var success = true; try { context = _application.CreateContext(this); await _application.ProcessRequestAsync(context); } catch (BadHttpRequestException ex) { SetBadRequestState(ex); ReportApplicationError(ex); success = false; } catch (Exception ex) { ReportApplicationError(ex); success = false; } finally { await CompleteResponseBodyAsync(); _streams.Stop(); if (!HasResponseStarted && _applicationException == null && _onStarting != null) { await FireOnStarting(); // Dispose } if (!success && HasResponseStarted && NativeMethods.HttpSupportTrailer(_pInProcessHandler)) { // HTTP/2 INTERNAL_ERROR = 0x2 https://tools.ietf.org/html/rfc7540#section-7 // Otherwise the default is Cancel = 0x8. SetResetCode(2); } if (_onCompleted != null) { await FireOnCompleted(); } } if (!_requestAborted) { await ProduceEnd(); } else if (!HasResponseStarted && _requestRejectedException == null) { // If the request was aborted and no response was sent, there's no // meaningful status code to log. StatusCode = 0; success = false; } try { _application.DisposeContext(context, _applicationException); } catch (Exception ex) { // TODO Log this _applicationException = _applicationException ?? ex; success = false; } finally { // Complete response writer and request reader pipe sides _bodyOutput.Dispose(); _bodyInputPipe?.Reader.Complete(); // Allow writes to drain if (_writeBodyTask != null) { await _writeBodyTask; } // Cancel all remaining IO, there might be reads pending if not entire request body was sent by client AsyncIO?.Dispose(); if (_readBodyTask != null) { await _readBodyTask; } } return(success); }
public override async Task ProcessRequestAsync() { var context = default(TContext); var success = true; try { InitializeContext(); try { context = _application.CreateContext(this); await _application.ProcessRequestAsync(context); } catch (BadHttpRequestException ex) { SetBadRequestState(ex); ReportApplicationError(ex); success = false; } catch (Exception ex) { ReportApplicationError(ex); success = false; } await CompleteResponseBodyAsync(); _streams.Stop(); if (!HasResponseStarted && _applicationException == null && _onStarting != null) { await FireOnStarting(); // Dispose } if (!_requestAborted) { await ProduceEnd(); } else if (!HasResponseStarted && _requestRejectedException == null) { // If the request was aborted and no response was sent, there's no // meaningful status code to log. StatusCode = 0; success = false; } // Complete response writer and request reader pipe sides _bodyOutput.Dispose(); _bodyInputPipe?.Reader.Complete(); // Allow writes to drain if (_writeBodyTask != null) { await _writeBodyTask; } // Cancel all remaining IO, there might be reads pending if not entire request body was sent by client AsyncIO?.Dispose(); if (_readBodyTask != null) { await _readBodyTask; } } catch (Exception ex) { success = false; ReportApplicationError(ex); } finally { // We're done with anything that touches the request or response, unblock the client. PostCompletion(ConvertRequestCompletionResults(success)); if (_onCompleted != null) { await FireOnCompleted(); } try { _application.DisposeContext(context, _applicationException); } catch (Exception ex) { ReportApplicationError(ex); } } }
public override async Task <bool> ProcessRequestAsync() { InitializeContext(); var context = default(TContext); var success = true; try { context = _application.CreateContext(this); await _application.ProcessRequestAsync(context); // TODO Verification of Response //if (Volatile.Read(ref _requestAborted) == 0) //{ // VerifyResponseContentLength(); //} } catch (Exception ex) { ReportApplicationError(ex); success = false; } finally { if (!HasResponseStarted && _applicationException == null && _onStarting != null) { await FireOnStarting(); // Dispose } if (_onCompleted != null) { await FireOnCompleted(); } } if (Volatile.Read(ref _requestAborted) == 0) { await ProduceEnd(); } else if (!HasResponseStarted) { // If the request was aborted and no response was sent, there's no // meaningful status code to log. StatusCode = 0; success = false; } try { _application.DisposeContext(context, _applicationException); } catch (Exception ex) { // TODO Log this _applicationException = _applicationException ?? ex; success = false; } finally { // Complete response writer and request reader pipe sides _bodyOutput.Dispose(); _bodyInputPipe?.Reader.Complete(); // Allow writes to drain if (_writeBodyTask != null) { await _writeBodyTask; } // Cancell all remaining IO, thre might be reads pending if not entire request body was sent // by client AsyncIO.Dispose(); if (_readBodyTask != null) { await _readBodyTask; } } return(success); }