using System; using System.Collections.Generic; using System.Net; using System.Runtime.Serialization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.Common.Exceptions { [Serializable] public class HttpResponseException : Exception { public HttpResponseException(HttpStatusCode status = HttpStatusCode.InternalServerError, object value = null) { Status = status; Value = value; } public HttpResponseException(ActionResult actionResult) { Status = actionResult switch { IStatusCodeActionResult x => (HttpStatusCode)x.StatusCode.GetValueOrDefault((int)HttpStatusCode.InternalServerError), _ => HttpStatusCode.InternalServerError }; Value = actionResult switch { ObjectResult x => x.Value, _ => null }; } public HttpStatusCode Status { get; set; } public object Value { get; set; } public IDictionary AdditionalHeaders { get; } = new Dictionary(); /// /// When overridden in a derived class, sets the with information about the exception. /// /// The that holds the serialized object data about the exception being thrown. /// The that contains contextual information about the source or destination. /// info public override void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) { throw new ArgumentNullException(nameof(info)); } info.AddValue(nameof(Status), Enum.GetName(typeof(HttpStatusCode), Status)); info.AddValue(nameof(Value), Value); info.AddValue(nameof(AdditionalHeaders), AdditionalHeaders); base.GetObjectData(info, context); } public static HttpResponseException CreateValidationErrorResponse(object model) { return new HttpResponseException(HttpStatusCode.BadRequest, model) { AdditionalHeaders = { ["X-Status-Reason"] = "Validation failed" } }; } public static HttpResponseException CreateNotificationValidationErrorResponse(string errorMessage) { var notificationModel = new SimpleNotificationModel { Message = errorMessage }; notificationModel.AddErrorNotification(errorMessage, string.Empty); return CreateValidationErrorResponse(notificationModel); } } }