private void ModifyResponse(HttpStatusCode statusCode, NancyContext context, DefaultStatusCodeHandlerResult result) { if (context.Response == null) { context.Response = new Response { StatusCode = statusCode }; } var contents = this.errorPages[statusCode]; if (!string.IsNullOrEmpty(contents)) { contents = contents.Replace("[DETAILS]", result.Details); } context.Response.ContentType = "text/html"; context.Response.Contents = s => { using (var writer = new StreamWriter(new UnclosableStreamWrapper(s), Encoding.UTF8)) { writer.Write(contents); } }; }
/// <summary> /// Handle the error code /// </summary> /// <param name="statusCode">Status code</param> /// <param name="context">The <see cref="NancyContext"/> instance of the current request.</param> /// <returns>Nancy Response</returns> public void Handle(HttpStatusCode statusCode, NancyContext context) { if (context.Response != null && context.Response.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody)) { return; } if (!this.errorMessages.ContainsKey(statusCode) || !this.errorPages.ContainsKey(statusCode)) { return; } var result = new DefaultStatusCodeHandlerResult(statusCode, this.errorMessages[statusCode], StaticConfiguration.DisableErrorTraces ? DisableErrorTracesTrueMessage : context.GetExceptionDetails()); try { context.Response = this.responseNegotiator.NegotiateResponse(result, context); context.Response.StatusCode = statusCode; return; } catch (ViewNotFoundException) { // No view will be found for `DefaultStatusCodeHandlerResult` // because it is rendered from embedded resources below } this.ModifyResponse(statusCode, context, result); }
/// <summary> /// Handle the error code /// </summary> /// <param name="statusCode">Status code</param> /// <param name="context">The <see cref="NancyContext"/> instance of the current request.</param> /// <returns>Nancy Response</returns> public void Handle(HttpStatusCode statusCode, NancyContext context) { if (context.Response != null && context.Response.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody)) { return; } if (!this.errorMessages.ContainsKey(statusCode) || !this.errorPages.ContainsKey(statusCode)) { return; } Response existingResponse = null; if (context.Response != null) { existingResponse = context.Response; } // Reset negotiation context to avoid any downstream cast exceptions // from swapping a view model with a `DefaultStatusCodeHandlerResult` context.NegotiationContext = new NegotiationContext(); var details = !this.configuration.DisplayErrorTraces ? DisplayErrorTracesFalseMessage : string.Concat("<pre>", context.GetExceptionDetails().Replace("<", ">").Replace(">", "<"), "</pre>"); var result = new DefaultStatusCodeHandlerResult { Details = details, Message = this.errorMessages[statusCode], StatusCode = statusCode }; try { context.Response = this.responseNegotiator.NegotiateResponse(result, context); context.Response.StatusCode = statusCode; if (existingResponse != null) { context.Response.ReasonPhrase = existingResponse.ReasonPhrase; } return; } catch (ViewNotFoundException) { // No view will be found for `DefaultStatusCodeHandlerResult` // because it is rendered from embedded resources below } this.ModifyResponse(statusCode, context, result); }
/// <summary> /// Handle the error code /// </summary> /// <param name="statusCode">Status code</param> /// <param name="context">The <see cref="NancyContext"/> instance of the current request.</param> /// <returns>Nancy Response</returns> public void Handle(HttpStatusCode statusCode, NancyContext context) { if (context.Response != null && context.Response.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody)) { return; } if (!this.errorMessages.ContainsKey(statusCode) || !this.errorPages.ContainsKey(statusCode)) { return; } Response existingResponse = null; if (context.Response != null) { existingResponse = context.Response; } // Reset negotiation context to avoid any downstream cast exceptions // from swapping a view model with a `DefaultStatusCodeHandlerResult` context.NegotiationContext = new NegotiationContext(); var result = new DefaultStatusCodeHandlerResult(statusCode, this.errorMessages[statusCode], StaticConfiguration.DisableErrorTraces ? DisableErrorTracesTrueMessage : context.GetExceptionDetails()); try { context.Response = this.responseNegotiator.NegotiateResponse(result, context); context.Response.StatusCode = statusCode; if (existingResponse != null) { context.Response.ReasonPhrase = existingResponse.ReasonPhrase; } return; } catch (ViewNotFoundException) { // No view will be found for `DefaultStatusCodeHandlerResult` // because it is rendered from embedded resources below } this.ModifyResponse(statusCode, context, result); }