Skip to content

Commit 3d2e3ce

Browse files
andrewtarrybtIgorMinar
authored andcommitted
fix($cookie): use decodeURIComponent instead of unescape for cookie reading
the self.cookies method in $browser was using escape and unescape to handle the cookie name and value. These methods are deprecated and cause problems with some special characters (€). The method has been changed to use the replacement encodeURIComponent and decodeURIComponent. Closes angular#8125
1 parent 048a5f1 commit 3d2e3ce

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

src/ng/browser.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -280,16 +280,15 @@ function Browser(window, document, $log, $sniffer) {
280280
* @returns {Object} Hash of all cookies (if called without any parameter)
281281
*/
282282
self.cookies = function(name, value) {
283-
/* global escape: false, unescape: false */
284283
var cookieLength, cookieArray, cookie, i, index;
285284

286285
if (name) {
287286
if (value === undefined) {
288-
rawDocument.cookie = escape(name) + "=;path=" + cookiePath +
287+
rawDocument.cookie = encodeURIComponent(name) + "=;path=" + cookiePath +
289288
";expires=Thu, 01 Jan 1970 00:00:00 GMT";
290289
} else {
291290
if (isString(value)) {
292-
cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) +
291+
cookieLength = (rawDocument.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) +
293292
';path=' + cookiePath).length + 1;
294293

295294
// per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
@@ -313,12 +312,12 @@ function Browser(window, document, $log, $sniffer) {
313312
cookie = cookieArray[i];
314313
index = cookie.indexOf('=');
315314
if (index > 0) { //ignore nameless cookies
316-
name = unescape(cookie.substring(0, index));
315+
name = decodeURIComponent(cookie.substring(0, index));
317316
// the first value that is seen for a cookie is the most
318317
// specific one. values for the same cookie name that
319318
// follow are for less specific paths.
320319
if (lastCookies[name] === undefined) {
321-
lastCookies[name] = unescape(cookie.substring(index + 1));
320+
lastCookies[name] = decodeURIComponent(cookie.substring(index + 1));
322321
}
323322
}
324323
}

test/ng/browserSpecs.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ describe('browser', function() {
250250
var i, longVal = '', cookieStr;
251251

252252
for(i=0; i<4083; i++) {
253-
longVal += '+';
253+
longVal += 'x';
254254
}
255255

256256
cookieStr = document.cookie;
@@ -323,6 +323,11 @@ describe('browser', function() {
323323
expect(browser.cookies()[' cookie name ']).toEqual(' cookie value ');
324324
expect(browser.cookies()['cookie name']).not.toBeDefined();
325325
});
326+
327+
it('should unscape special characters in cookie values', function() {
328+
document.cookie = 'cookie_name=cookie_value_%E2%82%AC';
329+
expect(browser.cookies()['cookie_name']).toEqual('cookie_value_€');
330+
});
326331
});
327332

328333

0 commit comments

Comments
 (0)