using System; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Web; using Microsoft.Owin; using Umbraco.Core; namespace Umbraco.Web { /// /// Extension methods used to check/set cookie values /// /// /// This should 100% supercede the StateManager.Cookies /// internal static class HttpCookieExtensions { /// /// Retrieves an individual cookie from the cookies collection /// /// /// /// /// /// Adapted from: https://stackoverflow.com/a/29057304/5018 because there's an issue with .NET WebApi cookie parsing logic /// when using requestHeaders.GetCookies() when an invalid cookie name is present. /// public static string GetCookieValue(this HttpRequestHeaders requestHeaders, string cookieName) { foreach (var header in requestHeaders) { if (header.Key.Equals("Cookie", StringComparison.InvariantCultureIgnoreCase) == false) continue; var cookiesHeaderValue = header.Value.FirstOrDefault(); if (cookiesHeaderValue == null) return null; var cookieCollection = cookiesHeaderValue.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (var cookieNameValue in cookieCollection) { var parts = cookieNameValue.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length != 2) continue; if (parts[0].Trim().Equals(cookieName, StringComparison.InvariantCultureIgnoreCase)) return parts[1].Trim(); } } return null; } /// /// Removes the cookie from the request and the response if it exists /// /// /// public static void ExpireCookie(this HttpContextBase http, string cookieName) { //remove from the request http.Request.Cookies.Remove(cookieName); //expire from the response var angularCookie = http.Response.Cookies[cookieName]; if (angularCookie != null) { //this will expire immediately and be removed from the browser angularCookie.Expires = DateTime.Now.AddYears(-1); } else { //ensure there's def an expired cookie http.Response.Cookies.Add(new HttpCookie(cookieName) { Expires = DateTime.Now.AddYears(-1) }); } } /// /// Removes the cookie from the request and the response if it exists /// /// /// public static void ExpireCookie(this HttpContext http, string cookieName) { new HttpContextWrapper(http).ExpireCookie(cookieName); } public static string GetPreviewCookieValue(this HttpRequestMessage request) { var cookie = request.Headers.GetCookies(Constants.Web.PreviewCookieName).FirstOrDefault(); if (cookie != null) { if (cookie[Constants.Web.PreviewCookieName] != null) { return cookie[Constants.Web.PreviewCookieName].Value; } } return null; } public static string GetPreviewCookieValue(this HttpRequestBase request) { return request.GetCookieValue(Constants.Web.PreviewCookieName); } public static string GetPreviewCookieValue(this HttpRequest request) { return new HttpRequestWrapper(request).GetPreviewCookieValue(); } /// /// Does a preview cookie exist ? /// /// /// public static bool HasPreviewCookie(this HttpRequestBase request) { return request.Cookies[Constants.Web.PreviewCookieName] != null; } /// /// Does a preview cookie exist ? /// /// /// public static bool HasPreviewCookie(this HttpRequest request) { return new HttpRequestWrapper(request).HasPreviewCookie(); } /// /// Does a preview cookie exist ? /// /// /// public static bool HasPreviewCookie(this IOwinRequest request) { return request.Cookies[Constants.Web.PreviewCookieName] != null; } /// /// Returns the cookie's string value /// /// /// /// public static string GetCookieValue(this HttpRequestBase request, string cookieName) { var cookie = request.Cookies.Get(cookieName); if (cookie != null) { if (cookie.Value.IsNullOrWhiteSpace() == false) { return cookie.Value; } } return null; } /// /// Returns the cookie's string value /// /// /// /// public static string GetCookieValue(this HttpRequest request, string cookieName) { return new HttpRequestWrapper(request).GetCookieValue(cookieName); } /// /// Does a cookie exist with the specified key ? /// /// /// /// public static bool HasCookie(this HttpRequestBase request, string key) { return request.Cookies[key] != null; } /// /// Does a cookie exist with the specified key ? /// /// /// /// public static bool HasCookie(this HttpRequest request, string key) { return request.Cookies[key] != null; } /// /// Is there a cookie with the key supplied and does it have a value that is not empty /// /// /// /// public static bool HasCookieValue(this HttpRequestBase request, string key) { return request.Cookies[key] != null && request.Cookies[key].Value != null && request.Cookies[key].Value.IsNullOrWhiteSpace() == false; } /// /// Is there a cookie with the key supplied and does it have a value that is not empty /// /// /// /// public static bool HasCookieValue(this HttpRequest request, string key) { return new HttpRequestWrapper(request).HasCookieValue(key); } } }