using System; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http.ModelBinding; using Microsoft.Owin; using Umbraco.Core; using Umbraco.Web.Models.ContentEditing; namespace Umbraco.Web.WebApi { public static class HttpRequestMessageExtensions { /// /// Borrowed from the latest Microsoft.AspNet.WebApi.Owin package which we cannot use because of a later webapi dependency /// /// /// internal static Attempt TryGetOwinContext(this HttpRequestMessage request) { // occurs in unit tests? if (request.Properties.TryGetValue("MS_OwinContext", out var o) && o is IOwinContext owinContext) return Attempt.Succeed(owinContext); var httpContext = request.TryGetHttpContext(); try { return httpContext ? Attempt.Succeed(httpContext.Result.GetOwinContext()) : Attempt.Fail(); } catch (InvalidOperationException) { //this will occur if there is no OWIN environment which generally would only be in things like unit tests return Attempt.Fail(); } } /// /// Tries to retrieve the current HttpContext if one exists. /// /// public static Attempt TryGetHttpContext(this HttpRequestMessage request) { object context; if (request.Properties.TryGetValue("MS_HttpContext", out context)) { var httpContext = context as HttpContextBase; if (httpContext != null) { return Attempt.Succeed(httpContext); } } if (HttpContext.Current != null) { return Attempt.Succeed(new HttpContextWrapper(HttpContext.Current)); } return Attempt.Fail(); } /// /// Create a 403 (Forbidden) response indicating that hte current user doesn't have access to the resource /// requested or the action it needs to take. /// /// /// /// /// This is different from a 401 which indicates that the user is not logged in. /// public static HttpResponseMessage CreateUserNoAccessResponse(this HttpRequestMessage request) { return request.CreateResponse(HttpStatusCode.Forbidden); } /// /// Create a 400 response message indicating that a validation error occurred /// /// /// /// /// public static HttpResponseMessage CreateValidationErrorResponse(this HttpRequestMessage request, T value) { var msg = request.CreateResponse(HttpStatusCode.BadRequest, value); msg.Headers.Add("X-Status-Reason", "Validation failed"); return msg; } /// /// Create a 400 response message indicating that a validation error occurred /// /// /// public static HttpResponseMessage CreateValidationErrorResponse(this HttpRequestMessage request) { var msg = request.CreateResponse(HttpStatusCode.BadRequest); msg.Headers.Add("X-Status-Reason", "Validation failed"); return msg; } /// /// Create a 400 response message indicating that a validation error occurred /// /// /// /// public static HttpResponseMessage CreateValidationErrorResponse(this HttpRequestMessage request, string errorMessage) { var msg = request.CreateErrorResponse(HttpStatusCode.BadRequest, errorMessage); msg.Headers.Add("X-Status-Reason", "Validation failed"); return msg; } /// /// Creates an error response with notifications in the result to be displayed in the UI /// /// /// /// public static HttpResponseMessage CreateNotificationValidationErrorResponse(this HttpRequestMessage request, string errorMessage) { var notificationModel = new SimpleNotificationModel { Message = errorMessage }; notificationModel.AddErrorNotification(errorMessage, string.Empty); return request.CreateValidationErrorResponse(notificationModel); } /// /// Creates a succressful response with notifications in the result to be displayed in the UI /// /// /// /// public static HttpResponseMessage CreateNotificationSuccessResponse(this HttpRequestMessage request, string successMessage) { var notificationModel = new SimpleNotificationModel { Message = successMessage }; notificationModel.AddSuccessNotification(successMessage, string.Empty); return request.CreateResponse(HttpStatusCode.OK, notificationModel); } /// /// Create a 400 response message indicating that a validation error occurred /// /// /// /// public static HttpResponseMessage CreateValidationErrorResponse(this HttpRequestMessage request, ModelStateDictionary modelState) { var msg = request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState); msg.Headers.Add("X-Status-Reason", "Validation failed"); return msg; } } }