| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- using MAX;
- using Microsoft.AspNetCore.Http;
- using Microsoft.Extensions.Logging;
- using Newtonsoft.Json;
- using System;
- using System.Threading.Tasks;
- namespace BulkPrintingAPI.Middleware
- {
- public class ExceptionHandlerMiddleware
- {
- private readonly RequestDelegate _next;
- private ILogger _logger;
- private class ErrorResponse
- {
- public ErrorResponse(string message)
- {
- code = null;
- error = message;
- }
- public ErrorResponse(MAXException e)
- {
- code = e.ErrorCode;
- error = e.Message;
- }
- public int? code { get; set; }
- public string error { get; set; }
- }
- public ExceptionHandlerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
- {
- _next = next;
- _logger = loggerFactory.CreateLogger(GetType().FullName);
- }
- public async Task Invoke(HttpContext context)
- {
- try
- {
- await _next(context);
- }
- catch (Exception e)
- {
- if (context.Response.HasStarted)
- {
- _logger.LogWarning("Response has already started; exception will be rethrown");
- throw;
- }
- _logger.LogError(0, e, "Unhandled exception");
- ErrorResponse response;
- if (e is MAXException)
- {
- response = new ErrorResponse((MAXException)e);
- }
- else
- {
- // Don't want to leak arbitrary exception messages to the user
- response = new ErrorResponse("The server encountered an unexpected error");
- }
- context.Response.StatusCode = 500;
- context.Response.ContentType = "application/json";
- await context.Response.WriteAsync(JsonConvert.SerializeObject(response));
- }
- }
- }
- }
|