Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// META: global=window,worker
// META: script=../resources/utils.js
// See https://github.com/whatwg/fetch/issues/883 for the behavior covered by
// this test. As of writing, the Fetch spec has not been updated to cover these.
// redirectLocation tests that a Location header of |locationHeader| is resolved
// to a URL which ends in |expectedUrlSuffix|. |locationHeader| is interpreted
// as a byte sequence via isomorphic encode, as described in [INFRA]. This
// allows the caller to specify byte sequences which are not valid UTF-8.
// However, this means, e.g., U+2603 must be passed in as "\xe2\x98\x83", its
// UTF-8 encoding, not "\u2603".
//
function redirectLocation(
desc, redirectUrl, locationHeader, expectedUrlSuffix) {
promise_test(function(test) {
// Note we use escape() instead of encodeURIComponent(), so that characters
// are escaped as bytes in the isomorphic encoding.
var url = redirectUrl + '?simple=1&location=' + escape(locationHeader);
return fetch(url, {'redirect': 'follow'}).then(function(resp) {
assert_true(
resp.url.endsWith(expectedUrlSuffix),
resp.url + ' ends with ' + expectedUrlSuffix);
});
}, desc);
}
var redirUrl = RESOURCES_DIR + 'redirect.py';
redirectLocation(
'Redirect to escaped UTF-8', redirUrl, 'top.txt?%E2%98%83%e2%98%83',
'top.txt?%E2%98%83%e2%98%83');
redirectLocation(
'Redirect to unescaped UTF-8', redirUrl, 'top.txt?\xe2\x98\x83',
'top.txt?%E2%98%83');
redirectLocation(
'Redirect to escaped and unescaped UTF-8', redirUrl,
'top.txt?\xe2\x98\x83%e2%98%83', 'top.txt?%E2%98%83%e2%98%83');
redirectLocation(
'Escaping produces double-percent', redirUrl, 'top.txt?%\xe2\x98\x83',
'top.txt?%%E2%98%83');
redirectLocation(
'Redirect to invalid UTF-8', redirUrl, 'top.txt?\xff', 'top.txt?%FF');
done();