Skip to content
This repository was archived by the owner on Nov 20, 2018. It is now read-only.

Commit 765a520

Browse files
committed
Use EscapeDataString for encoding Cookies
1 parent 02363da commit 765a520

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

src/Microsoft.AspNetCore.Http/ResponseCookies.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ public ResponseCookies(IHeaderDictionary headers)
3838
public void Append(string key, string value)
3939
{
4040
var setCookieHeaderValue = new SetCookieHeaderValue(
41-
UrlEncoder.Default.Encode(key),
42-
UrlEncoder.Default.Encode(value))
41+
Uri.EscapeDataString(key),
42+
Uri.EscapeDataString(value))
4343
{
4444
Path = "/"
4545
};
@@ -61,8 +61,8 @@ public void Append(string key, string value, CookieOptions options)
6161
}
6262

6363
var setCookieHeaderValue = new SetCookieHeaderValue(
64-
UrlEncoder.Default.Encode(key),
65-
UrlEncoder.Default.Encode(value))
64+
Uri.EscapeDataString(key),
65+
Uri.EscapeDataString(value))
6666
{
6767
Domain = options.Domain,
6868
Path = options.Path,
@@ -95,7 +95,7 @@ public void Delete(string key, CookieOptions options)
9595
throw new ArgumentNullException(nameof(options));
9696
}
9797

98-
var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "=";
98+
var encodedKeyPlusEquals = Uri.EscapeDataString(key) + "=";
9999
bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
100100
bool pathHasValue = !string.IsNullOrEmpty(options.Path);
101101

test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -172,15 +172,15 @@ public void Cookies_GetAndSet()
172172
Assert.Null(cookies0["key0"]);
173173
Assert.False(cookies0.ContainsKey("key0"));
174174

175-
var newCookies = new[] { "name0=value0", "name1=value1" };
175+
var newCookies = new[] { "name0=value0%2C", "%5Ename1=value1" };
176176
request.Headers["Cookie"] = newCookies;
177177

178178
cookies0 = RequestCookieCollection.Parse(newCookies);
179179
var cookies1 = request.Cookies;
180180
Assert.Equal(cookies0, cookies1);
181181
Assert.Equal(2, cookies1.Count);
182-
Assert.Equal("value0", cookies1["name0"]);
183-
Assert.Equal("value1", cookies1["name1"]);
182+
Assert.Equal("value0,", cookies1["name0"]);
183+
Assert.Equal("value1", cookies1["^name1"]);
184184
Assert.Equal(newCookies, request.Headers["Cookie"]);
185185

186186
var cookies2 = new RequestCookieCollection(new Dictionary<string,string>()

test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs

+15
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,20 @@ public void NoParamsDeleteRemovesCookieCreatedByAdd()
4242
Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]);
4343
}
4444

45+
[Theory]
46+
[InlineData("key", "value", "key=value")]
47+
[InlineData("key,", "!value", "key%2C=%21value")]
48+
[InlineData("ke#y,", "val^ue", "ke%23y%2C=val%5Eue")]
49+
public void EscapesKeyValuesBeforeSettingCookie(string key, string value, string expected)
50+
{
51+
var headers = new HeaderDictionary();
52+
var cookies = new ResponseCookies(headers);
53+
54+
cookies.Append(key, value);
55+
56+
var cookieHeaderValues = headers[HeaderNames.SetCookie];
57+
Assert.Equal(1, cookieHeaderValues.Count);
58+
Assert.StartsWith(expected, cookieHeaderValues[0]);
59+
}
4560
}
4661
}

0 commit comments

Comments
 (0)