Skip to content

Commit cbe9f32

Browse files
committed
Add the validate a partial response algorithm and the extract content-range values algorithm
1 parent aa2980f commit cbe9f32

File tree

1 file changed

+114
-1
lines changed

1 file changed

+114
-1
lines changed

fetch.bs

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3344,7 +3344,6 @@ and a <a for=/>response</a> <var>response</var>, is to run these steps:
33443344
<li><p>If <var>response</var>'s <a for=response>status</a> is 206 and
33453345
<a>validate a partial response</a> given 0 and <var>response</var> returns invalid, then return
33463346
false.
3347-
<!-- TODO Integrate https://wicg.github.io/background-fetch/#validate-a-partial-response into Fetch -->
33483347

33493348
<li><p>Let <var>bytes</var> be the result of running
33503349
<a>obtain a copy of the first 1024 bytes of response</a> given <var>response</var>.
@@ -3392,6 +3391,81 @@ and a <a for=/>response</a> <var>response</var>, is to run these steps:
33923391

33933392
<hr>
33943393

3394+
<div algorithm>
3395+
<p>To <dfn>extract content-range values</dfn>, given a <a for=/>response</a> <var>response</var>
3396+
run these steps:<p>
3397+
3398+
<ol>
3399+
<li><p>If <var>response</var>’s <a for=response>header list</a> <a for="header list">does not contain</a> `<code>Content-Range</code>`, then return failure.
3400+
3401+
<li><p>Let <var>contentRangeValue</var> be the <a lt=value for=header>value</a> of the first <a for=/>header</a> whose <a for=header>name</a> is a
3402+
<a>byte-case-insensitive</a> match for `<code>Content-Range</code>` in <var>response</var>’s <a for=response>header list</a>.
3403+
3404+
<li><p>If parsing <var>contentRangeValue</var> per <a>single byte content-range</a> fails, then return failure.
3405+
3406+
<li><p>Let <var>firstBytePos</var> be the portion of <var>contentRangeValue</var> named
3407+
first-byte-pos when parsed as <a>single byte content-range</a>, parsed as an integer.
3408+
3409+
<li><p>Let <var>lastBytePos</var> be the portion of <var>contentRangeValue</var> named
3410+
last-byte-pos when parsed as <a>single byte content-range</a>, parsed as an integer.
3411+
3412+
<li><p>Let <var>completeLength</var> be the portion of <var>contentRangeValue</var> named
3413+
complete-length when parsed as <a>single byte content-range</a>.
3414+
3415+
<li><p>If <var>completeLength</var> is "<code>*</code>", then set <var>completeLength</var> to null, otherwise
3416+
set <var>completeLength</var> to <var>completeLength</var> parsed as an integer.
3417+
3418+
<li><p>Return <var>firstBytePos</var>, <var>lastBytePos</var>, and <var>completeLength</var>.
3419+
</ol>
3420+
3421+
<p class=XXX>Parsing as an integer <a href="https://github.com/whatwg/infra/issues/189">infra/189</a>
3422+
</div>
3423+
3424+
<hr>
3425+
3426+
<div algorithm>
3427+
<p>To <dfn>validate a partial response</dfn>, given an integer <var>expectedRangeStart</var> , a
3428+
<a for=/>response</a> <var>partialResponse</var>, and an optional <a for=/>response</a> <var>previousResponse</var> (default null),
3429+
run these steps:</p>
3430+
3431+
<ol>
3432+
<li><p>Assert: <var>partialResponse</var>'s <a for=response>status</a> is `206`.
3433+
3434+
<li><p>Let <var>responseFirstBytePos</var>, <var ignore>responseLastBytePos</var>, and <var>responseCompleteLength</var> be the
3435+
result of <a>extracting content-range values</a> from <var>partialResponse</var>. If this fails, then return invalid.
3436+
3437+
<li><p>If <var>responseFirstBytePos</var> does not equal <var>expectedRangeStart</var>, then return invalid.
3438+
3439+
<li><p>If <var>previousResponse</var> is not null, then:
3440+
3441+
<ol>
3442+
<li><p>For <var>headerName</var> of « `<code>ETag</code>`, `<code>Last-Modified</code>` »:
3443+
3444+
<ol>
3445+
<li>If <var>previousResponse</var>'s <a for=response>header list</a> <a for="header list">contains</a> <var>headerName</var>
3446+
and the <a for="header list">combined</a> value of <var>headerName</var>
3447+
in <var>previousResponse</var>'s <a for=response>header list</a> does not equal the
3448+
<a for="header list">combined</a> value of <var>headerName</var> in <var>partialResponse</var>'s
3449+
<a for=response>header list</a>, then return invalid.
3450+
</ol>
3451+
3452+
<li><p>If <var>previousResponse</var>'s <a for=response>status</a> is 206, then:
3453+
3454+
<ol>
3455+
<li><p>Let <var ignore>previousResponseFirstBytePos</var>, <var ignore>previousResponseLastBytePos</var>,
3456+
and <var>previousResponseCompleteLength</var> be the result of <a>extracting content-range values</a>
3457+
from <var>previousResponse</var>. If this fails, then return invalid.
3458+
3459+
<li><p>If <var>previousResponseCompleteLength</var> is not null, and
3460+
<var>responseCompleteLength</var> does not equal <var>previousResponseCompleteLength</var>, then return invalid.
3461+
</ol>
3462+
</ol>
3463+
<li>Return valid.
3464+
</ol>
3465+
</div>
3466+
3467+
<hr>
3468+
33953469
<p>To <dfn>obtain a copy of the first 1024 bytes of response</dfn>, given a <a for=/>response</a>
33963470
<var>response</var>, run these steps:
33973471

@@ -3813,6 +3887,45 @@ response <a for=/>headers</a>, the <a for=header>value</a> `<code>*</code>` coun
38133887
<a for=/>requests</a> without <a for=/>credentials</a>. For such <a for=/>requests</a> there is no
38143888
way to solely match a <a for=/>header name</a> or <a for=/>method</a> that is `<code>*</code>`.
38153889

3890+
<p><a>ABNF</a> for a <dfn export> single byte content-range</dfn>:
3891+
3892+
<pre><code class=lang-abnf>
3893+
"bytes=" first-byte-pos "-" last-byte-pos "/" complete-length
3894+
first-byte-pos = 1*DIGIT
3895+
last-byte-pos = 1*DIGIT
3896+
complete-length = ( 1*DIGIT / "*" )
3897+
</code></pre>
3898+
3899+
<p class=note>This is a subset of what <a href="https://tools.ietf.org/html/rfc7233#section-3.1">RFC 7233</a> allows.
3900+
3901+
<div class="note">
3902+
3903+
The above as a railroad diagram:
3904+
3905+
<pre class="railroad">
3906+
T: "bytes="
3907+
Stack:
3908+
Sequence:
3909+
Comment: first-byte-pos
3910+
OneOrMore:
3911+
N: digit
3912+
Comment: /first-byte-pos
3913+
N: "/"
3914+
Sequence:
3915+
Comment: last-byte-pos
3916+
OneOrMore:
3917+
N: digit
3918+
Comment: /last-byte-pos
3919+
N: "/"
3920+
Sequence:
3921+
Comment: complete-length
3922+
Choice:
3923+
N: "*"
3924+
OneOrMore:
3925+
N: digit
3926+
Comment: /complete-length
3927+
</pre>
3928+
</div>
38163929

38173930
<h4 id=cors-protocol-and-credentials>CORS protocol and credentials</h4>
38183931

0 commit comments

Comments
 (0)