using System.Configuration; using System.Web; using Nancy; using Nancy.ErrorHandling; using Nancy.Extensions; using Nancy.Responses; namespace Sony.Filtr.AdminAPI.Config { public class ErrorStatusCodeHandler : IStatusCodeHandler { public void Handle(HttpStatusCode statusCode, NancyContext context) { switch (statusCode) { case HttpStatusCode.NotFound: context.Response = new JsonResponse(new StatusMessage() { Message = "Resource not found."}, new DefaultJsonSerializer()).WithStatusCode(statusCode); break; case HttpStatusCode.InternalServerError: context.Response = new JsonResponse(new StatusMessage() { Message = GetErrorMessage(context) }, new DefaultJsonSerializer()).WithStatusCode(statusCode); break; case HttpStatusCode.BadRequest: context.Response = new JsonResponse(new StatusMessage() { Message = context.Response.ReasonPhrase ?? "Bad request" }, new DefaultJsonSerializer()).WithStatusCode(statusCode); break; case HttpStatusCode.Unauthorized: context.Response = new JsonResponse(new StatusMessage() { Message = "Unauthorized" }, new DefaultJsonSerializer()).WithStatusCode(statusCode); break; default: break; } } private string GetErrorMessage(NancyContext context) { if (HttpContext.Current == null || HttpContext.Current.IsCustomErrorEnabled) { return "An internal error occurred."; } return context.GetException()?.InnerException?.ToString(); } public bool HandlesStatusCode(HttpStatusCode statusCode, NancyContext context) { return (statusCode == HttpStatusCode.InternalServerError || statusCode == HttpStatusCode.NotFound || statusCode == HttpStatusCode.BadRequest || statusCode == HttpStatusCode.Unauthorized); } } public class StatusMessage { public string Message { get; set; } } }