| // 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". |
| // |
| // [INFRA] https://infra.spec.whatwg.org/#isomorphic-encode |
| 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(); |