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;
}
}
}