Skip to content

Commit 3a28eee

Browse files
committed
Remove location URL as field on responses
It does not need to be stored on a response and therefore resulted in confusion. Also clarify that synthetic responses need to have an absolute URL in the Location header field value (Response.redirect() does this automatically). Corresponding HTML PR: TODO. Tests: TODO. Closes #631, closes #633, closes #958, and closes #1146. (Some of these can be closed due to #1030 making response's URL no longer null for network responses.)
1 parent d070ea2 commit 3a28eee

File tree

1 file changed

+45
-42
lines changed

1 file changed

+45
-42
lines changed

fetch.bs

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,16 +1879,6 @@ allowed on the resource fetched by looking at the flag of the response returned.
18791879
the response of a redirect has to be set if it was set for previous responses in the redirect chain,
18801880
this is also tracked internally using the request's <a for=request>timing allow failed flag</a>.
18811881

1882-
<p>A <a for=/>response</a> can have an associated
1883-
<dfn export for=response id=concept-response-location-url>location URL</dfn> (null, failure, or a
1884-
<a for=/>URL</a>). Unless specified otherwise, <a for=/>response</a> has no
1885-
<a for=response>location URL</a>.
1886-
1887-
<p class="note no-backref">This concept is used for redirect handling in Fetch and in HTML's
1888-
navigate algorithm. It ensures `<code>Location</code>` has
1889-
<a lt="extracting header values">its value extracted</a> consistently and only once.
1890-
[[!HTML]]
1891-
18921882
<hr>
18931883

18941884
<p>A <a for=/>response</a> whose
@@ -2006,6 +1996,34 @@ is a <a>filtered response</a> whose
20061996
<p>A <dfn export id=concept-stale-response>stale response</dfn> is a <a for=/>response</a> that is
20071997
not a <a>fresh response</a> or a <a>stale-while-revalidate response</a>.
20081998

1999+
<hr>
2000+
2001+
<p>To <dfn export id=concept-response-location-url>extract a location URL</dfn>, given a
2002+
<a for=/>response</a> <var>response</var>:
2003+
2004+
<ol>
2005+
<li><p>If <var>response</var>'s <a for=response>status</a> is not a <a>redirect status</a>, then
2006+
return null.
2007+
2008+
<li><p>Let <var>location</var> be the result of <a>extracting header list values</a> given
2009+
`<code>Location</code>` and <var>response</var>'s <a for=response>header list</a>.
2010+
<!-- https://github.com/whatwg/fetch/issues/814#issuecomment-431366126 -->
2011+
2012+
<li>
2013+
<p>If <var>location</var> is a <a for=header>value</a>, then set <var>location</var> to the result
2014+
of <a lt="url parser">parsing</a> <var>location</var> with <var>response</var>'s
2015+
<a for=response>URL</a>.
2016+
2017+
<p class=note>If <var>response</var> was constructed in a service worker <var>response</var>'s
2018+
<a for=response>URL</a> will be null, meaning that <var>location</var> will only parse
2019+
successfully if it is an <a>absolute-URL-with-fragment string</a>.
2020+
2021+
<li><p>Return <var>location</var>.
2022+
</ol>
2023+
2024+
<p class="note no-backref"><a>Extract a location URL</a> is used for redirect handling in Fetch and
2025+
in HTML's navigate algorithm as it handles redirects manually. [[!HTML]]
2026+
20092027

20102028
<h4 id=miscellaneous>Miscellaneous</h4>
20112029

@@ -3953,16 +3971,6 @@ optional <i>CORS-preflight flag</i>, run these steps:
39533971

39543972
<p class=note>303 is excluded as certain communities ascribe special status to it.
39553973

3956-
<li><p>Let <var>location</var> be the result of <a>extracting header list values</a> given
3957-
`<code>Location</code>` and <var>actualResponse</var>'s <a for=response>header list</a>.
3958-
3959-
<li><p>If <var>location</var> is a <a for=header>value</a>, then set <var>location</var> to the
3960-
result of <a lt="url parser">parsing</a> <var>location</var> with <var>actualResponse</var>'s
3961-
<a for=response>URL</a>.
3962-
3963-
<li><p>Set <var>actualResponse</var>'s
3964-
<a for=response>location URL</a> to <var>location</var>.
3965-
39663974
<li>
39673975
<p>Switch on <var>request</var>'s
39683976
<a for=request>redirect mode</a>:
@@ -4003,18 +4011,15 @@ optional <i>CORS-preflight flag</i>, run these steps:
40034011
<a>filtered response</a>, and <var>response</var>'s
40044012
<a for=internal>internal response</a> otherwise.
40054013

4006-
<li><p>If <var>actualResponse</var>'s <a for=response>location URL</a>
4007-
is null, then return <var>response</var>.
4014+
<li><p>Let <var>locationURL</var> be the result of <a>extracting a location URL</a> given
4015+
<var>actualResponse</var>.
40084016

4009-
<li><p>If <var>actualResponse</var>'s <a for=response>location URL</a>
4010-
is failure, then return a <a>network error</a>.
4011-
<!-- only Gecko does this; and even that is currently more complicated -->
4017+
<li><p>If <var>locationURL</var> is null, then return <var>response</var>.
40124018

4013-
<li><p>If <var>actualResponse</var>'s
4014-
<a for=response>location URL</a>'s
4015-
<a for=url>scheme</a> is <em>not</em> an
4016-
<a>HTTP(S) scheme</a>, then return a
4017-
<a>network error</a>.
4019+
<li><p>If <var>locationURL</var> is failure, then return a <a>network error</a>.
4020+
4021+
<li><p>If <var>locationURL</var>'s <a for=url>scheme</a> is not an <a>HTTP(S) scheme</a>, then
4022+
return a <a>network error</a>.
40184023

40194024
<li><p>If <var>request</var>'s <a for=request>redirect count</a> is
40204025
twenty, return a <a>network error</a>.
@@ -4023,27 +4028,25 @@ optional <i>CORS-preflight flag</i>, run these steps:
40234028
<a for=request>redirect count</a> by one.
40244029

40254030
<li><p>If <var>request</var>'s <a for=request>mode</a> is "<code>cors</code>",
4026-
<var>actualResponse</var>'s <a for=response>location URL</a>
4027-
<a lt="include credential">includes credentials</a>, and <var>request</var>'s
4028-
<a for=request>origin</a> is not <a>same origin</a> with <var>actualResponse</var>'s
4029-
<a for=response>location URL</a>'s <a for=url>origin</a>, then return a <a>network error</a>.
4031+
<var>locationURL</var> <a>includes credentials</a>, and <var>request</var>'s
4032+
<a for=request>origin</a> is not <a>same origin</a> with <var>locationURL</var>'s
4033+
<a for=url>origin</a>, then return a <a>network error</a>.
40304034

40314035
<li>
40324036
<p>If <var>request</var>'s <a for=request>response tainting</a> is "<code>cors</code>" and
4033-
<var>actualResponse</var>'s <a for=response>location URL</a>
4034-
<a lt="include credential">includes credentials</a>, then return a <a>network error</a>.
4037+
<var>locationURL</var> <a>includes credentials</a>, then return a <a>network error</a>.
40354038

40364039
<p class=note>This catches a cross-origin resource redirecting to a same-origin URL.
40374040

40384041
<li><p>If <var>actualResponse</var>'s <a for=response>status</a> is not 303, <var>request</var>'s
40394042
<a for=request>body</a> is non-null, and <var>request</var>'s <a for=request>body</a>'s
40404043
<a for=body>source</a> is null, then return a <a>network error</a>.
40414044

4042-
<li><p>If <var>actualResponse</var>'s <a for=response>location URL</a>'s <a for=url>origin</a> is
4043-
not <a>same origin</a> with <var>request</var>'s <a for=request>current URL</a>'s
4044-
<a for=url>origin</a> and <var>request</var>'s <a for=request>origin</a> is not <a>same origin</a>
4045-
with <var>request</var>'s <a for=request>current URL</a>'s <a for=url>origin</a>, then set
4046-
<var>request</var>'s <a for=request>tainted origin flag</a>.
4045+
<li><p>If <var>locationURL</var>'s <a for=url>origin</a> is not <a>same origin</a> with
4046+
<var>request</var>'s <a for=request>current URL</a>'s <a for=url>origin</a> and
4047+
<var>request</var>'s <a for=request>origin</a> is not <a>same origin</a> with <var>request</var>'s
4048+
<a for=request>current URL</a>'s <a for=url>origin</a>, then set <var>request</var>'s
4049+
<a for=request>tainted origin flag</a>.
40474050

40484051
<li>
40494052
<p>If one of the following is true
@@ -4074,7 +4077,7 @@ optional <i>CORS-preflight flag</i>, run these steps:
40744077
<p class="note no-backref"><var>request</var>'s <a for=request>body</a>'s <a for=body>source</a>'s
40754078
nullity has already been checked.
40764079

4077-
<li><p>Append <var>actualResponse</var>'s <a for=response>location URL</a> to <var>request</var>'s
4080+
<li><p><a for=list>Append</a> <var>locationURL</var> to <var>request</var>'s
40784081
<a for=request>URL list</a>.
40794082

40804083
<li><p>Invoke <a>set <var>request</var>'s referrer policy on redirect</a> on <var>request</var> and

0 commit comments

Comments
 (0)