Moves GetCookieValue to an extension method, cleans up code, adds unit tests

This commit is contained in:
Shannon
2017-08-29 10:50:20 +10:00
parent 6bf0d6e175
commit d71b8a139f
4 changed files with 84 additions and 30 deletions

View File

@@ -16,6 +16,43 @@ namespace Umbraco.Web
/// </remarks>
internal static class HttpCookieExtensions
{
/// <summary>
/// Retrieves an individual cookie from the cookies collection
/// </summary>
/// <param name="requestHeaders"></param>
/// <param name="cookieName"></param>
/// <returns></returns>
/// <remarks>
/// 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.
/// </remarks>
public static string GetCookieValue(this HttpRequestHeaders requestHeaders, string cookieName)
{
var cookieRequestHeader = requestHeaders
.Where(h => h.Key.Equals("Cookie", StringComparison.InvariantCultureIgnoreCase))
.ToArray();
if (cookieRequestHeader.Length == 0)
return null;
var cookiesHeader = cookieRequestHeader[0];
var cookiesHeaderValue = cookiesHeader.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().InvariantEquals(cookieName))
return parts[1].Trim();
}
return null;
}
/// <summary>
/// Removes the cookie from the request and the response if it exists
/// </summary>