From 690e5a66e54acb76da3ca347dfa6cfcf209063ba Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 13 Nov 2015 10:55:16 -0800 Subject: [PATCH] Set default path=/ when removing cookie --- src/Microsoft.AspNet.Http/ResponseCookies.cs | 31 +------------ .../ResponseCookiesTest.cs | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index cd6b9c6e..185540eb 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -80,36 +80,7 @@ public void Append(string key, string value, CookieOptions options) /// public void Delete(string key) { - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; - Func predicate = (value, encKeyPlusEquals) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - - StringValues deleteCookies = $"{encodedKeyPlusEquals}; expires=Thu, 01-Jan-1970 00:00:00 GMT"; - var existingValues = Headers[HeaderNames.SetCookie]; - if (StringValues.IsNullOrEmpty(existingValues)) - { - Headers[HeaderNames.SetCookie] = deleteCookies; - } - else - { - var values = existingValues.ToArray(); - var newValues = new List(); - - for (var i = 0; i < values.Length; i++) - { - if (!predicate(values[i], encodedKeyPlusEquals)) - { - newValues.Add(values[i]); - } - } - - values = deleteCookies.ToArray(); - for (var i = 0; i < values.Length; i++) - { - newValues.Add(values[i]); - } - - Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); - } + Delete(key, new CookieOptions() { Path = "/" }); } /// diff --git a/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs new file mode 100644 index 00000000..e22d4f33 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; +using Microsoft.Net.Http.Headers; +using Microsoft.AspNet.Http.Internal; + +namespace Microsoft.AspNet.Http.Tests +{ + public class ResponseCookiesTest + { + [Fact] + public void DeleteCookieShouldSetDefaultPath() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers); + var testcookie = "TestCookie"; + + cookies.Delete(testcookie); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(testcookie, cookieHeaderValues[0]); + Assert.Contains("path=/", cookieHeaderValues[0]); + Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); + } + + [Fact] + public void NoParamsDeleteRemovesCookieCreatedByAdd() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers); + var testcookie = "TestCookie"; + + cookies.Append(testcookie, testcookie); + cookies.Delete(testcookie); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(testcookie, cookieHeaderValues[0]); + Assert.Contains("path=/", cookieHeaderValues[0]); + Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); + } + + } +}