Fetch

現行標準 — 最終更新

参加方法:
GitHub whatwg/fetch新しいissueオープン中のissue
Matrixでチャット
コミット:
GitHub whatwg/fetch/commits
このコミット時点のスナップショット
テスト:
web-platform-tests fetch/進行中の作業
翻訳 (参考情報):
日本語
简体中文
한국어

概要

Fetch標準は、リクエスト、レスポンス、およびそれらを結び付ける処理であるフェッチ処理を定義します。

目標

この標準の目標は、ウェブプラットフォーム全体でフェッチ処理を統一し、関連する全ての事項について一貫した取り扱いを提供することです。具体的には以下を含みます。

そのため、この標準はThe Web Origin Conceptで最初に定義されたHTTP `Origin`ヘッダーのセマンティクスも置き換えます。[ORIGIN]

1. 序文

大まかに言えば、リソースのフェッチは非常に単純な操作です。リクエストが入力され、レスポンスが出力されます。しかしその詳細は複雑であり、かつては十分に文書化されていなかったり、APIごとに異なっていました。

多くのAPIがリソースをフェッチする機能を提供しています。例えばHTMLのimgscript要素、CSSのcursorlist-style-image、JavaScript APIであるnavigator.sendBeacon()self.importScripts()などです。Fetch標準は、これらの機能について統一的なアーキテクチャを提供し、リダイレクトやCORSプロトコルなどフェッチに関する様々な側面で一貫性を持たせます。

Fetch標準はまた、ほとんどのネットワーク機能を比較的低レベルの抽象化で公開するfetch() JavaScript APIも定義します。

2. インフラストラクチャー

本仕様はInfra標準に依存します。[INFRA]

本仕様は、ABNFEncodingHTMLHTTPMIME SniffingStreamsURLWeb IDLWebSockets、およびWebTransportの用語を使用します。 [ABNF] [ENCODING] [HTML] [HTTP] [MIMESNIFF] [STREAMS] [URL] [WEBIDL] [WEBSOCKETS] [WEBTRANSPORT]

ABNF とは、HTTPによって拡張されたABNF(特に#の追加)およびRFC 7405を意味します。[RFC7405]


認証情報 とは、HTTPクッキー、TLSクライアント証明書、および認証エントリ(HTTP認証用)を指します。[COOKIES] [TLS] [HTTP]


fetch params は、構造体であり、 fetchアルゴリズムで帳簿管理の詳細として使われます。次の項目を持ちます:

request
request
リクエストボディチャンク長の処理 (デフォルト:null)
process request end-of-body(初期値 null)
process early hints response(初期値 null)
process response(初期値 null)
process response end-of-body(初期値 null)
process response consume body(初期値 null)
nullまたはアルゴリズム。
task destination(初期値 null)
null、グローバルオブジェクト、または並列キュー
cross-origin isolated capability(初期値 false)
真偽値。
controller(初期値 新しいfetch controller
fetch controller
timing info
fetch timing info
preloaded response candidate(初期値 null)
null、"pending"、またはresponse

fetch controllerは、 構造体であり、 fetchの呼び出し元が開始後に特定の操作を行うことを可能にします。次の項目を持ちます:

state(初期値 "ongoing")
"ongoing"、"terminated"、または"aborted"。
full timing info(初期値 null)
nullまたはfetch timing info
report timing steps(初期値 null)
nullまたはグローバルオブジェクトを受け取るアルゴリズム。
serialized abort reason(初期値 null)
nullまたはRecordStructuredSerializeの結果)。
next manual redirect steps(初期値 null)
nullまたは何も受け取らないアルゴリズム。

fetch controller controllerに対して、global object globalを与えて、report timingするには:

  1. Assert: controllerreport timing stepsがnullでないことを確認する。

  2. controllerreport timing stepsglobalで呼び出す。

fetch controller controllerに対してprocess the next manual redirectするには:

  1. Assert: controllernext manual redirect stepsが nullでないことを確認する。

  2. controllernext manual redirect stepsを呼び出す。

fetch controller controllerに対してextract full timing infoするには:

  1. Assert: controllerfull timing info がnullでないことを確認する。

  2. controllerfull timing infoを返す。

fetch controller controllerに対して、オプションのerrorabortするには:

  1. controllerstateを"aborted"に設定する。

  2. fallbackErrorを"AbortError" DOMExceptionとする。

  3. errorが与えられなければ、fallbackErrorを設定する。

  4. serializedErrorStructuredSerialize(error)とする。 例外が発生したら、それをキャッチしてserializedErrorStructuredSerialize(fallbackError)とする。

  5. controllerserialized abort reasonserializedErrorを設定する。

nullまたはRecord abortReasonrealm realmを与えて、serialized abort reasonをデシリアライズするには:

  1. fallbackErrorを"AbortError" DOMExceptionとする。

  2. deserializedErrorfallbackErrorとする。

  3. abortReasonがnullでなければ、 deserializedErrorStructuredDeserialize(abortReason, realm)を設定する。 例外が発生したりundefinedを返したら、deserializedErrorfallbackErrorに設定する。

  4. deserializedErrorを返す。

fetch controller controllerに対してterminateするには、controllerstateを "terminated"に設定する。

fetch params fetchParamsは、そのcontrollerstateが "aborted"であれば、abortedである。

fetch params fetchParamsは、そのcontrollerstateが "aborted"または"terminated"であれば、canceledである。

fetch timing infoは、 構造体であり、 Resource TimingNavigation Timingで必要なタイミング情報を保持します。次の項目を持ちます: [RESOURCE-TIMING] [NAVIGATION-TIMING]

start time(初期値 0)
redirect start time(初期値 0)
redirect end time(初期値 0)
post-redirect start time(初期値 0)
final service worker start time (初期値 0)
final network-request start time (初期値 0)
first interim network-response start time(初期値 0)
final network-response start time (初期値 0)
end time(初期値 0)
DOMHighResTimeStamp
final connection timing info(初期値 null)
nullまたはconnection timing info
service worker timing info(デフォルトは null)
null または service worker timing info です。
server-timing headers(初期値 « »)
文字列のリスト
render-blocking(初期値 false)
真偽値。

response body info は、構造体であり、 Resource TimingNavigation Timingで必要な情報を保持します。次の項目を持ちます: [RESOURCE-TIMING] [NAVIGATION-TIMING]

encoded size (初期値 0)
decoded size (初期値 0)
数値。
content type(初期値 空文字列)
ASCII文字列
content encoding(初期値 空文字列)
ASCII文字列

fetch timing info timingInfoを与えてopaque timing infoを作成するには、 timingInfostart timeおよび post-redirect start timetimingInfostart timeとなる 新しいfetch timing infoを返す。

アルゴリズムalgorithmグローバルオブジェクトまたは並列キュー taskDestinationを与えてfetchタスクをキューするには、次の手順を実行する:

  1. taskDestination並列キューであれば、 enqueue algorithmtaskDestinationへ。

  2. それ以外の場合、グローバルタスクをキューする。networking task sourcetaskDestinationおよびalgorithmとともに。

環境設定オブジェクト environment オフラインかどうかを確認するには:


整数を直列化するには、最も短い10進数の文字列として表現する。

これは今後、Infraでより詳細なアルゴリズムに置き換えられます。詳しくは infra/201を参照してください。

2.1. URL

ローカルスキームは 「about」、「blob」、または 「data」です。

URLは、そのスキームローカルスキームであれば、 ローカルです。

この定義はReferrer Policyでも使用されています。[REFERRER]

HTTP(S)スキームは 「http」または 「https」です。

fetchスキームは 「about」、「blob」、 「data」、「file」、またはHTTP(S)スキームです。

HTTP(S)スキームおよびfetchスキームHTMLでも使われます。 [HTML]

2.2. HTTP

フェッチはHTTPだけでなくより広い概念を含みますが、多くの概念をHTTPから借用し、それらを他の手段(例:data URL)で取得したリソースにも適用します。

HTTPタブまたはスペースは U+0009 TAB または U+0020 SPACE です。

HTTP空白はU+000A LF、U+000D CR、またはHTTPタブまたはスペースです。

HTTP空白は、HTTPヘッダー以外の文脈(例:MIMEタイプ)で再利用される特定の構文だけに役立ちます。HTTPヘッダー値ではHTTPタブまたはスペースの使用が推奨され、それ以外の文脈ではASCII空白の方が好まれます。ASCII空白とは異なり、U+000C FFは除外されます。

HTTP改行バイトは 0x0A (LF) または 0x0D (CR) です。

HTTPタブまたはスペースバイトは 0x09 (HT) または 0x20 (SP) です。

HTTP空白バイトは、HTTP改行バイトまたは HTTPタブまたはスペースバイトです。

文字列 input位置変数 position、および省略可能な真偽値extract-value(初期値はfalse)を与えて HTTP引用文字列を収集するには、次の手順を実行する:

  1. positionStartpositionとする。

  2. valueを空文字列とする。

  3. Assertinputposition符号位置が U+0022 (") であること。

  4. positionを1進める。

  5. 無限ループ:

    1. positionからU+0022 (") または U+005C (\) でない符号位置の列を収集し、その結果をvalueに追加する。

    2. positioninputの末尾を過ぎていれば break

    3. quoteOrBackslashinputposition符号位置とする。

    4. positionを1進める。

    5. quoteOrBackslashがU+005C (\) なら:

      1. positioninputの末尾を過ぎていれば、U+005C (\) をvalueに追加しbreak

      2. inputposition符号位置valueに追加する。

      3. positionを1進める。

    6. それ以外の場合:

      1. AssertquoteOrBackslashはU+0022 (") であること。

      2. break

  6. extract-valueがtrueなら、valueを返す。

  7. inputpositionStartからpositionまでの符号位置を返す。

入力 出力 extract-valueがtrueの場合の出力 最終的な位置変数の値
""\" ""\" "\" 2
""Hello" World" ""Hello"" "Hello" 7
""Hello \\ World\""" ""Hello \\ World\""" "Hello \ World"" 18

これらの例では位置変数は常に0から開始します。

2.2.1. メソッド

メソッドとは、バイト列であり、 methodトークン生成規則に一致するものです。

CORSセーフリストメソッドとは、 メソッドのうち、 `GET`、`HEAD`、`POST` のいずれかです。

禁止メソッドとは、 メソッドのうち、 `CONNECT`、`TRACE`、`TRACK` と バイト大小区別なしで一致するものです。 [HTTPVERBSEC1][HTTPVERBSEC2][HTTPVERBSEC3]

メソッド正規化するには、それが `DELETE`、`GET`、`HEAD`、`OPTIONS`、`POST`、`PUT` のいずれかとバイト大小区別なしで一致する場合、 バイト大文字化すること。

正規化は後方互換性およびAPI間の一貫性のために行われます。実際にはメソッドは「大文字小文字を区別」します。

`patch`を使うとほとんどの場合 `405 Method Not Allowed` になります。`PATCH` のほうが成功しやすいです。

メソッドには制限はありません。`CHICKEN`も完全に許容されます(`CHECKIN`の綴り間違いではありません)。正規化されるもの以外は大文字小文字の制限もありません。`Egg`や`eGg`でも問題ありませんが、一貫性のため大文字を推奨します。

2.2.2. ヘッダー

HTTPでは一般的に、ヘッダーを「フィールド」または「ヘッダーフィールド」と呼びます。ウェブプラットフォームでは、より口語的な「ヘッダー」という用語が使われます。[HTTP]

ヘッダーリストとは、ゼロ個以上のリストであり、 ヘッダーから成ります。初期値は « » です。

ヘッダーリストは本質的に特殊なマルチマップ、すなわち重複するキーを持つ可能性のある順序付きキー・バリューのリストです。`Set-Cookie`以外のヘッダーは常にクライアントサイドJavaScriptに公開される際に結合されるため、実装はより効率的な表現を選択しても問題ありませんが、`Set-Cookie`ヘッダー用の関連するデータ構造はサポートする必要があります。

ヘッダー名nameと文字列typeヘッダーリスト listから与えて、 構造化フィールド値を取得 するには、次の手順を実行します。返り値はnullまたは構造化フィールド値です。

  1. Assert: typeは"dictionary"、"list"、"item"のいずれかであること。

  2. valuelistからname取得した結果を格納する。

  3. valueがnullなら、nullを返す。

  4. resultinput_stringvalueheader_typetypeとしてstructured fieldsをパースした結果を格納する。

  5. パースに失敗した場合、nullを返す。

  6. resultを返す。

構造化フィールド値の取得は、ヘッダーが存在しない場合と、そののパースが 構造化フィールド値として失敗した場合を区別しません。これによりウェブプラットフォーム全体で一貫した処理が保証されます。

タプルヘッダー名 name構造化フィールド値 structuredValue)と ヘッダーリスト listを与えて 構造化フィールド値を設定するには:

  1. serializedValuestructured fieldsのシリアライズアルゴリズムをstructuredValueに対して実行した結果を格納する。

  2. 設定name, serializedValue)を listに行う。

構造化フィールド値はHTTPが(将来的に)興味深く効率的な方法でシリアライズできるオブジェクトとして定義されています。現時点では、Fetchはヘッダー値バイト列としてのみサポートしているため、これらのオブジェクトはシリアライズを通じてのみ ヘッダーリストに設定でき、 パースによってのみヘッダーリストから取得できます。将来的にはこれらがエンドツーエンドでオブジェクトとして保持される可能性があります。[RFC9651]


ヘッダーリスト listヘッダー名 name含むのは、 list含むとき、ヘッダーであって、 その名前バイト大小区別なしnameと一致する場合です。

ヘッダー名 nameヘッダーリスト listから 取得するには、次の手順を実行する。返り値はnullまたはヘッダー値

  1. list含まない場合、nullを返す。

  2. list内の、ヘッダー名前バイト大小区別なしnameと一致するものすべての を、0x2C 0x20で区切って順番通りに返す。

ヘッダー名 nameヘッダーリスト listから 取得・デコード・分割するには、次の手順を実行する。返り値はnullまたは文字列のリスト

  1. valueに、listからname取得した結果を格納する。

  2. valueがnullなら、nullを返す。

  3. value取得・デコード・分割した結果を返す。

取得・デコード・分割が、`A`をname引数として実際にどのように動作するかを示します:

ヘッダー(ネットワーク上) 出力
A: nosniff,
« "nosniff", "" »
A: nosniff
B: sniff
A:
A:
B: sniff
« "" »
B: sniff
null
A: text/html;", x/x
« "text/html;", x/x" »
A: text/html;"
A: x/x
A: x/x;test="hi",y/y
« "x/x;test="hi"", "y/y" »
A: x/x;test="hi"
C: **bingo**
A: y/y
A: x / x,,,1
« "x / x", "", "", "1" »
A: x / x
A: ,
A: 1
A: "1,2", 3
« ""1,2"", "3" »
A: "1,2"
D: 4
A: 3

ヘッダー値 value取得・デコード・分割するには、次の手順を実行します。返り値は文字列のリストです。

  1. inputvalueisomorphic decodeした結果を格納する。

  2. positioninput位置変数として、先頭位置に設定する。

  3. values文字列のリストとして初期化する(初期値 « »)。

  4. temporaryValueを空文字列とする。

  5. 無限ループ:

    1. positionからU+0022 (") または U+002C (,) でない符号位置の列を収集し、その結果をtemporaryValueに追加する。

      この結果は空文字列でもよい。

    2. positioninputの末尾を過ぎておらず、かつinputposition符号位置がU+0022 (")なら:

      1. inputpositionHTTP引用文字列を収集し、その結果をtemporaryValueに追加する。

      2. positionがまだ末尾を過ぎていなければcontinue
    3. temporaryValueの先頭および末尾からすべてのHTTPタブまたはスペースを除去する。

    4. 追加 temporaryValuevaluesに。

    5. temporaryValueを空文字列に戻す。

    6. positioninputの末尾を過ぎていれば、valuesを返す。

    7. Assertinputposition符号位置はU+002C (,)であること。

    8. positionを1だけ進める。

祝福された呼び出し箇所以外では、このアルゴリズムは直接呼び出してはいけません。代わりに取得・デコード・分割を使ってください。

ヘッダー (name, value) をヘッダーリスト list追加するには:

  1. listname含む場合、nameを最初に該当するヘッダー名前に設定する。

    これによって、既存のヘッダー名前の大文字・小文字が再利用されます。複数一致する場合、すべてのヘッダー名前は同一になります。

  2. 追加 (name, value) をlistに。

ヘッダー名 nameヘッダーリスト listから削除するには、 削除 ヘッダーすべて(名前バイト大小区別なしnameと一致するもの)をlistから取り除く。

ヘッダー (name, value) をヘッダーリスト list設定するには:

  1. listname含む場合、最初の該当ヘッダーvalueに設定し、他の該当ヘッダーは削除する。

  2. それ以外の場合、追加 (name, value) をlistに。

ヘッダー (name, value) をヘッダーリスト list結合するには:

  1. listname含む場合、最初の該当ヘッダーの後ろに0x2C 0x20を挟んでvalueを追加する。

  2. それ以外の場合、追加 (name, value) をlistに。

結合XMLHttpRequest および WebSocketプロトコルハンドシェイクで使われます。

名前のリスト headerNamesを与えてソート済み小文字集合へ変換するには、次の手順を実行する。返り値は順序付き集合ヘッダー名)。

  1. headerNamesSetを新しい順序付き集合とする。

  2. headerNamesnameについて、追加として、バイト小文字化したnameheaderNamesSetに加える。

  3. 昇順ソートheaderNamesSetに対してバイト小なりで行い、その結果を返す。

ヘッダーリスト listソートおよび結合するには、次の手順を実行する。返り値はヘッダーリスト

  1. headersヘッダーリストとして初期化する。

  2. namesに、list内の全名前ソート済み小文字集合へ変換した結果を格納する。

  3. namesnameについて:

    1. nameが`set-cookie`なら:

      1. valueslist内でnameバイト大小区別なしで一致するヘッダーすべてのを順番通り格納するリストとする。

      2. valuesvalueについて:

        1. 追加 (name, value) をheadersに。

    2. それ以外の場合:

      1. valuelistからname取得した結果を格納する。

      2. Assertvalueはnullでないこと。

      3. 追加 (name, value) をheadersに。

  4. headersを返す。


ヘッダーは、タプルであり、 名前ヘッダー名)と ヘッダー値)から構成されます。

ヘッダー名は、バイト列であり、 field-nameトークン生成規則に一致するものです。

ヘッダー値は、バイト列であり、次の条件を満たすものです。

ヘッダー値の定義は、field-valueトークン生成規則に基づいていません。これは既存のコンテンツとの非互換性があるためです。

バイト列 potentialValue正規化するには、potentialValueから先頭および末尾のHTTP空白バイトを除去する。


ヘッダーname, value)がCORSセーフリストリクエストヘッダーかどうかを判定するには、次の手順を実行する:

  1. value長さが128より大きい場合、falseを返す。

  2. バイト小文字化したnameで次の分岐を行う:

    `accept`

    valueCORS-unsafeリクエストヘッダーバイトが含まれていれば、falseを返す。

    `accept-language`
    `content-language`

    valueに、0x30 (0)~0x39 (9)、0x41 (A)~0x5A (Z)、0x61 (a)~0x7A (z)、0x20 (SP)、0x2A (*)、0x2C (,)、0x2D (-)、0x2E (.)、0x3B (;)、0x3D (=) 以外のバイトが含まれていれば、falseを返す。

    `content-type`
    1. valueCORS-unsafeリクエストヘッダーバイトが含まれていれば、falseを返す。

    2. mimeTypeMIMEタイプのパースisomorphic decodeしたvalueに対して行った結果を格納する。

    3. mimeTypeがfailureならfalseを返す。

    4. mimeTypeessenceが "application/x-www-form-urlencoded", "multipart/form-data", "text/plain" 以外ならfalseを返す。

    ここではMIMEタイプの抽出アルゴリズムは使いません。これは寛容すぎるためで、サーバー側がそのまま実装することを想定していません。

    MIMEタイプの抽出を使った場合、次のリクエストはCORSプリフライトにならず、サーバーの単純なパーサーがリクエストボディをJSONとして扱うかもしれません:

    fetch("https://victim.example/naïve-endpoint", {
      method: "POST",
      headers: [
        ["Content-Type", "application/json"],
        ["Content-Type", "text/plain"]
      ],
      credentials: "include",
      body: JSON.stringify(exerciseForTheReader)
    });
    
    `range`
    1. rangeValue単一レンジヘッダー値のパースvalueとfalseで行った結果を格納する。

    2. rangeValueがfailureならfalseを返す。

    3. rangeValue[0]がnullならfalseを返す。

      ウェブブラウザは歴史的に `bytes=-500` のようなレンジは出さないため、このアルゴリズムはそれらをセーフリスト化しません。

    その他

    falseを返す。

  3. trueを返す。

`Content-Type`ヘッダーのセーフリストには限定的な例外があり、CORSプロトコルの例外に記載されています。

CORS-unsafeリクエストヘッダーバイトとは、バイトbyteが次のいずれかに該当する場合です:

CORS-unsafeリクエストヘッダー名は、ヘッダーリスト headersに対して次の手順で決定します:

  1. unsafeNamesを新しいリストとする。

  2. potentiallyUnsafeNamesを新しいリストとする。

  3. safelistValueSizeを0とする。

  4. headersheader について:

    1. headerCORSセーフリストリクエストヘッダーでなければ、appendheader名前unsafeNamesに加える。

    2. それ以外の場合、appendheader名前potentiallyUnsafeNamesに加え、safelistValueSizeheader長さを加算する。

  5. safelistValueSizeが1024より大きければ、 potentiallyUnsafeNamesnameについて、appendnameunsafeNamesに加える。

  6. ソート済み小文字集合へ変換したunsafeNamesを返す。

CORSノンワイルドカードリクエストヘッダー名は、ヘッダー名であり、バイト大小区別なしで`Authorization`と一致するものです。

特権no-CORSリクエストヘッダー名は、ヘッダー名であり、 バイト大小区別なしで以下のいずれかと一致するものです。

これらは特権APIによって設定できるヘッダーであり、関連するリクエストオブジェクトがコピーされた場合は保持されますが、非特権APIによってリクエストが変更された場合には削除されます。

`Range`ヘッダーは、ダウンロードメディアの取得によく使われます。

特定のリクエストにRangeヘッダーを追加するためのヘルパーも用意されています。

CORSセーフリストレスポンスヘッダー名は、リスト ヘッダー名 list を与えて、以下のいずれかにバイト大小区別なしで一致するヘッダー名です。

no-CORSセーフリストリクエストヘッダー名は、ヘッダー名であり、 バイト大小区別なしで以下のいずれかと一致するものです。

ヘッダーname, value)がno-CORSセーフリストリクエストヘッダーかどうかを判定するには、次の手順を実行します:

  1. nameno-CORSセーフリストリクエストヘッダー名でなければfalseを返す。

  2. name, value)がCORSセーフリストリクエストヘッダーかどうかを返す。

ヘッダーname, value)が禁止リクエストヘッダーかどうかは、次の手順でtrueなら該当します:

  1. nameが、次のいずれかにバイト大小区別なしで一致すればtrueを返す:

    該当すればtrueを返す。

  2. nameバイト小文字化し、`proxy-`または`sec-`で始まる場合、trueを返す。

  3. nameが、次のいずれかにバイト大小区別なしで一致すれば:

    • `X-HTTP-Method`
    • `X-HTTP-Method-Override`
    • `X-Method-Override`

    その場合:

    1. parsedValues取得・デコード・分割したvalueの結果を格納する。

    2. parsedValuesmethodについて、 そのisomorphic encode禁止メソッドであればtrueを返す。

  4. falseを返す。

これらはユーザーエージェントが完全に制御できるようにするために禁止されています。

ヘッダー名が`Sec-`で始まるものは、新しいヘッダーをAPIで開発者が制御できるfetch系API(例:XMLHttpRequest)で安全に追加できるように予約されています。[XHR]

`Set-Cookie`ヘッダーは意味的にはレスポンスヘッダーであり、リクエストには不要です。また、`Set-Cookie`ヘッダーは結合できないため、Headersオブジェクトではより複雑な処理が必要となります。ここで禁止することで、この複雑さがリクエストに漏れないようにしています。

禁止レスポンスヘッダー名は、ヘッダー名であり、バイト大小区別なしで以下のいずれかに一致するものです。

リクエストボディヘッダー名は、ヘッダー名であり、バイト大小区別なしで以下のいずれかに一致するものです。


ヘッダー headerに対してヘッダー値を抽出するには次の手順を実行します:

  1. headerを、そのheader名前に該当するABNFでパースして失敗したらfailureを返す。

  2. headerを、そのheader名前に該当するABNFでパースした結果の1つ以上の値を返す。

ヘッダー名 nameヘッダーリスト listを与えてヘッダーリスト値を抽出するには次の手順を実行します:

  1. listname含まない場合、nullを返す。

  2. nameに該当するABNFが単一のヘッダーしか許可しない場合、かつlistが複数含む場合はfailureを返す。

    異なるエラー処理が必要な場合は、先に必要なヘッダーを抽出してください。

  3. valuesを空のリストとする。

  4. listnameヘッダーを含む各headerについて:

    1. extractheaderからヘッダー値を抽出した結果を格納する。

    2. extractがfailureならfailureを返す。

    3. extract内の各を順番にvaluesへ追加する。

  5. valuesを返す。

整数rangeStart、整数rangeEnd、整数fullLengthを与えてコンテンツレンジを構築するには、次の手順を実行します:

  1. contentRangeを`bytes `とする。

  2. rangeStart直列化し、isomorphic encodeしてcontentRangeに追加する。

  3. 0x2D (-) をcontentRangeに追加する。

  4. rangeEnd直列化し、isomorphic encodeしてcontentRangeに追加する。

  5. 0x2F (/) をcontentRangeに追加する。

  6. fullLength直列化し、isomorphic encodeしてcontentRangeに追加する。

  7. contentRangeを返す。

バイト列 valueと真偽値allowWhitespaceを与えて単一レンジヘッダー値のパースを行うには、次の手順を実行します:

  1. datavalueisomorphic decodeした結果を格納する。

  2. dataが"bytes"で始まらない場合、failureを返す。

  3. positiondataの5番目の符号位置を指す位置変数として初期化する。

  4. allowWhitespaceがtrueなら、HTTPタブまたはスペースdatapositionから収集する。

  5. positiondataにおける符号位置がU+003D (=)でなければfailureを返す。

  6. positionを1進める。

  7. allowWhitespaceがtrueなら、HTTPタブまたはスペースdatapositionから収集する。

  8. rangeStartdatapositionからASCII数字の列を収集した結果を格納する。

  9. rangeStartValuerangeStartが空でなければ10進数として解釈した値を、空ならnullを格納する。

  10. allowWhitespaceがtrueなら、HTTPタブまたはスペースdatapositionから収集する。

  11. positiondataにおける符号位置がU+002D (-)でなければfailureを返す。

  12. positionを1進める。

  13. allowWhitespaceがtrueなら、HTTPタブまたはスペースdatapositionから収集する。

  14. rangeEnddatapositionからASCII数字の列を収集した結果を格納する。

  15. rangeEndValuerangeEndが空でなければ10進数として解釈した値を、空ならnullを格納する。

  16. positiondataの末尾を過ぎていなければfailureを返す。

  17. rangeEndValuerangeStartValueが両方nullならfailureを返す。

  18. rangeStartValuerangeEndValueが数値で、rangeStartValuerangeEndValueより大きければfailureを返す。

  19. (rangeStartValue, rangeEndValue)を返す。

    rangeのendまたはstartは省略可能であり、`bytes=0-`や`bytes=-500`も有効なレンジです。

単一レンジヘッダー値のパースは許可されるレンジヘッダー値の一部でしか成功しませんが、ユーザーエージェントがメディアやダウンロード再開時に使用する最も一般的な形式です。この形式のレンジヘッダー値はRangeヘッダーを追加で設定できます。


デフォルト`User-Agent`値は、`User-Agent`ヘッダーに対する実装依存ヘッダー値です。

不幸なウェブ互換性の理由から、ウェブブラウザーはこの値を `Mozilla/5.0 (` で始めること、そして他のウェブブラウザーを一般的に模倣することが強く推奨されています。

環境設定オブジェクト environment環境のデフォルト `User-Agent` 値 を取得するには、次の手順に従う:

  1. userAgentWebDriver BiDi エミュレートされた User-Agentenvironment 用)として取得する。

  2. userAgent が非 null であれば、userAgentisomorphic encode されたものとして返す。

  3. デフォルトの `User-Agent` 値 を返す。

ドキュメント`Accept`ヘッダー値は `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`です。

2.2.3. ステータス

ステータスは、0から999までの整数です。

HTTP/1のstatus-codeをこの概念にマッピングする際の様々な端ケースについては、issue #1156で対応中です。

nullボディステータスは、 ステータスが101、103、204、205、または304の場合です。

OKステータスは、ステータスが200から299までの範囲の場合です。

range status(レンジステータス) は、206 または 416 の ステータス です。

redirect status(リダイレクトステータス) は、301、302、 303、307、または 308 の ステータス です。

2.2.4. ボディ

ボディは次の要素から成ります:

ボディ body複製するには、次の手順を実行します:

  1. « out1, out2 »をbodyストリームに対してteeした結果とする。

  2. bodyストリームout1に設定する。

  3. 他のメンバーはbodyからコピーし、ボディstreamout2のものを返す。

バイト列 bytesボディとして取得するには、安全に抽出したbytesボディを返す。


ボディ body逐次的に読み込むには、アルゴリズムprocessBodyChunk、アルゴリズムprocessEndOfBody、アルゴリズムprocessBodyError、および省略可能なnull/並列キューまたはグローバルオブジェクト taskDestination(デフォルトnull)を与えて、次の手順を実行します。 processBodyChunkバイト列を受け取るアルゴリズム、processEndOfBodyは引数なしアルゴリズム、processBodyErrorは例外を受け取るアルゴリズムでなければなりません。

  1. taskDestinationがnullなら、新しい並列キューの開始の結果をtaskDestinationに設定する。

  2. readerbodyストリームに対してリーダーの取得を実行した結果を格納する。

    この操作で例外はスローされません。

  3. 逐次読み込みループreadertaskDestinationprocessBodyChunkprocessEndOfBodyprocessBodyErrorで実行する。

ReadableStreamDefaultReader オブジェクトreader並列キューまたはグローバルオブジェクト taskDestination、アルゴリズムprocessBodyChunk、アルゴリズムprocessEndOfBody、アルゴリズムprocessBodyErrorを与えて逐次読み込みループを実行するには:

  1. readRequestを次の読取リクエストとする:

    chunk stepschunkを与えて)
    1. continueAlgorithmをnullとする。

    2. chunkUint8Array オブジェクトでなければ、continueAlgorithmを「processBodyErrorTypeErrorを与えて実行する」に設定する。

    3. それ以外の場合:

      1. byteschunkコピーを格納する。

        実装側は可能な限りこのコピーを避ける戦略を推奨します。

      2. continueAlgorithmを次の手順に設定する:

        1. processBodyChunkbytesを与えて実行する。

        2. 逐次読み込みループreadertaskDestinationprocessBodyChunkprocessEndOfBodyprocessBodyErrorで実行する。

    4. fetchタスクをキューcontinueAlgorithmtaskDestinationを与えて実行する。

    close steps
    1. fetchタスクをキューprocessEndOfBodytaskDestinationを与えて実行する。

    error stepseを与えて)
    1. fetchタスクをキューprocessBodyErroreを与え、taskDestinationで実行する。

  2. チャンクの読み取りreaderreadRequestを与えて実行する。

ボディ body完全に読み込むには、アルゴリズムprocessBody、アルゴリズムprocessBodyError、および省略可能なnull/並列キューまたはグローバルオブジェクト taskDestination(デフォルトnull)を与えて、次の手順を実行します。processBodyバイト列を受け取るアルゴリズム、processBodyErrorはオプションで例外を受け取るアルゴリズムでなければなりません。

  1. taskDestinationがnullなら、新しい並列キューの開始の結果をtaskDestinationに設定する。

  2. successStepsバイト列 bytesを受け取り、 fetchタスクをキューprocessBodybytesを与えtaskDestinationで実行する手順とする。

  3. errorStepsを(オプションの例外 exceptionを受け取り) fetchタスクをキューprocessBodyErrorexceptionを与えtaskDestinationで実行する手順とする。

  4. readerbodyストリームに対してリーダーの取得を実行した結果を格納する。例外が発生した場合、errorStepsをその例外で実行し終了する。

  5. 全バイトの読み取りreadersuccessStepserrorStepsを与えて実行する。


型付きボディは、タプルであり、 ボディボディ)と ヘッダー値またはnull)から構成されます。


codingsbytesを与えてコンテンツ符号化の処理を行うには、次の手順を実行します:

  1. codingsがサポートされていなければ、bytesを返す。

  2. HTTPの説明通りにcodingsbytesをデコードした結果(エラーでなければ)を返し、デコードに失敗したらfailureを返す。[HTTP]

2.2.5. リクエスト

この節ではリクエストの詳細な動作を記述します。導入は リクエストのセットアップを参照してください。

fetchの入力はリクエストです。

リクエストには、関連付けられたメソッドメソッド)があります。特に記載がない限り、`GET`です。

これはリダイレクト時にGETへ更新される場合があります。詳細はHTTP fetchを参照。

リクエストには、関連付けられたURLURL)があります。

実装はこれをURLのリストの最初の要素へのポインタとしてもよいです。これはFetchにフックする他仕様の便宜のためだけに独立したフィールドとして提供されています。

リクエストには、関連付けられたローカルURLのみフラグがあります。特に記載がない限り、未設定です。

リクエストには、関連付けられたヘッダーリストヘッダーリスト)があります。特に記載がない限り、« » です。

リクエストには、関連付けられたunsafe-requestフラグがあります。特に記載がない限り、未設定です。

unsafe-requestフラグは、 fetch()XMLHttpRequest などのAPIによって設定され、指定されたメソッドヘッダーリストに基づいて CORSプリフライトフェッチが確実に行われるようにします。 ただし、APIが禁止メソッド禁止リクエストヘッダーを認めない義務から解放されるわけではありません。

リクエストには、関連付けられたボディ(null、バイト列、またはボディ)があります。特に記載がない限り、nullです。

バイト列は、安全に抽出されて早い段階でボディになります。HTTP fetchの一部として、特定のリダイレクトでこのフィールドがnullになる場合があります。


リクエストには、関連付けられたクライアント(nullまたは環境設定オブジェクト)があります。

リクエストには、関連付けられた予約クライアント(null、環境、または環境設定オブジェクト)。特に記載がない限り、nullです。

これはナビゲーションリクエストやワーカーリクエストのみで使われ、サービスワーカリクエストでは使われません。ナビゲーションリクエストでは環境、ワーカーリクエストでは環境設定オブジェクトを参照します。

リクエストには、関連付けられたクライアント置換ID(文字列)があります。特に記載がない限り、空文字列です。

これはナビゲーションリクエストでのみ使われます。IDは、ターゲット閲覧コンテキストアクティブドキュメント環境設定オブジェクトのIDです。

リクエストには、関連付けられたユーザプロンプト用トラバーサブルがあり、 "no-traversable"、"client"、またはトラバーサブルナビゲーブルです。特に記載がない限り"client"です。

これは、認証プロンプトやクライアント証明書ダイアログなど、リクエストに関連するUIを表示するか、どこに表示するかを決定するために使われます。

"no-traversable"
UIは表示されません。通常、このリクエストはネットワークエラーで失敗します。
"client"
この値は、トラバーサブルナビゲーブルまたは"no-traversable"にfetch処理中に自動的に変更されます。これによって他の標準仕様が明示的に設定しなくても済みます。
トラバーサブルナビゲーブル
表示されるUIは、そのトラバーサブルナビゲーブルを表示しているブラウザインターフェース要素に関連付けられます。

リクエストに関連するユーザーインターフェースをそのリクエストのユーザプロンプト用トラバーサブルで表示する場合、ユーザーエージェントはアドレスバーをリクエストの現在のURLに由来する値(例えば、リクエストの発起元のURLではなく)で更新すべきです。また、特にクロスオリジンリクエストの場合、ユーザーエージェントはプロンプトの背後にリクエストの発起元コンテンツを表示しないようにすべきです。このようなプロンプトの背後は空白ページにするのがよいでしょう。これらの指針に従わないと、どのオリジンがプロンプトの責任を持つのかユーザーが混乱します。

リクエストには、関連付けられたboolean型のkeepaliveがあります。特に記載がない限り、falseです。

これは、例えばnavigator.sendBeacon()やHTMLのimg要素のように、リクエストが環境設定オブジェクトより長寿命になることを許可するために使われます。これがtrueの場合、追加の処理要件が課されます。

リクエストには、関連付けられたinitiator typeがあり、null、"audio"、"beacon"、"body"、"css"、"early-hints"、"embed"、"fetch"、"font"、"frame"、"iframe"、"image"、"img"、"input"、"link"、"object"、"ping"、"script"、"track"、"video"、"xmlhttprequest"、"other"のいずれかです。特に記載がない限りnullです。[RESOURCE-TIMING]

リクエストには、関連付けられたservice-workersモードがあり、"all"または"none"です。特に記載がない限り、"all"です。

これは、このフェッチに対してどのサービスワーカーがfetchイベントを受け取るかを決定します。

"all"
関連するサービスワーカーはこのフェッチに対するfetchイベントを受け取ります。
"none"
どのサービスワーカーもこのフェッチに対してイベントを受け取りません。

リクエストには、関連付けられたinitiatorがあり、空文字列、"download"、"imageset"、"manifest"、"prefetch"、"prerender"、または"xslt"のいずれかです。特に記載がない限り空文字列です。

リクエストinitiatorは今のところあまり細かく分かれていません。他の仕様がそれを必要としていないためです。これは主にCSPや混在コンテンツを定義するための仕様上の補助的な属性です。JavaScriptには公開されません。[CSP] [MIX]

宛先タイプは、 次のいずれかである: 空文字列、 「audio」、 「audioworklet」、 「document」、 「embed」、 「font」、 「frame」、 「iframe」、 「image」、 「json」、 「manifest」、 「object」、 「paintworklet」、 「report」、 「script」、 「serviceworker」、 「sharedworker」、 「style」、 「text」、 「track」、 「video」、 「webidentity」、 「worker」、 または 「xslt」。

リクエストには、関連付けられたdestinationdestination type)があります。特に記載がない限り空文字列です。

これらはRequestDestinationで反映されますが、"serviceworker"と"webidentity"は該当しません。これらのdestinationではサービスワーカーをスキップします。

リクエストdestinationscript-likeとなるのは、"audioworklet"、"paintworklet"、"script"、"serviceworker"、"sharedworker"、または"worker"の場合です。

script-likeを利用するアルゴリズムは、"xslt"もスクリプト実行の原因となり得るため考慮すべきです。ただし、常に該当するとは限らず異なる動作が必要な場合があるためリストには含まれていません。

次の表は、リクエストinitiatordestination、CSPディレクティブ、および各機能との関係を示しています。機能については網羅的ではありません。各機能は、それぞれの現行標準で関連値を定義する必要があります。

Initiator Destination CSPディレクティブ 機能
"" "report" CSP、NELレポート
"document" HTMLのnavigateアルゴリズム(トップレベルのみ)
"frame" child-src HTMLの<frame>
"iframe" child-src HTMLの<iframe>
"" connect-src navigator.sendBeacon()EventSource、 HTMLの<a ping="">および<area ping="">fetch()fetchLater()XMLHttpRequestWebSocketWebTransport、 Cache API
"object" object-src HTMLの<object>
"embed" object-src HTMLの<embed>
"audio" media-src HTMLの<audio>
"font" font-src CSSの@font-face
"image" img-src HTMLの<img src>/favicon.icoリソース、 SVGの<image>、CSSのbackground-image、CSSの cursor、CSSのlist-style-image、…
"audioworklet" script-src audioWorklet.addModule()
"paintworklet" script-src CSS.paintWorklet.addModule()
"script" script-src HTMLの<script>importScripts()
"serviceworker" child-srcscript-srcworker-src navigator.serviceWorker.register()
"sharedworker" child-srcscript-srcworker-src SharedWorker
"webidentity" connect-src Federated Credential Management requests
"worker" child-srcscript-srcworker-src Worker
"json" connect-src import "..." with { type: "json" }
"style" style-src HTMLの<link rel=stylesheet>、CSSの@importimport "..." with { type: "css" }
"text" connect-src import "..." with { type: "text" }
"track" media-src HTMLの<track>
"video" media-src HTMLの<video>要素
"download" "" HTMLのdownload=""、"リンク先を名前を付けて保存…" UI
"imageset" "image" img-src HTMLの<img srcset><picture>
"manifest" "manifest" manifest-src HTMLの<link rel=manifest>
"prefetch" "" default-src(特定ディレクティブなし) HTMLの<link rel=prefetch>
"prerender" HTMLの<link rel=prerender>
"xslt" "xslt" script-src <?xml-stylesheet>

CSPのform-actionはHTMLのnavigateやフォーム送信アルゴリズムに直接フックする必要があります。

CSPはまた、リクエストクライアントグローバルオブジェクト対応するDocument祖先ナビゲーブルも、さまざまなCSPディレクティブで確認する必要があります。


リクエストには、関連付けられた priorityがあり、"high"、"low"、"auto"のいずれかです。特に記載がない限り"auto"です。

リクエストには、関連付けられた 内部priority(nullまたは 実装依存オブジェクト)があります。特に記載がない限りnullです。

リクエストには、関連付けられた originがあり、 "client"またはオリジンです。特に記載がない限り"client"です。

"client"はオリジンにfetch処理中に変更されます。これにより、他の標準が リクエストoriginを明示的に設定しなくても済みます。

リクエストには、関連付けられた トップレベルナビゲーションinitiatorのoriginがあり、 オリジン またはnullです。特に記載がない限りnullです。

リクエストには、関連付けられた ポリシーコンテナがあり、 "client"またはポリシーコンテナです。特に記載がない限り"client"です。

"client"はポリシーコンテナにfetch処理中に変更されます。これにより、他の標準が リクエストポリシーコンテナを明示的に設定しなくても済みます。

リクエストには、関連付けられた referrerがあり、 "no-referrer"、"client"またはURLです。特に記載がない限り "client"です。

"client"はfetch処理中に"no-referrer"またはURLに変更されます。これにより、他の標準が リクエストreferrerを明示的に設定しなくても済みます。

リクエストには、関連付けられた referrer policyがあり、 referrer policyです。特に記載がない限り空文字列です。[REFERRER]

これは、このリクエストに使うreferrer policyを上書きするために使えます。

リクエストには、 関連付けられた mode(モード)が存在します。これは "same-origin"、"cors"、"no-cors"、 "navigate"、"websocket" または "webtransport" のいずれかです。 特に指定がない限り、"no-cors" です。

"same-origin"
同一オリジンのURLへのリクエストを保証するために使われます。fetchは、リクエストが同一オリジンURLでない場合、ネットワークエラーを返します。
"cors"
レスポンスタインティングが"cors"に設定されるリクエストの場合、このリクエストをCORSリクエストとし、リソースがCORSプロトコルに対応しなかったり、意図的に不参加の場合はネットワークエラーを返します。
"no-cors"
CORSセーフリストメソッドおよびCORSセーフリストリクエストヘッダーのみ利用可能に制限。成功時はopaque filtered responseを返します。
"navigate"
これは、ドキュメントのナビゲーション時にのみ使われる特別なモードです。
"websocket"
これは、WebSocket接続の確立時にのみ使われる特別なモードです。
"webtransport"
これは、WebTransport(url, options)のみで使用される特別なモードです。

デフォルトのリクエストmodeは"no-cors"ですが、新しい機能ではこれを使わないことが強く推奨されます。これは非常に安全ではありません。

リクエストには、関連付けられた use-CORS-preflightフラグがあります。特に記載がない限り、未設定です。

use-CORS-preflightフラグが設定されている場合、CORSプリフライトリクエストとなる条件の一つです。このフラグは、XMLHttpRequestUpload オブジェクトに1つ以上のイベントリスナーが登録されている場合や、リクエストにReadableStream オブジェクトが使用されている場合に設定されます。

リクエストには、関連付けられた credentials modeがあり、 "omit"、"same-origin"、"include"のいずれかです。特に記載がない限り、"same-origin"です。

"omit"
このリクエストから認証情報(credentials)を除外し、レスポンスで送信された認証情報も無視します。
"same-origin"
同一オリジンのURLへのリクエストには認証情報を含め、同一オリジンからのレスポンスの認証情報も利用します。
"include"
常にこのリクエストに認証情報を含め、レスポンスに含まれる認証情報も常に利用します。

リクエストcredentials modeは、認証情報fetch中の流れを制御します。リクエストmodeが"navigate"の場合、そのcredentials modeは"include"とみなされ、fetchは現状他の値を考慮しません。HTML側の仕様変更があれば、この標準も対応が必要です。

リクエストには、関連付けられた use-URL-credentialsフラグがあります。特に記載がない限り、未設定です。

このフラグが設定されている場合、リクエストURLユーザー名パスワードがあり、利用可能な認証エントリがある場合、URLの認証情報が認証エントリより優先されます。URLに認証情報を含めることは推奨されていないため、現行の仕様ではこのフラグを設定しないことが多いですが、互換性のため古い機能で設定される場合があります。

リクエストには、関連付けられた cache modeがあり、 "default"、"no-store"、"reload"、"no-cache"、"force-cache"、"only-if-cached"のいずれかです。特に記載がない限り"default"です。

"default"
Fetchはネットワークに行く前にHTTPキャッシュを確認します。HTTPキャッシュに一致する新鮮なレスポンスがあればそれを返します。一致するstale-while-revalidateレスポンスがあればそれを返しつつ条件付きネットワークリクエストを送りキャッシュを更新します。一致する古いレスポンスがあれば条件付きネットワークリクエストを返します。それ以外は非条件付きネットワークリクエストを返します。[HTTP] [HTTP-CACHING] [STALE-WHILE-REVALIDATE]
"no-store"
FetchはHTTPキャッシュがまったく存在しないかのように動作します。
"reload"
Fetchはネットワークに行く前にHTTPキャッシュがないかのように動作します。つまり、通常のリクエストを作成し、レスポンスでHTTPキャッシュを更新します。
"no-cache"
HTTPキャッシュにレスポンスがあれば条件付きリクエストを作成し、なければ通常のリクエストを作成します。その後レスポンスでHTTPキャッシュを更新します。
"force-cache"
Fetchはリクエストに一致するHTTPキャッシュ内のレスポンスを鮮度に関係なく使用します。なければ通常のリクエストを作成し、レスポンスでキャッシュを更新します。
"only-if-cached"
Fetchはリクエストに一致するHTTPキャッシュ内のレスポンスを鮮度に関係なく使用します。なければネットワークエラーを返します(このモードはリクエストmodeが"same-origin"の場合のみ使用可能)。キャッシュされたリダイレクトはリクエストredirect modeが"follow"で、そのリダイレクトがリクエストmodeに違反しない場合にのみ追従されます。

ヘッダーリスト含む `If-Modified-Since`, `If-None-Match`, `If-Unmodified-Since`, `If-Match`, または `If-Range` のいずれかが含まれる場合、fetchcache modeを"default"なら"no-store"に設定します。

リクエストには、関連付けられた redirect modeがあり、 "follow"、"error"、"manual"のいずれかです。特に記載がない限り"follow"です。

"follow"
リソースのフェッチ時に発生したすべてのリダイレクトを追従します。
"error"
リクエストがリダイレクトに遭遇した場合、ネットワークエラーを返します。
"manual"
サービスワーカーがリダイレクトをオフラインで再現できるよう、リダイレクトに遭遇した際にopaque-redirect filtered responseを返します。それ以外はネットワークエラーと区別できません。atomic HTTPリダイレクト処理に違反しないようにしています。

リクエストには、関連付けられた integrity metadata (文字列)があります。特に記載がない限り、空文字列です。

リクエストには、関連付けられた 暗号ノンスmetadata (文字列)があります。特に記載がない限り、空文字列です。

リクエストには、関連付けられた パーサmetadata (空文字列、"parser-inserted"、または"not-parser-inserted")があります。特に記載がない限り、空文字列です。

リクエスト暗号ノンスmetadataおよびパーサmetadataは、通常、リクエストを生成したHTML要素の属性やフラグから設定されます。これらはContent Security Policyの様々なアルゴリズムで、リクエストやレスポンスが特定のコンテキストでブロックされるかどうかの判定に使われます。[CSP]

リクエストには、関連付けられた reload-navigationフラグがあります。特に記載がない限り、未設定です。

このフラグはHTMLのnavigateアルゴリズム専用です。[HTML]

リクエストには、関連付けられた history-navigationフラグがあります。特に記載がない限り、未設定です。

このフラグはHTMLのnavigateアルゴリズム専用です。[HTML]

リクエストには、関連付けられた boolean型のuser-activationがあります。特に記載がない限り、falseです。

これはHTMLのnavigateアルゴリズム専用です。[HTML]

リクエストは、 関連付けられたWebDriver navigation id (null または文字列)を持つ。特に断りのない限り、これは null である。

これは HTML の navigate アルゴリズム専用である。[HTML]

リクエストは、 関連付けられた真偽値の render-blocking を持つ。特に断りのない限り、これは false である。

このフラグは HTML の render-blocking 機構専用である。[HTML]

リクエストは、 関連付けられた WebTransport-hash listWebTransport-hash list)を持つ。特に断りのない限り、これは « » である。

WebTransport-hash list は、0 個以上の WebTransport-hash からなる リスト である。

WebTransport-hash は、タプル であり、 algorithm文字列)と、 valueバイト列)から構成される。

このリストは、WebTransport(url, options) において、 optionsserverCertificateHashes を含む場合にのみ使用される。


リクエストは、 関連付けられた URL list(1 個以上の URL からなる リスト)を持つ。特に断りのない限り、これは リクエストURL のコピーを含むリストである。

リクエストは、 関連付けられた current URL を持つ。これは、 リクエストURL list 内の最後の URL を指すポインタである。

リクエストは、 関連付けられた redirect count を持つ。特に断りのない限り、これは 0 である。

リクエストは、 関連付けられた response tainting を持ち、これは "basic"、"cors"、または "opaque" である。 特に断りのない限り、これは "basic" である。

リクエストは、 関連付けられた prevent no-cache cache-control header modification flag を持つ。特に断りのない限り、これは未設定である。

リクエストは、 関連付けられた done flag を持つ。特に断りのない限り、これは未設定である。

リクエストは、 関連付けられた timing allow failed flag を持つ。特に断りのない限り、これは未設定である。

リクエストには、 関連付けられた ナビゲーションタイミング許可値リストリストリストであり、各要素は文字列)がある。 別段の定めがない限り、それは « » である。

項目それぞれは、ナビゲーションタイミング許可値リスト内で、 ナビゲーションのリダイレクトチェーンにある1つのリダイレクトレスポンスの `Timing-Allow-Origin` 値を保持する。

リクエストURLリスト現在のURLリダイレクト数レスポンス 汚染完了フラグタイミング許可失敗フラグ、および ナビゲーションタイミング許可値リストは、 fetchアルゴリズムによって、 帳簿付けの詳細として用いられる。

リクエストには、 関連付けられた WebDriver id がある。これはランダムUUIDを生成する結果であり、リクエストが 作成されるときに設定される。[WEBCRYPTO]

WebDriver idはWebDriver-BiDiによって用いられる。これは、 初期リクエストのリダイレクト、認証試行、およびCORS-preflight fetchを通じて一定のままである。 リクエストが複製されると、作成されたリクエストには一意の WebDriver idが与えられる。[WEBDRIVER-BIDI]


サブリソースリクエスト とは、リクエストであって、 その宛先が "audio"、 "audioworklet"、 "font"、"image"、"json"、"manifest"、 "paintworklet"、"script"、"style"、"text"、 "track"、"video"、"xslt"、または空文字列であるものをいう。

非サブリソース リクエストとは、リクエストであって、 その宛先が "document"、 "embed"、 "frame"、"iframe"、"object"、"report"、 "serviceworker"、"sharedworker"、または "worker" であるものをいう。

ナビゲーションリクエスト とは、リクエストであって、 その 宛先が "document"、"embed"、"frame"、"iframe"、 または "object" であるものをいう。

これらの用語の使用については、handle fetchを参照。 [SW]


リクエスト requestredirect-taintを計算するには、次の手順を実行する。 それらは "same-origin"、"same-site"、または "cross-site" を返す。

  1. Assert: requestoriginは "client" ではない。

  2. lastURLをnullとする。

  3. taintを "same-origin" とする。

  4. requestURLリストの各urlについて、反復する:

    1. lastURLがnullなら、lastURLurlに設定し、 continueする。

    2. urloriginが、 lastURLoriginsame siteではなく、かつrequestoriginlastURLoriginsame siteでないなら、 "cross-site" を返す。

    3. urloriginが、 lastURLoriginsame originではなく、かつrequestoriginlastURLoriginsame originでないなら、 taintを "same-site" に設定する。

    4. lastURLurlに設定する。

  5. taintを返す。

リクエストrequestが与えられたとき、 リクエストオリジンの直列化は、 次の手順を実行することである:

  1. Assert: requestoriginは "client" ではない。

  2. requestredirect-taintが "same-origin" でないなら、 "null" を返す。

  3. requestoriginを、 直列化したものを返す。

リクエスト requestが与えられたとき、 リクエストオリジンのバイト直列化は、 requestを用いてリクエストオリジンを直列化する結果を 同型エンコードしたものを返すことである。


リクエスト request複製するには、次の手順を実行する:

  1. newRequestを、requestのコピーとする。ただし、その body およびWebDriver idを除く。

  2. newRequestWebDriver idを、 ランダムUUIDを生成する結果に設定する。[WEBCRYPTO]

  3. requestbodyが非nullなら、newRequestbody を、requestbody複製する結果に設定する。

  4. newRequestを返す。


リクエスト requestに、整数firstと、省略可能な整数 lastを用いて、 範囲ヘッダーを追加するには、次の手順を実行する:

  1. Assert: lastが与えられていない、またはfirstlast以下である。

  2. rangeValueを `bytes=` とする。

  3. first直列化して同型エンコードし、 その結果をrangeValueに付加する。

  4. 0x2D (-) をrangeValueに付加する。

  5. lastが与えられているなら、それを直列化して 同型エンコードし、その結果を rangeValueに付加する。

  6. (`Range`、 rangeValue) を requestヘッダーリスト付加する

範囲ヘッダーは包含的なバイト範囲を表す。 firstが0でlastが500である範囲ヘッダーは、501バイトの範囲である。

複数のレスポンスを1つの論理リソースに結合する機能は、歴史的に セキュリティバグの原因となってきた。部分レスポンスを扱う機能については、セキュリティレビューを求めること。


レスポンス responseが与えられたとき、 報告用にレスポンスURLを直列化するには、次の手順を実行する:

  1. Assert: responseURLリスト空ではない

  2. urlを、responseURLリスト[0]のコピーとする。

    これは、リダイレクト先についての情報漏えいを避けるため、 responseURLではない (CSP報告における同様の考慮事項も参照)。 [CSP]

  3. urlが与えられたものとして、ユーザー名を設定する。値は空文字列とする。

  4. urlが与えられたものとして、パスワードを設定する。値は空文字列とする。

  5. exclude fragmentをtrueに設定して、 url直列化を返す。

リクエスト requestが与えられたとき、 Cross-Origin-Embedder-Policyが 資格情報を許可するかどうかを確認するには、次の手順を実行する:

  1. Assert: requestoriginは "client" ではない。

  2. requestmodeが "no-cors" でないなら、trueを返す。

  3. requestclientがnullなら、trueを返す。

  4. requestclientポリシーコンテナー埋め込みポリシーが "credentialless" でないなら、trueを返す。

  5. requestoriginが、 request現在のURLoriginsame originであり、かつrequestredirect-taintが "same-origin" でないなら、trueを返す。

  6. falseを返す。

2.2.6. レスポンス

fetchの結果は レスポンスである。レスポンスは 時間とともに変化する。すなわち、そのすべてのフィールドが直ちに利用可能になるわけではない。

レスポンスには、 関連付けられた typeがあり、これは "basic"、 "cors"、 "default"、 "error"、 "opaque"、または "opaqueredirect" である。 別段の定めがない限り、それは "default" である。

レスポンスは、 関連付けられた 中止フラグを持つことができ、これは初期状態では未設定である。

これは、そのリクエストが開発者または エンドユーザーによって意図的に中止されたことを示す。

レスポンスには、 関連付けられた URLがある。これは、 レスポンスURL リスト内の最後の URLへの ポインターであり、 レスポンスURL リスト空である場合はnullである。

レスポンスには、 関連付けられた URLリスト(0個以上の URLからなるリスト)がある。 別段の定めがない限り、それは « » である。

最初と最後の URLを除き、存在する場合でも、レスポンスURL リストはスクリプトに直接公開されない。そうすると アトミックHTTPリダイレクト処理に違反するためである。

レスポンスには、 関連付けられた statusがあり、これはstatusである。 別段の定めがない限り、それは200である。

レスポンスには、 関連付けられた status messageがある。別段の定めがない限り、 それは空のバイト列である。

HTTP/2接続上のレスポンスは常に、status messageとして空のバイト列を持つ。HTTP/2はそれらをサポートしないためである。

レスポンスには、 関連付けられた ヘッダーリストヘッダーリスト)がある。 別段の定めがない限り、それは « » である。

レスポンスには、 関連付けられた body(nullまたは body)がある。別段の定めがない限り、 それはnullである。

ネットワークの レスポンスbodyにおける sourceおよびlengthの概念は、常にnullである。

レスポンスには、 関連付けられた キャッシュ状態(空文字列、 "local"、または "validated")がある。別段の定めがない限り、それは空の 文字列である。

これはService Workersおよび Resource Timingによる使用を意図している。[SW] [RESOURCE-TIMING]

レスポンスには、 関連付けられた CORS公開ヘッダー名リスト (0個以上のヘッダー からなるリスト)がある。このリストは、 別段の指定がない限り空である。

レスポンスは通常、 `Access-Control-Expose-Headers` ヘッダーから ヘッダー値を抽出することで、 その CORS公開ヘッダー名リストが設定される。 このリストは、 CORSフィルター済みレスポンスによって、どのヘッダーを 公開するかを決定するために用いられる。

レスポンスには、 関連付けられた 範囲要求済みフラグがあり、これは 初期状態では未設定である。

これは、範囲リクエストを行っていないAPIに対して、以前の範囲リクエストからの 部分レスポンスが提供されるのを防ぐために用いられる。この攻撃の詳細な説明については、 このフラグの使用箇所を参照。

レスポンスには、 関連付けられたrequest-includes-credentials (真偽値)があり、これは初期状態ではtrueである。

レスポンスには、 関連付けられた タイミング許可通過フラグがあり、これは 初期状態では未設定である。

これは、fetchの呼び出し元が、返されたレスポンスのフラグを見ることで、 取得されたリソースについて機微なタイミングデータが許可されているかどうかを判断できるようにするために用いられる。 リダイレクトのレスポンスにおけるフラグは、リダイレクトチェーン内の以前のレスポンスで設定されていた場合には 設定されなければならないため、これは内部的にもリクエストのタイミング許可失敗フラグを用いて追跡される。

レスポンスには、 関連付けられた ナビゲーションタイミング許可値リストリストリストであり、各要素は文字列)がある。 別段の定めがない限り、それは « » である。

これは、ナビゲーションのリダイレクトチェーン内の各リダイレクト レスポンスの `Timing-Allow-Origin` 値を保持する。これは、呼び出し元が、 ナビゲーションの宛先オリジンが判明した後に、そのオリジンがリダイレクトチェーン内のすべての リダイレクトによって許可されているかどうかを判断できるようにするために用いられる。

レスポンスには、 関連付けられた body inforesponse body info)がある。別段の定めがない限り、それは新しい response body infoである。

レスポンスには、 関連付けられた service worker timing info(nullまたは service worker timing info)があり、これは初期状態ではnullである。

レスポンスには、 関連付けられたredirect taint ("same-origin"、"same-site"、または "cross-site")があり、これは 初期状態では "same-origin" である。


ネットワークエラーとは、 レスポンスであって、 その typeが "error"、statusが0、 status messageが空のバイト列、 ヘッダーリストが « »、bodyがnull、かつ body infoが新しいresponse body infoであるものをいう。

中止された ネットワークエラーとは、 ネットワークエラーであって、 その中止 フラグが設定されているものをいう。

fetch params fetchParamsが与えられたとき、 適切なネットワークエラーを作成するには:

  1. Assert: fetchParamsキャンセル済みである。

  2. fetchParams中止済みである場合は中止されたネットワークエラーを返し、 そうでない場合はネットワークエラーを返す。


フィルター済み レスポンスとは、関連付けられたレスポンスに対する限定されたビューを提供する レスポンスである。この関連付けられた レスポンスは、 フィルター済みレスポンス内部レスポンスレスポンスであって、 ネットワーク エラーでも フィルター済み レスポンスでもないもの)を通じてアクセスできる。

別段の定めがない限り、フィルター済みレスポンスの関連概念(たとえばその body)は、 その 内部 レスポンスの関連概念を参照する。(これに対する例外は、フィルター済みレスポンスの具体的な型を定義する一部として 以下に列挙される。)

fetchアルゴリズムは、 processResponseおよび 同等のパラメーターを介して、呼び出し元にフィルター済みレスポンスを公開し、情報を 誤って漏えいしないようにする。レガシー上の理由、たとえば画像データをデコーダーに渡すために、 情報を明らかにする必要がある場合は、関連付けられた内部レスポンスを 仕様アルゴリズムで使用できる。

新しい仕様は、opaque filtered responsesまたは opaque-redirect filtered responsesの上に さらに構築すべきではない。これらはレガシー構成要素であり、現代のコンピューターアーキテクチャを考えると、 常に十分に保護できるとは限らない。

basic filtered responseとは、 フィルター済み レスポンスであって、その typeが "basic" であり、 ヘッダーリストが、 内部 レスポンスヘッダーリスト内にある ヘッダーのうち、 その name禁止レスポンスヘッダー名であるものを除外するものをいう。

CORS filtered responseとは、 フィルター済み レスポンスであって、その typeが "cors" であり、 ヘッダーリストが、 内部 レスポンスヘッダーリスト内にある ヘッダーのうち、 その nameが、 内部 レスポンスCORS公開ヘッダー名リストが与えられたときに、 CORSセーフリスト済みレスポンスヘッダー名では ないものを除外するものをいう。

opaque filtered responseとは、 フィルター済み レスポンスであって、その typeが "opaque"、 URL リストが « »、 statusが 0、 status messageが空のバイト列、 ヘッダーリストが « »、 bodyがnull、 かつ body infoが新しいresponse body infoであるものをいう。

opaque-redirect filtered response とは、フィルター済みレスポンスであって、その typeが "opaqueredirect"、 statusが 0、 status messageが空のバイト列、 ヘッダーリストが « »、 bodyがnull、 かつ body infoが新しいresponse body infoであるものをいう。

opaque-redirect filtered responsesについて URLリストを公開することは無害である。 リダイレクトが追従されないためである。

言い換えると、opaque filtered responseopaque-redirect filtered responseは、 ネットワークエラーとほとんど区別できない。 新しいAPIを導入する際には、内部仕様アルゴリズムのために 内部レスポンスを使用してはならない。 そうすると情報が漏えいするためである。

これはまた、 response.okのようなJavaScript APIが、 かなり役に立たない結果を返すことも意味する。

typeレスポンスの スクリプトに対して、 type ゲッターを通じて公開される:

console.log(new Response().type); // "default"

console.log((await fetch("/")).type); // "basic"

console.log((await fetch("https://api.example/status")).type); // "cors"

console.log((await fetch("https://crossorigin.example/image", { mode: "no-cors" })).type); // "opaque"

console.log((await fetch("/surprise-me", { redirect: "manual" })).type); // "opaqueredirect"

(これは、各種リソースが存在し、https://api.example/statusが 適切なCORSヘッダーを持ち、/surprise-meリダイレクトステータスを用いることを前提とする。)


レスポンス response複製するには、次の手順を実行する:

  1. responseフィルター済みレスポンスである場合、 その内部 レスポンスresponse内部レスポンス複製である、新しい同一の フィルター済みレスポンスを返す。

  2. newResponseを、responseのコピーとする。ただし、その bodyを除く。

  3. responsebodyが非nullなら、 newResponsebodyを、 responsebody複製する結果に設定する。

  4. newResponseを返す。


新鮮なレスポンス とは、レスポンスであって、 その 現在の齢がその鮮度寿命の範囲内にあるものをいう。

stale-while-revalidate responseとは、 レスポンスであって、 新鮮な レスポンスではなく、かつその現在の 齢stale-while-revalidate寿命の範囲内にあるものをいう。 [HTTP-CACHING] [STALE-WHILE-REVALIDATE]

陳腐なレスポンス とは、レスポンスであって、 新鮮な レスポンスでも、stale-while-revalidate responseでもないものをいう。


レスポンス responselocation URLは、nullまたは ASCII文字列 requestFragmentが与えられたとき、次の手順によって返される値である。それらはnull、failure、 またはURLを返す。

  1. responsestatusリダイレクトステータスでないなら、 nullを返す。

  2. locationを、 `Location` とresponseヘッダー リストが与えられたときに、ヘッダーリスト値を抽出する結果とする。

  3. locationヘッダー値であるなら、 responseURLを用いて locationパースする結果にlocationを設定する。

    responseResponse コンストラクターを通じて構築された場合、 responseURLはnullである。これは、locationabsolute-URL-with-fragment stringである場合にのみ、 正常にパースされることを意味する。

  4. locationURLであり、そのfragmentがnullであるなら、 locationfragmentrequestFragmentに設定する。

    これにより、合成レスポンス(実のところすべてのレスポンス)が、 HTTPによって定義される リダイレクトの処理モデルに従うことが保証される。[HTTP]

  5. locationを返す。

location URLアルゴリズムは、この標準および リダイレクトを手動で扱うHTMLのnavigateアルゴリズムにおける リダイレクト処理のためにのみ使用される。[HTML]

2.2.7. その他

潜在的なdestinationは、"fetch"または空文字列でないdestinationです。

潜在的なdestination potentialDestination変換するには、次の手順を実行します:

  1. potentialDestinationが"fetch"なら空文字列を返す。

  2. Assert: potentialDestinationdestinationであること。

  3. potentialDestinationを返す。

2.3. 認証エントリ

認証エントリおよびプロキシ認証エントリは、ユーザー名・パスワード・レルムからなるタプルであり、HTTP認証およびHTTPプロキシ認証に使われ、1つ以上のリクエストに関連付けられます。

ユーザーエージェントは、認証エントリとHTTPクッキーや同様のトラッキング機能を一括してクリアできるようにすべきです。

詳細はHTTPで定義されています。[HTTP] [HTTP-CACHING]

2.4. Fetchグループ

環境設定オブジェクト には fetch グループ が関連付けられており、これが fetch グループ を保持する。

fetch グループ は フェッチに関する情報を保持する。

fetch グループ には 次のものが関連付けられている:

fetchレコード
リストであり、fetchレコードからなる。
遅延fetchレコード
リストであり、遅延fetch レコードからなる。

fetchレコードは、次の 項目を持つ 構造体である:

request
リクエスト
controller
fetchコントローラー またはnull。

遅延fetch レコードは、後の時点でfetchを呼び出すために必要な状態を維持するために用いられる 構造体である。たとえば、文書がアンロードされるとき、または 完全にアクティブでなくなるときである。これは次の項目を持つ:

request
リクエスト
notify invoked
引数を受け取らないアルゴリズム。
invoke state(既定値 "pending")
"pending"、"sent"、または "aborted"。

fetch グループ fetchGroup終了されるとき:

  1. fetch レコード record について、 fetchGroupfetch レコード を走査し、 もし recordコントローラー が null でなく、 かつ recordリクエスト完了フラグ が未設定 かつ keepalive が false であれば、 終了 recordコントローラー を行う。

  2. deferred fetch を処理 する fetchGroup に対して。

2.5. ドメインの解決

(This is a tracking vector.) ネットワークパーティションキー keyオリジン originを与えて オリジンを解決するには、次の手順を実行します:

  1. originhostIPアドレスであれば、 « originhost » を返す。

  2. originhostパブリックスフィックスが"localhost"または"localhost."であれば、 « ::1, 127.0.0.1 » を返す。

  3. originを1つ以上のIPアドレス集合に変換する 実装依存の操作を行う。

    他にも、IPアドレス以外の 接続情報を取得するために他の操作を行うかどうかも 実装依存です。例えば、 originスキームHTTP(S)スキームの場合、実装はHTTPS RRのためのDNSクエリを行うかもしれません。[SVCB]

    この操作が成功した場合、IPアドレスの集合および 追加の実装依存情報を返す。

  4. failureを返す。

オリジンを解決するの結果はキャッシュしてもよい。キャッシュする場合はkeyをキャッシュキーの一部として用いるべきである。

通常この操作はDNSを伴い、DNSサーバー側でkeyを考慮せずキャッシュされる場合があります。実装によってはローカルでkeyを考慮することもできない場合があります。[RFC1035]

IPアドレスの順序は、 オリジンを解決するアルゴリズムの呼び出しごとに異なる場合があります。

(キャッシュキー以外の)詳細は、Fetch標準が定めるシステムに直接関係しないため拘束されません。他の文書がこのプリミティブに依存して拡張する場合は、まずFetch標準コミュニティと十分に議論するべきです。

2.6. コネクション

ユーザーエージェントは、関連付けられたコネクションプールを持ちます。 コネクションプールは、 0個以上の順序付き集合としてのコネクションです。各コネクションは、関連付けられたキーネットワークパーティションキー)、 オリジンオリジン)、および認証情報 (boolean)で識別されます。

コネクションは、関連付けられた タイミング情報コネクションタイミング情報)を持ちます。

コネクションタイミング情報は、 コネクション取得処理に関するタイミング情報を保持するための 構造体です。以下の項目があります:

ドメインルックアップ開始時刻(初期値0)
ドメインルックアップ終了時刻(初期値0)
コネクション開始時刻(初期値0)
コネクション終了時刻(初期値0)
セキュアコネクション開始時刻(初期値0)
DOMHighResTimeStamp
ALPNネゴシエートプロトコル(初期値:空のバイト列
バイト列

コネクションタイミング情報のclampおよびcoarsenを行うには、 コネクションタイミング情報 timingInfoDOMHighResTimeStamp defaultStartTime、boolean crossOriginIsolatedCapabilityを与えて次の手順を実行する:

  1. timingInfoコネクション開始時刻defaultStartTimeより小さければ、新しいコネクションタイミング情報を返す(全ての時刻がdefaultStartTime、ALPNネゴシエートプロトコルはtimingInfoの値)。

  2. 新しいコネクションタイミング情報を返す(各時刻はcoarsen timeの結果、ALPNネゴシエートプロトコルはtimingInfoの値)。


新規コネクション設定は、"no"、"yes"、"yes-and-dedicated"のいずれかです。

コネクションを取得するには、 ネットワークパーティションキー keyURL url、 真偽値 credentials、オプションの 新規コネクション設定 new(デフォルトは"no")、 オプションの真偽値 requireUnreliable(デフォルトはfalse)、 そしてオプションの WebTransport-ハッシュリスト webTransportHashes(デフォルトは « »)を与え、次の手順を行う:

  1. もし new が"no"ならば:

    1. 確認: webTransportHashes空であること。

    2. connections を、ユーザーエージェントの コネクションプール内の、 keykeyoriginurloriginであり、 credentialscredentials である コネクション の集合とする。

    3. もし connections が空でなく、かつ requireUnreliable がfalseならば、 connections のいずれか1つを返す。

    4. もし connections 内に非信頼性トランスポートを サポートできるコネクション(例:HTTP/3)があるなら そのコネクションを返す。

  2. proxies を、urlに対し実装依存の方法でプロキシを探索した結果とする。プロキシがない場合、proxies は « "DIRECT" » とする。

    ここで非標準技術( WPADPAC)が活用されることがある。 "DIRECT" はこの url へプロキシを使用しないことを意味する。

  3. timingInfo を新しい コネクションタイミング情報にする。

  4. proxiesproxy について:

    1. timingInfoドメインルックアップ開始時刻非安全な共有現在時刻で設定。

    2. hosts を « urloriginhost » とする。

    3. もし proxy が "DIRECT" ならば オリジンの解決key, urlorigin で実行した結果を hosts に設定する。

    4. もし hosts が失敗ならば 次へ

    5. timingInfoドメインルックアップ終了時刻非安全な共有現在時刻 で設定。

    6. connection を、次を実行した結果とする:コネクション作成key, urlorigin, credentials, proxy実装依存hosthostsより)、 timingInforequireUnreliablewebTransportHashes を用い、実装依存の回数だけ並列で実行し、1つ以上値が返るまで待ち、実装依存な方法で返ってきた値から1つを選んで返す。他の返り値がコネクションだった場合は閉じてもよい。

      本質的にこれは、実装がproxy が "DIRECT" の場合には オリジン解決の戻り値から IPアドレス を選択し、それらでレースしたり、IPv6優先、タイムアウト時再試行等も許容することを意味する。

    7. もし connection が失敗ならば 次へ

    8. もし new が"yes-and-dedicated"でなければ 追加connection をユーザーエージェントのコネクションプールに追加する。

    9. connection を返す。

  5. 失敗を返す。

意図的に曖昧にしてある。なぜならコネクション管理には実装依存の微妙な違いが多数あるためだ。記述があることで <link rel=preconnect> の特徴や、 コネクションが credentials をキーにすることが明確になり、 たとえば TLS セッション識別子が credentials false の コネクションと、 true のコネクションで使い回されないことが明確になる。


コネクションを作成するには、 ネットワークパーティションキー keyオリジン origin、 真偽値 credentials、文字列 proxyホスト hostコネクションタイミング情報 timingInfo、 真偽値 requireUnreliable、および WebTransport-ハッシュリスト webTransportHashes を与え、次の手順を行う:

  1. timingInfoコネクション開始時刻非安全な共有現在時刻 で設定する。

  2. connection を新しい コネクション とし、 keykeyoriginorigincredentialscredentialsタイミング情報timingInfoとする。 コネクションタイミング情報記録connection に用い、 connection でHTTPコネクションをhostに確立する。proxyoriginを考慮しつつ、以下の注意点を踏まえる: [HTTP] [HTTP1] [TLS]

    • もし requireUnreliable が true ならば、非信頼性トランスポート(例えばHTTP/3)が可能なコネクションを確立すること。[HTTP3]

    • 非信頼性トランスポートが可能なコネクションを確立する際は、WebTransport用に必要なオプションを有効化する。 HTTP/3の場合、初期のSETTINGSフレームで SETTINGS_ENABLE_WEBTRANSPORT=1H3_DATAGRAM=1 を含めること。 [WEBTRANSPORT-HTTP3] [HTTP3-DATAGRAM]

    • もし credentials が false なら、TLSクライアント証明書を送信しない。

    • もし webTransportHashes空でない場合は、デフォルトの証明書検証アルゴリズムの代わりに サーバ証明書が 独自証明書要件を満たし、 かつ 証明書ハッシュの検証webTransportHashesが真であるときのみサーバ証明書を有効とみなす。 いずれかの条件を満たさなければ失敗を返す。

    • 接続確立が成功しなかった場合(UDP/TCP/TLSエラー等)は、失敗を返す。

  3. timingInfoALPN交渉済みプロトコルconnection の ALPN Protocol ID で設定。ただし以下の注意点がある: [RFC7301]

    • プロキシ経由時にトンネル接続が成立した場合はトンネル先のプロトコルのALPN Protocol ID、 それ以外は最初のプロキシへのALPN Protocol ID を使うこと。

    • ユーザーエージェントが実験的または未登録プロトコルを使う場合は、使用したALPN Protocol IDがあればそれを使う。 ALPN を使わなかった場合は実装で説明的な文字列を使ってもよい。

      timingInfoALPN交渉済みプロトコル は 実際の交渉方法に関わらず実際に使用するネットワークプロトコルを識別するためのものであり、 ALPNによるネゴシエーションがなくても利用中のプロトコルを示すALPN Protocol IDである。

    IANAは ALPN Protocol IDのリストを管理している。

  4. connection を返す。


コネクションタイミング情報記録は、 コネクション connectionを受け取り、 timingInfoconnectionタイミング情報として次を満たすこと:

コネクションタイミング情報のclampおよびcoarsenアルゴリズムは、再利用コネクションの詳細やタイム値の丸めを保証します。

2.7. ネットワークパーティションキー

ネットワークパーティションキーは、サイトと、nullまたは実装依存の値からなるタプルです。

environment environmentを与え、ネットワークパーティションキーを決定するには、次の手順を実行します:

  1. topLevelOriginenvironmentトップレベルオリジンとする。

  2. topLevelOriginがnullなら、topLevelOriginenvironmentトップレベル生成URLオリジンとする。

  3. Assert: topLevelOriginオリジンである。

  4. topLevelSitetopLevelOriginを与えてサイト取得の結果とする。

  5. secondKeyをnullまたは実装依存の値とする。

    second keyは意図的に曖昧にされています。詳細は今後詰められます。issue #1035参照。

  6. (topLevelSite, secondKey)を返す。

ネットワークパーティションキーを決定するには、 リクエスト request を与え:

  1. もし request予約クライアント が null でなければ、 request予約クライアント を与えて ネットワークパーティションキーを決定する の結果を返す。

  2. もし requestクライアント が null でなければ、 requestクライアント を与えて ネットワークパーティションキーを決定する の結果を返す。

  3. null を返す。

2.8. HTTPキャッシュパーティション

HTTPキャッシュパーティションを決定するには、リクエスト request を与え:

  1. keyネットワークパーティションキーを決定する (request を与える) の結果とする。

  2. もし key が null ならば null を返す。

  3. key に関連付けられたユニークなHTTPキャッシュを返す。[HTTP-CACHING]

2.9. ポートブロッキング

新しいプロトコルはALPNを使い、 TLSハンドシェイク中にプロトコルをネゴシエートすることで ポート遮断の必要性を回避できる。この場合、プロトコルは HTTPリクエストを通じて偽装することができない。 [RFC7301]

あるリクエスト request について 悪いポートのためブロックされるべきかどうか判定するには:

  1. urlrequest現在のURL とする。

  2. もし urlスキームHTTP(S)スキーム であり、 urlポート悪いポート であれば、blocked を返す。

  3. allowed を返す。

ポートが 次の表の最初の列に記載されている場合、悪いポートです。

ポート 主なサービス
0 —​
1 tcpmux
7 echo
9 discard
11 systat
13 daytime
15 netstat
17 qotd
19 chargen
20 ftp-data
21 ftp
22 ssh
23 telnet
25 smtp
37 time
42 name
43 nicname
53 domain
69 tftp
77 —​
79 finger
87 —​
95 supdup
101 hostname
102 iso-tsap
103 gppitnp
104 acr-nema
109 pop2
110 pop3
111 sunrpc
113 auth
115 sftp
117 uucp-path
119 nntp
123 ntp
135 epmap
137 netbios-ns
139 netbios-ssn
143 imap
161 snmp
179 bgp
389 ldap
427 svrloc
465 submissions
512 exec
513 login
514 shell
515 printer
526 tempo
530 courier
531 chat
532 netnews
540 uucp
548 afp
554 rtsp
556 remotefs
563 nntps
587 submission
601 syslog-conn
636 ldaps
989 ftps-data
990 ftps
993 imaps
995 pop3s
1719 h323gatestat
1720 h323hostcall
1723 pptp
2049 nfs
3659 apple-sasl
4045 npp
4190 sieve
5060 sip
5061 sips
6000 x11
6566 sane-port
6665 ircu
6666 ircu
6667 ircu
6668 ircu
6669 ircu
6679 osaut
6697 ircs-u
10080 amanda

2.10. responserequestへのレスポンスとしてMIMEタイプのためにブロックすべきか?

次の手順を実行する:

  1. mimeTypeを、responseヘッダーリストからMIMEタイプ抽出した結果とする。

  2. mimeTypeがfailureなら、allowedを返す。

  3. destinationrequestdestinationとする。

  4. destinationスクリプト系で、以下のいずれかが真ならblockedを返す:

  5. allowedを返す。

3. HTTP拡張

3.1. Cookie

`Cookie`リクエストヘッダーおよび`Set-Cookie`レスポンスヘッダーは主にそれぞれの仕様で定義されています。ここでは、それらを便利に利用できるよう補助的なインフラを定義します。[COOKIES]

リクエストの `Cookie` ヘッダーを付加する には、 リクエスト request を与え:

  1. ユーザーエージェントが request に対して Cookie を無効化している場合、何もせず戻る。

  2. sameSite same-site モード判定 request を与える)の結果とする。

  3. isSecure を、 request現在のURLスキーム が "https" なら true、 そうでなければ false とする。

  4. httpOnlyAllowed を true とする。

    これは fetch から呼ばれるため true である。 例として document.cookie の getter から呼ぶ場合などとは対照的である。

  5. cookiescookie取得isSecure, request現在のURLホスト, request現在のURLパス, httpOnlyAllowed, sameSite を与えて実行した結果とする。

    クッキーストアはソート済みのクッキーリストを返す

  6. もし cookies なら、何もせず戻る。

  7. valueクッキー直列化cookies を与えて実行した結果とする。

  8. 追加 (`Cookie`, value) を requestヘッダーリスト に追加。

レスポンスの `Set-Cookie` ヘッダーを解析して保存する には、 リクエスト request および レスポンス response を与え:

  1. ユーザーエージェントが request に対して Cookie を無効化している場合、何もせず戻る。

  2. allowNonHostOnlyCookieForPublicSuffix を false とする。

  3. isSecure を、 request現在のURLスキーム が "https" なら true、 そうでなければ false とする。

  4. httpOnlyAllowed を true とする。

    これは fetch から呼ばれているため true となる。 例えば document.cookie の getter とは異なる。

  5. sameSiteStrictOrLaxAllowed を、 same-site モード判定 request を与える)の結果が "strict-or-less" なら true、 そうでなければ false とする。

  6. responseヘッダーリストheader について:

    1. もし header名前バイト大小無視 で `Set-Cookie` に一致しなければ、 次へ

    2. クッキーの解析と保存headerisSecurerequest現在のURLホストrequest現在のURLパスhttpOnlyAllowedallowNonHostOnlyCookieForPublicSuffixsameSiteStrictOrLaxAllowed を渡して実行する。

    3. クッキーのガベージコレクトrequest現在のURLホスト で実行する。

    他の場所でも言及されている通り、`Set-Cookie` ヘッダーはまとめて扱えず、 それぞれ個別に処理される。他のどのヘッダーでもこれは許されない。

same-site モードを判定する には、リクエスト request を与え:

  1. 確認: requestメソッド が "GET" または "POST" であること。

  2. もし request トップレベルナビゲーションのイニシエータorigin が null ではなく、かつ requestURLorigin同一サイトでなければ "unset-or-less" を返す。

  3. もし requestメソッド が "GET" で、かつ request送信先 が "document" であれば "lax-or-less" を返す。

  4. もし requestクライアントcross-site な祖先を持つかどうか が true ならば、"unset-or-less" を返す。

  5. もし requestリダイレクト汚染度 が "cross-site" なら、"unset-or-less" を返す。

  6. "strict-or-less" を返す。

「直列化されたCookie既定パス」を得る には、URL url を与え:

  1. cloneURLurl のクローンとする。

  2. cloneURLパス を、 Cookie既定パスcloneURLパスを用いて) に設定する。

  3. cloneURLURLパス直列化 を返す。

3.2. `Origin` ヘッダー

`Origin` リクエストヘッダーfetchがどこから発生したかを示す。

`Origin` ヘッダーは、 パスを明らかにしない `Referer` [sic] ヘッダーの一種である。これは、 HTTP fetchのうち、 その リクエストレスポンス汚染が "cors" であるものすべて、および リクエストmethodが `GET` でも `HEAD` でもないものに用いられる。互換性上の制約により、すべての fetchに含まれるわけではない。

その可能なは、リクエストが与えられたときの、 リクエストオリジンをバイト直列化するすべての戻り値である。これらは、 次のABNFで表される:

serialized-ipv4   = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet         = DIGIT                 ; 0-9
                  / %x31-39 DIGIT         ; 10-99
                  / "1" 2DIGIT            ; 100-199
                  / "2" %x30-34 DIGIT     ; 200-249
                  / "25" %x30-35          ; 250-255

serialized-ipv6   =                            7( h16 ":" ) h16
                  /                       "::" 5( h16 ":" ) h16
                  / [               h16 ] "::" 4( h16 ":" ) h16
                  / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) h16
                  / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) h16
                  / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   h16
                  / [ *4( h16 ":" ) h16 ] "::"              h16
                  / [ *5( h16 ":" ) h16 ] "::"
h16               = "0" / ( non-zero-hex 0*3hex )
non-zero-hex      = %x31-39 / %x61-66 ; '1'-'9' or lowercase 'a'-'f'
hex               = %x30-39 / %x61-66 ; '0'-'9' or lowercase 'a'-'f

lower-alpha       = %x61-7A
lower-alphanum    = lower-alpha / DIGIT
domain-label      = lower-alphanum / ( lower-alphanum *( lower-alphanum / "-" ) lower-alphanum )
serialized-domain = *( domain-label "." ) domain-label

serialized-scheme = lower-alpha *( lower-alphanum / "+" / "-" / "." )
serialized-host   = serialized-ipv4 / "[" serialized-ipv6 "]" / serialized-domain
serialized-port   = 1*5DIGIT

serialized-origin = serialized-scheme "://" serialized-host [ ":" serialized-port ]
origin-or-null    = serialized-origin / %s"null" ; case-sensitive

Origin = origin-or-null

これは The Web Origin Concept における定義に取って代わる。[ORIGIN]

ここで定義されるオリジン直列化は、[RFC3986] の 文法よりも、2つの重要な点でより制約されている。第一に、スキームおよびドメインの直列化はすべて小文字 ASCII であり、 パーセントエンコーディングを含まない。第二に、URL § 3.6 Host serializing および [RFC5952] の推奨に従い、 IPv6 アドレスは次のように制限される:


リクエスト `Origin` ヘッダーを追加するには、 リクエスト request を与え、次の手順を実行する:

  1. 確認: requestoriginが "client" でないこと。

  2. serializedOrigin を、 request originのバイト直列化requestを用いる)の結果とする。

  3. requestresponse tainting が "cors" であるか、 mode が "websocket" または "webtransport" の場合は、 `Origin`, serializedOriginrequestheader list追加する。

  4. それ以外で requestmethod が `GET` でも `HEAD` でもない場合は:

    1. requestmode が "cors" でないなら、 requestreferrer policy で分岐する:

      "no-referrer"

      serializedOrigin を `null` にする。

      "no-referrer-when-downgrade"
      "strict-origin"
      "strict-origin-when-cross-origin"

      requestorigintuple origin であり、 そのschemeが"https"、かつ requestcurrent URLschemeが "https" でない場合、 serializedOrigin を `null` にする。

      "same-origin"

      requestoriginrequestcurrent URLorigin同一生成元でなければ serializedOriginを`null`にする。

      その他
      何もしない
    2. 追加 (`Origin`, serializedOrigin) を requestheader list に追加する。

リクエストreferrer policyは、fetcherが自らのオリジンをサーバーと共有することを明示的に選択していない すべてのfetchで考慮される。たとえば、CORSプロトコルを用いる場合などである。

3.3. CORSプロトコル

レスポンスをオリジン間で共有可能とし、 HTML の form 要素で可能なものよりも柔軟な fetch を許可するために、CORSプロトコル が存在する。 これはHTTP上にレイヤー化されたものであり、レスポンスが他の オリジン と共有できることを宣言できるようにする。

これはファイアウォール(イントラネット)越しにレスポンスのデータ漏洩を防ぐため、 オプトイン機構である必要がある。 また、リクエスト認証情報 を含む場合、機微なデータ漏洩を防ぐためにも オプトインが必要となる。

この節ではサーバ開発者向けに CORSプロトコル を解説する。 ユーザーエージェント向けの要件は fetch アルゴリズムの一部だが 新しいHTTPヘッダー構文を除く。

3.3.1. 一般

CORSプロトコルは、 レスポンスがオリジン間で共有可能かどうかを示す ヘッダー群から成る。

リクエストのうち、HTMLの form 要素で可能なものよりも複雑なものについては、CORS-preflightリクエストが実行され、リクエスト現在のURLCORSプロトコルをサポートしていることを確認する。

3.3.2. HTTPリクエスト

CORSリクエストとは、`Origin`ヘッダーを含むHTTPリクエストです。 ただし、CORSプロトコルに参加しているかどうかは確実には判別できません。 なぜなら、`Origin`ヘッダーは リクエストメソッドが`GET`または`HEAD`以外の時も常に含まれるためです。

CORSプリフライトリクエストは、CORSリクエストのうち、 CORSプロトコルが理解されているか確認するためのものです。 これはOPTIONSメソッドとして使い、次のヘッダーを含みます:

`Access-Control-Request-Method`

将来のCORSリクエストがそのリソースに対して使用するであろうメソッドを示す。

CORSプリフライトリクエストは、次のヘッダーも含むことがあります:

`Access-Control-Request-Headers`

将来のCORSリクエストがそのリソースに対して使用するであろうヘッダーを示す。

3.3.3. HTTPレスポンス

CORSリクエストへのHTTPレスポンスには、以下のヘッダーを含めることができます:

`Access-Control-Allow-Origin`

レスポンスを共有できるかどうかを示す。これは、レスポンス内で `Origin` リクエストヘッダーのリテラルな (これは `null` になり得る)または `*` を返すことによって示される。

`Access-Control-Allow-Credentials`

リクエストcredentials modeが "include" である場合に、レスポンスを共有できるかどうかを示す。

CORS-preflightリクエストでは、リクエストcredentials modeは常に "same-origin" である。すなわち、 資格情報を除外するが、後続の任意のCORSリクエストではそうでない可能性がある。したがって、サポートは CORS-preflightリクエストへのHTTPレスポンスの一部としても 示される必要がある。

CORS-preflightリクエストへのHTTPレスポンスは、次の ヘッダーを含むことができる:

`Access-Control-Allow-Methods`

CORS プロトコルの目的で、どのメソッドレスポンスURLによって サポートされるかを示す。

`Allow` ヘッダーは、 CORSプロトコルの目的には関係しない。

`Access-Control-Allow-Headers`

CORS プロトコルの目的で、どのヘッダーレスポンスURLによって サポートされるかを示す。

`Access-Control-Max-Age`

`Access-Control-Allow-Methods` および `Access-Control-Allow-Headers` ヘッダーによって提供される情報を キャッシュできる秒数(既定では5)を示す。

CORSプリフライトリクエストでない CORSリクエストへのHTTPレスポンスは、次のヘッダーも含めることができます:

`Access-Control-Expose-Headers`

レスポンスの一部として公開できるヘッダーを、その名前で列挙して示します。


サーバー開発者が共有の意図を持つCORSリクエストへの成功したHTTPレスポンスは、 上記のヘッダーとリクエストと一致したを含める限り、任意のステータスを利用できます。

CORSプリフライトリクエストへの成功したHTTPレスポンスも同様ですが、okステータス(例: 200や204)に制限されます。

他の種類のHTTPレスポンスは成功とは見なされず、共有されないかCORSプリフライトリクエストが失敗します。サーバーが明示的に示したい場合は、403ステータスと該当するヘッダーの省略を組み合わせて使うこともできます。

必要に応じて「failure」も共有可能ですが、それを行うと HTTP レスポンスは成功扱いになります。 そのため、CORS リクエストCORS プリフライトリクエスト でない場合の ステータス は、 403 を含めて任意の値にすることができます。

最終的に、サーバー開発者はHTTPレスポンスの扱いにおいて多くの自由があります。これらの戦略はCORSプリフライトリクエストと、その後のCORSリクエストで異なる場合があります:

3.3.4. HTTP新ヘッダー構文

CORS プロトコルで使用されるヘッダーABNF

Access-Control-Request-Method    = method
Access-Control-Request-Headers   = 1#field-name

wildcard                         = "*"
Access-Control-Allow-Origin      = origin-or-null / wildcard

Access-Control-Allow-Credentials = %s"true" ; case-sensitive
Access-Control-Expose-Headers    = #field-name
Access-Control-Max-Age           = delta-seconds
Access-Control-Allow-Methods     = #method
Access-Control-Allow-Headers     = #field-name

`Access-Control-Expose-Headers`、 `Access-Control-Allow-Methods`、および `Access-Control-Allow-Headers` レスポンスヘッダーについては、 `*` は、資格情報を伴わない リクエストに対して ワイルドカードとして扱われる。そのようなリクエストでは、 `*` であるヘッダー名 またはメソッドのみを 照合する方法はない。

3.3.5. CORSプロトコルと認証情報

リクエスト資格情報モードが "include" である場合、 それはfetch資格情報を含めること以外にも、 CORSプロトコルの動作に影響を及ぼす。

以前は、XMLHttpRequest を用いて、リクエスト資格情報モードを "include" に設定できた:

var client = new XMLHttpRequest()
client.open("GET", "./")
client.withCredentials = true
/* … */

現在では、fetch("./", { credentials:"include" }).then(/* … */) で十分である。

リクエスト資格情報モードは、必ずしもサーバーで観測可能とは限らない。 リクエストに対する 資格情報が存在する場合にのみ、 その資格情報が含まれることによって 観測できる。なお、その場合であっても、CORS-preflightリクエスト資格情報を含むことはない。

したがってサーバー開発者は、資格情報で 「汚染された」レスポンスを共有できるかどうかを決定する必要がある。また、 CORS-preflight リクエストを必要とする リクエスト資格情報を含められるかどうかも 決定する必要がある。一般的に言えば、レスポンスを共有することと 資格情報を伴うリクエストを許可することの 両方はかなり安全でなく、 confused deputy問題を避けるために 細心の注意を払わなければならない。

資格情報を伴うレスポンスを共有するには、 `Access-Control-Allow-Origin` および `Access-Control-Allow-Credentials` ヘッダーが 重要である。次の表は、https://rabbit.invalid/ へのリクエストについて、さまざまな有効および無効な組み合わせを 説明するためのものである:

リクエストの資格情報モード `Access-Control-Allow-Origin` `Access-Control-Allow-Credentials` 共有されるか? 注記
"omit" `*` 省略 —​
"omit" `*` `true` 資格情報モードが "include" でない場合、 `Access-Control-Allow-Credentials` は無視される。
"omit" `https://rabbit.invalid/` 省略 直列化されたオリジンには末尾のスラッシュがない。
"omit" `https://rabbit.invalid` 省略 —​
"include" `*` `true` 資格情報モードが "include" である場合、 `Access-Control-Allow-Origin` は `*` にできない。
"include" `https://rabbit.invalid` `true` —​
"include" `https://rabbit.invalid` `True` `true` は(バイト単位で)大文字小文字を区別する。

同様に、`Access-Control-Expose-Headers`、 `Access-Control-Allow-Methods`、および `Access-Control-Allow-Headers` レスポンス ヘッダーは、リクエスト資格情報 モードが "include" でない場合にのみ、 `*` を値として使用できる。

3.3.6.

https://foo.invalid/のスクリプトが、https://bar.invalid/からデータを取得したいとします。(認証情報やレスポンスヘッダーアクセスは重要ではありません。)

var url = "https://bar.invalid/api?key=730d67a37d7f3d802e96396d00280768773813fbe726d116944d814422fc1a45&data=about:unicorn";
fetch(url).then(success, failure)

これはCORSプロトコルが使われますが、foo.invalid側の開発者からは完全に透過的です。CORSプロトコルの一部として、ユーザーエージェントはリクエストに`Origin`ヘッダーを含めます:

Origin: https://foo.invalid

bar.invalidからレスポンスを受信した際、ユーザーエージェントは`Access-Control-Allow-Origin`レスポンスヘッダーを検証します。その値が `https://foo.invalid` または `*` であれば、ユーザーエージェントはsuccessコールバックを呼びます。それ以外の値、または省略されている場合は、failureコールバックが呼ばれます。

foo.invalidの開発者が再び登場し、今度はbar.invalidからデータ取得時にレスポンスヘッダーも参照したいと考えています。

fetch(url).then(response => {
  var hsts = response.headers.get("strict-transport-security"),
      csp = response.headers.get("content-security-policy")
  log(hsts, csp)
})

bar.invalidは前述の例の通り、正しい`Access-Control-Allow-Origin`レスポンスヘッダーを返しています。 hstscspの値は、`Access-Control-Expose-Headers`レスポンスヘッダーに依存します。たとえば、レスポンスが次のヘッダーを含んでいた場合

Content-Security-Policy: default-src 'self'
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
Access-Control-Expose-Headers: Content-Security-Policy

このとき、hstsはnull、cspは"default-src 'self'"となります(両方のヘッダーが含まれていても)。これは、bar.invalidが各ヘッダー名を`Access-Control-Expose-Headers`レスポンスヘッダーで明示的に共有する必要があるためです。

別の方法として、bar.invalidが全てのレスポンスヘッダーを共有したい場合(認証情報を含まないリクエストに対して)、`*`を`Access-Control-Expose-Headers`レスポンスヘッダーの値として使うことができます。リクエストに認証情報が含まれる場合は、ヘッダー名を明示的に列挙する必要があり、`*`は使えません。

foo.invalidの開発者が再び登場し、今度は認証情報を含めてbar.invalidからデータを取得します。今回はCORSプロトコルが開発者から見て透過的ではありません。なぜなら、認証情報には明示的なオプトインが必要だからです:

fetch(url, { credentials:"include" }).then(success, failure)

このときbar.invalidが返す`Set-Cookie`レスポンスヘッダーも完全に機能します(そうでなければ無視されます)。

ユーザーエージェントは、リクエストに該当する認証情報を必ず含めます。またレスポンスにはより厳しい要件が課されます。bar.invalidは`Access-Control-Allow-Origin`ヘッダーの値として`https://foo.invalid`を明示する必要があり(認証情報が関与する場合`*`は不可)、`Access-Control-Allow-Credentials`ヘッダーも必要です:

Access-Control-Allow-Origin: https://foo.invalid
Access-Control-Allow-Credentials: true

これら2つのヘッダーがこの値で含まれていなければ、failureコールバックが呼ばれます。ただし、`Set-Cookie`レスポンスヘッダーは尊重されます。

3.3.7. CORSプロトコルの例外

仕様では、CORS safelist 以外の`Content-Type`ヘッダー値に対して限定的な例外が認められています。これらの例外は、ウェブコンテンツによって発生可能だが、ヘッダーやボディをウェブコンテンツからは最小限しか制御できないリクエストに対して設けられています。そのため、サーバー側は、クロスオリジンのウェブコンテンツによって以下の非プリフライトな非safelistな`Content-Type`ヘッダー値でリクエストされうることを想定する必要があります:

仕様は新たな例外の導入を避けるべきであり、慎重なセキュリティ検討の上でのみ追加するべきです。新しい例外の提案は issueの提出で行えます。

3.4. `Content-Length` ヘッダー

`Content-Length`ヘッダーは主にHTTPで定義されています。その処理モデルはHTTPで定義されたものがウェブコンテンツと互換性がないため、ここで定義されています。[HTTP]

長さを抽出するには、 ヘッダーリスト headersを与えて次の手順を実行する:

  1. valuesを、headersから`Content-Length`を取得・デコード・分割した結果とする。

  2. valuesがnullならnullを返す。

  3. candidateValueをnullとする。

  4. valuesvalue について:

    1. candidateValueがnullなら、candidateValuevalueを設定する。

    2. そうでなければ、valuecandidateValueと異なれば、failureを返す。

  5. candidateValueが空文字列か、コードポイントASCII数字でないものが含まれていれば、nullを返す。

  6. candidateValueを10進数として解釈して返す。

3.5. `Content-Type` ヘッダー

`Content-Type`ヘッダーは主にHTTPで定義されています。その処理モデルはHTTPで定義されたものがウェブコンテンツと互換性がないため、ここで定義されています。[HTTP]

MIMEタイプを抽出するには、 ヘッダーリスト headersを与えて次の手順を実行する。これらはfailureまたはMIMEタイプを返す。

  1. charsetをnullとする。

  2. essenceをnullとする。

  3. mimeTypeをnullとする。

  4. valuesを、headersから`Content-Type`を取得・デコード・分割した結果とする。

  5. valuesがnullならfailureを返す。

  6. valuesvalue について:

    1. temporaryMimeTypevalueMIMEタイプとして構文解析した結果とする。

    2. temporaryMimeTypeがfailure、またはそのエッセンスが"*/*"なら、continue

    3. mimeTypetemporaryMimeTypeを設定する。

    4. mimeTypeエッセンスessenceと異なる場合:

      1. charsetをnullに設定する。

      2. mimeTypeparameters["charset"]が存在すれば、charsetにその値を設定する。

      3. essencemimeTypeエッセンスを設定する。

    5. そうでなければ、mimeTypeparameters["charset"]が存在せず、かつcharsetがnullでなければ、mimeTypeparameters["charset"]にcharsetを設定する。

  7. mimeTypeがnullならfailureを返す。

  8. mimeTypeを返す。

MIMEタイプを抽出するがfailureを返した場合や、MIMEタイプエッセンスが与えられたフォーマットに不適切な場合は、致命的エラーとして扱うこと。既存のウェブプラットフォーム機能はこのパターンに従っていないことが多く、長年にわたりセキュリティ脆弱性の主な原因となっています。一方で、MIMEタイプパラメータは通常無視しても安全です。

MIMEタイプを抽出するの実際の動作例:

Headers(ネットワーク上の値) 出力(直列化
Content-Type: text/plain;charset=gbk, text/html
text/html
Content-Type: text/html;charset=gbk;a=b, text/html;x=y
text/html;x=y;charset=gbk
Content-Type: text/html;charset=gbk;a=b
Content-Type: text/html;x=y
Content-Type: text/html;charset=gbk
Content-Type: x/x
Content-Type: text/html;x=y
text/html;x=y
Content-Type: text/html
Content-Type: cannot-parse
text/html
Content-Type: text/html
Content-Type: */*
Content-Type: text/html
Content-Type:

レガシーエンコーディング抽出は、failureまたはMIMEタイプ mimeTypeエンコーディング fallbackEncodingを与えて次の手順を実行する:

  1. mimeTypeがfailureならfallbackEncodingを返す。

  2. mimeType["charset"]が存在しなければ、fallbackEncodingを返す。

  3. tentativeEncodingmimeType["charset"]からエンコーディング取得した結果とする。

  4. tentativeEncodingがfailureならfallbackEncodingを返す。

  5. tentativeEncodingを返す。

このアルゴリズムはmimeTypeがfailureでも受け付けるため、MIMEタイプを抽出すると容易に組み合わせられます。

これが"legacy"とされるのは、現代のフォーマットはUTF-8のみ使うことが推奨されているためです。

3.6. `X-Content-Type-Options` ヘッダー

The `X-Content-Type-Options` レスポンスヘッダーは、 レスポンスの `Content-Type` ヘッダーを、リクエスト宛先に照らして チェックすることを要求するために使用できる。

ヘッダーリスト list を与え、 nosniffを判定する には次の手順を行う:

  1. values取得・デコード・分割 (`X-Content-Type-Options`, list) の結果とする。

  2. values が null なら false を返す。

  3. values[0] が ASCII大文字小文字無視 で "nosniff" と一致するなら true を返す。

  4. false を返す。

Web 開発者および適合性チェッカーは、`X-Content-Type-Options` について、次の ABNFを使用しなければならない:

X-Content-Type-Options           = "nosniff" ; case-insensitive

3.6.1. responserequest で nosniff のためブロックするべきか?

次の手順を行う:

  1. nosniffを判定する (responseヘッダーリスト) が false なら allowed を返す。

  2. mimeTypeMIME Type抽出 (responseヘッダーリスト) の結果とする。

  3. destinationrequest送信先 とする。

  4. destinationスクリプト系 で、 mimeType が失敗 または JavaScript MIME type でなければ blocked を返す。

  5. destination が "style" で、 mimeType が失敗 または その エッセンス が "text/css" でなければ blocked を返す。

  6. allowed を返す。

リクエスト送信先のうち スクリプト系 または "style" のときのみ考慮される。 悪用問題が想定されるのはこれらのみ。また "image" は実環境の内容と相性が悪かったため対象外。

3.7. `Cross-Origin-Resource-Policy` ヘッダー

`Cross-Origin-Resource-Policy` レスポンスヘッダーは、 リクエスト現在のURLオリジンを、 リクエストオリジンに照らして チェックすることを要求するために使用できる。これは、 リクエストmodeが "no-cors" である場合である。

そのABNF

Cross-Origin-Resource-Policy     = %s"same-origin" / %s"same-site" / %s"cross-origin" ; case-sensitive

オリジン origin環境設定オブジェクト settingsObject、 文字列 destinationレスポンス response、および省略可能な真偽値 forNavigationが与えられたとき、 cross-origin resource policyチェックを実行するには、次の手順を実行する:

  1. forNavigationが与えられていない場合は、falseに設定する。

  2. embedderPolicyを、settingsObjectポリシーコンテナー埋め込みポリシーとする。

  3. origin、 "unsafe-none"、response、および forNavigationを用いたcross-origin resource policy 内部チェックblockedを返すなら、blockedを返す。

    この手順が必要なのは、以下でCross-Origin Embedder Policyに 関係しない違反を報告したくないためである。

  4. originembedderPolicyreport only valueresponse、 およびforNavigationを用いたcross-origin resource policy 内部チェックblockedを返すなら、 responsesettingsObjectdestination、およびtrueを用いて cross-origin embedder policy CORP違反レポートをキューに入れる

  5. originembedderPolicyvalueresponse、および forNavigationを用いたcross-origin resource policy 内部チェックallowedを返すなら、allowedを返す。

  6. responsesettingsObjectdestination、およびfalseを用いて cross-origin embedder policy CORP違反レポートをキューに入れる

  7. blockedを返す。

HTMLのnavigateアルゴリズムだけが、forNavigationを trueに設定してこのチェックを使用し、それは常に入れ子のナビゲーションに対してである。そうでない場合、 responseは、opaque filtered response内部レスポンスであるか、または レスポンスであり、それは opaque filtered response内部レスポンスになる。[HTML]

オリジン originembedder policy value embedderPolicyValueレスポンス response、および真偽値 forNavigationが与えられたとき、 cross-origin resource policy内部チェックを 実行するには、次の手順を実行する:

  1. forNavigationがtrueで、embedderPolicyValueが "unsafe-none" であるなら、allowedを返す。

  2. policyを、responseヘッダーリストから `Cross-Origin-Resource-Policy`を 取得する結果とする。

    これは、 `Cross-Origin-Resource-Policy: same-site, same-origin` が以下で allowedになることを意味する。embedderPolicyValueが "unsafe-none" である限り、それは何にも一致しないためである。 2つ以上の `Cross-Origin-Resource-Policy` ヘッダーも同じ効果を持つ。

  3. policyが `same-origin`、`same-site`、または `cross-origin` のいずれでもないなら、policyをnullに設定する。

  4. policyがnullなら、embedderPolicyValueに応じて分岐する:

    "unsafe-none"

    何もしない。

    "credentialless"

    次の場合は、policyを `same-origin` に設定する:

    "require-corp"

    policyを `same-origin` に設定する。

  5. policyに応じて分岐する:

    null
    `cross-origin`

    allowedを返す。

    `same-origin`

    originが、responseURLオリジンsame originであるなら、allowedを返す。

    そうでなければ、blockedを返す。

    `same-site`

    以下のすべてがtrueである場合:

    その場合はallowedを返す。

    そうでなければ、blockedを返す。

    `Cross-Origin-Resource-Policy: same-site` は、 セキュアな転送経由で配信されたレスポンスが、非セキュアな要求元オリジンに一致するとはみなさない。 それらのホストがそれ以外ではsame siteである場合でも同様である。セキュアに転送されたレスポンスは、 セキュアに転送された開始元にのみ一致する。

レスポンス response環境設定オブジェクト settingsObject、文字列destination、および真偽値reportOnlyが与えられたとき、 cross-origin embedder policy CORP違反レポートをキューに入れるには、次の手順を実行する:

  1. endpointを、reportOnlyがtrueならsettingsObjectポリシーコンテナー埋め込みポリシーreport only reporting endpointとし、そうでなければ settingsObjectポリシーコンテナー埋め込みポリシーreporting endpointとする。

  2. serializedURLを、 responseを用いて 報告用にレスポンスURLを 直列化する結果とする。

  3. dispositionを、reportOnlyがtrueなら "reporting" とし、 そうでなければ "enforce" とする。

  4. bodyを、次のプロパティを含む新しいオブジェクトとする:

    key value
    "type" "corp"
    "blockedURL" serializedURL
    "destination" destination
    "disposition" disposition
  5. settingsObjectグローバルオブジェクトについて、 "coep" レポート種別endpoint、および bodyが与えられたものとして、 レポートを生成してキューに入れる[REPORTING]

3.8. `Sec-Purpose` ヘッダー

`Sec-Purpose` HTTPリクエストヘッダーは、そのリクエストがユーザーによる即時利用以外の目的でリソースを要求していることを示します。

`Sec-Purpose` ヘッダーフィールドはstructured headerであり、その値はトークンでなければなりません。

定義されているトークンprefetchのみです。これはリクエストの目的が、近いうちに必要になると予想されるリソースを取得することであることを示します。

サーバーはこれを利用して、プリフェッチ用のキャッシュ有効期限を調整したり、プリフェッチを拒否したり、ページ訪問回数のカウント時に別扱いすることができます。

4. フェッチング

以下のアルゴリズムはfetchingを定義する。大まかに言うと、これは リクエストと、処理中のさまざまな時点で実行する 1つ以上のアルゴリズムを受け取る。 レスポンスは、 以下に列挙する最後の2つのアルゴリズムに渡される。最初の2つのアルゴリズムは、 アップロードを捕捉するために使用できる。

リクエスト request、省略可能なアルゴリズム processRequestBodyChunkLength、省略可能なアルゴリズム processRequestEndOfBody、 省略可能なアルゴリズム processEarlyHintsResponse、省略可能な アルゴリズム processResponse、省略可能な アルゴリズム processResponseEndOfBody、省略可能なアルゴリズム processResponseConsumeBody、 および省略可能な真偽値 useParallelQueue(既定値 false)が与えられたとき、 以下の手順を実行する。与えられた場合、processRequestBodyChunkLengthは、 送信されたバイト数を表す整数を受け取るアルゴリズムでなければならない。与えられた場合、 processRequestEndOfBodyは引数を受け取らないアルゴリズムでなければならない。与えられた場合、 processEarlyHintsResponseレスポンスを受け取るアルゴリズムでなければならない。与えられた場合、 processResponseレスポンスを受け取るアルゴリズムでなければならない。与えられた場合、 processResponseEndOfBodyレスポンスを受け取るアルゴリズムでなければならない。与えられた場合、 processResponseConsumeBodyレスポンス およびnull、failure、またはバイト列を受け取るアルゴリズムでなければならない。

ユーザーエージェントは、進行中のfetchを 一時停止するよう求められることがある。 ユーザーエージェントは、その一時停止要求を受け入れても無視してもよい。一時停止されたfetchは 再開できる。ユーザーエージェントは、 進行中のfetchがそのリクエストについてHTTPキャッシュ内のレスポンスを更新している場合、 その一時停止要求を無視すべきである。

requestのキャッシュモードが "no-store" である場合、または レスポンスに `Cache-Control: no-store` ヘッダーが現れる場合、ユーザーエージェントは リクエストについて HTTPキャッシュ内のエントリーを更新しない。[HTTP-CACHING]

  1. Assert: requestmodeは "navigate" である、または processEarlyHintsResponseはnullである。

    early hints(レスポンスであって、そのstatus が103であるもの)の処理は、ナビゲーションについてのみ精査されている。

  2. taskDestinationをnullとする。

  3. crossOriginIsolatedCapabilityをfalseとする。

  4. requestが与えられたものとして、クライアントからリクエストを設定する

  5. requestclientが非nullなら、次を実行する:

    1. taskDestinationを、requestclientグローバルオブジェクトに設定する。

    2. crossOriginIsolatedCapabilityを、requestclientcross-origin isolated capabilityに設定する。

  6. useParallelQueueがtrueなら、taskDestination新しい並列キューを開始する結果に設定する。

  7. timingInfoを、新しいfetch timing infoとする。その start timeおよび post-redirect start timeは、 crossOriginIsolatedCapabilityが与えられたときの 粗化された共有現在時刻であり、 render-blockingrequestrender-blockingに設定される。

  8. fetchParamsを、新しいfetch paramsとする。その requestrequesttiming infotimingInfoprocess request body chunk lengthprocessRequestBodyChunkLengthprocess request end-of-bodyprocessRequestEndOfBodyprocess early hints responseprocessEarlyHintsResponseprocess responseprocessResponseprocess response consume bodyprocessResponseConsumeBodyprocess response end-of-bodyprocessResponseEndOfBodytask destinationtaskDestination、かつ cross-origin isolated capabilitycrossOriginIsolatedCapabilityである。

  9. requestbodyバイト 列であるなら、 requestbodyを、requestbody as a bodyに設定する。

  10. requestを用いて、WebDriver BiDi clone network request body手順を実行する。

  11. 次のすべての条件がtrueである場合:

    その場合:

    1. Assert: requestoriginは、 requestclientoriginsame origin である。

    2. onPreloadedResponseAvailableを、レスポンス responseが与えられたときに、 次の手順を実行するアルゴリズムとする: fetchParamspreloaded response candidateresponseに設定する。

    3. foundPreloadedResourceを、 requestclientについて、 requestURLrequestdestinationrequestmoderequestcredentials moderequestintegrity metadata、 およびonPreloadedResponseAvailableが与えられたものとして、 preloaded resourceを消費するを呼び出した結果とする。

    4. foundPreloadedResourceがtrueであり、かつfetchParamspreloaded response candidateがnullであるなら、fetchParamspreloaded response candidateを "pending" に設定する。

  12. requestheader listが `Accept` を含まないなら:

    1. valueを `*/*` とする。

    2. requestinitiatorが "prefetch" なら、 valuedocument `Accept` header valueに設定する。

    3. そうでない場合、ユーザーエージェントは、requestdestinationに応じて分岐し、 もしあれば、最初に一致する文にvalueを設定すべきである:

      "document"
      "frame"
      "iframe"
      document `Accept` header value
      "image"
      `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`
      "json"
      `application/json,*/*;q=0.5`
      "style"
      `text/css,*/*;q=0.1`
      "text"
      `text/plain,*/*;q=0.5`
    4. (`Accept`、 value) を requestheader list付加する

  13. requestheader listが `Accept-Language` を含まず、かつrequestclientが非nullであるなら:

    1. emulatedLanguageを、 requestclientについての WebDriver BiDi emulated languageとする。

    2. emulatedLanguageが非nullなら:

      1. encodedEmulatedLanguageを、emulatedLanguage同型エンコードしたものとする。

      2. (`Accept-Language`、encodedEmulatedLanguage) を requestheader list付加する

  14. requestheader listが `Accept-Language` を含まないなら、ユーザーエージェントは (`Accept-Language`、適切な ヘッダー値) を requestheader list付加すべきである。

  15. requestinternal priorityがnullであるなら、 requestpriorityinitiatordestination、およびrender-blocking実装定義の方法で用いて、 requestinternal priority実装定義のオブジェクトに設定する。

    実装定義のオブジェクトには、 HTTP/2用のストリーム重みおよび 依存関係、それが適用されるトランスポート(HTTP/3を含む)におけるExtensible Prioritization Scheme for HTTPで用いられる優先順位、 ならびにHTTP/1 fetchの ディスパッチおよび処理に優先順位を付けるために用いられる同等の情報を含めることができる。[RFC9218]

  16. requestサブリソースリクエストであるなら:

    1. recordを、新しいfetchレコードとする。その requestrequestであり、controllerfetchParamscontrollerである。

    2. recordを、requestclientfetch groupfetch records付加する

  17. fetchParamsが与えられたものとして、main fetchを実行する。

  18. fetchParamscontrollerを返す。

リクエスト requestが与えられたとき、 クライアントから リクエストを設定するには:

  1. requesttraversable for user promptsが "client" であるなら:

    1. requesttraversable for user promptsを "no-traversable" に設定する。

    2. requestclientが非nullなら:

      1. globalを、requestclientグローバルオブジェクトとする。

      2. globalWindow オブジェクトであり、かつglobalnavigableがnullでないなら、 requesttraversable for user promptsglobalnavigabletraversable navigableに設定する。

  2. requestoriginが "client" であるなら:

    1. Assert: requestclientは 非nullである。

    2. requestoriginを、requestclientoriginに設定する。

  3. requestpolicy containerが "client" であるなら:

    1. requestclientが非nullなら、 requestpolicy containerを、 requestclientpolicy containerクローンに設定する。[HTML]

    2. そうでない場合、requestpolicy containerを、新しい policy containerに設定する。

4.1. メインフェッチ

メインフェッチするには、フェッチパラメータfetchParamsとオプションのブール値recursive(デフォルトはfalse)を指定して、以下の手順を実行します:

  1. requestfetchParamsrequestを設定する。

  2. responseをnullとする。

  3. requestlocal-URLs-only flagがセットされていて、かつrequestcurrent URLローカルでなければ、responseネットワークエラーを設定する。

  4. Content Security Policy違反をrequestに対して報告する。

  5. 必要に応じてrequestを信頼できるURLにアップグレードする。

  6. 必要に応じて混在コンテンツrequestを信頼できるURLにアップグレードする。

  7. 悪いポートのためrequestをブロックすべきか混在コンテンツとしてrequestのフェッチをブロックすべきかContent Security Policyによりrequestをブロックすべきか整合性ポリシーによりrequestをブロックすべきかblockedを返した場合、responseネットワークエラーを設定する。

  8. requestreferrer policyが空文字列であれば、requestreferrer policyrequestpolicy containerreferrer policyに設定する。

  9. requestreferrerが"no-referrer"でなければ、requestreferrerリクエストのreferrerを決定するの結果に設定する。[REFERRER]

    Referrer Policyに記載されている通り、ユーザーエージェントはエンドユーザーに"no-referrer"に上書きする、またはより機微な情報のみを公開するオプションを提供できます。

  10. 以下すべての条件を満たす場合、requestcurrent URLschemeを"https"に設定する:

    すべてのDNS操作は通常実装定義であるため、DNS解決にHTTPS RRが含まれているかどうかの判定も実装定義です。DNS操作は伝統的にコネクション取得の試行まで行われないため、ユーザーエージェントはDNS操作を早期に実施したり、ローカルDNSキャッシュを参照したり、フェッチアルゴリズムの後段で判明した場合に論理を巻き戻す必要があるかもしれません。

  11. recursiveがfalseであれば、残りの手順を並列で実行する。

  12. responseがnullであれば、最初に一致する条件の手順を実行してresponseを設定する:

    fetchParamspreloaded response candidateがnullでない
    1. fetchParamspreloaded response candidateが"pending"でなくなるまで待つ。

    2. アサートfetchParamspreloaded response candidateレスポンスである。

    3. fetchParamspreloaded response candidateを返す。

    requestcurrent URLoriginrequestorigin同一オリジンで、かつrequestresponse taintingが"basic"である
    requestcurrent URLschemeが"data"である
    requestmode が "navigate"、"websocket" または "webtransport" の場合
    1. requestresponse taintingを"basic"に設定する。

    2. scheme-fetch」と fetchParams を指定して、override fetch を実行した結果を返す。

    HTMLは、URLスキーム が "data" の場合、 そこから作成されるドキュメントおよびワーカーに一意な 不透明オリジン を割り当てます。Service Worker は URLスキームHTTP(S) スキーム である場合のみ作成できます。 [HTML] [SW]

    requestmodeが"same-origin"である

    ネットワークエラーを返す。

    requestmodeが"no-cors"である
    1. requestredirect modeが"follow"でなければネットワークエラーを返す。

    2. requestresponse taintingを"opaque"に設定する。

    3. scheme-fetch」と fetchParams を指定して、override fetch を実行した結果を返す。

    requestcurrent URLschemeHTTP(S)スキームでない

    ネットワークエラーを返す。

    requestuse-CORS-preflight flagがセットされている
    requestunsafe-request flagがセットされていて、かつrequestmethodCORS安全リストメソッドでない、またはCORS安全でないリクエストヘッダー名requestheader list空でない
    1. requestresponse taintingを"cors"に設定する。

    2. corsWithPreflightResponse を、「http-fetch」、fetchParams、および true を指定して override fetch を実行した結果とする。

    3. corsWithPreflightResponseネットワークエラーであれば、キャッシュエントリをクリアrequestで実行する。

    4. corsWithPreflightResponseを返す。

    その他
    1. requestresponse taintingを"cors"に設定する。

    2. http-fetch」と fetchParams を指定して、override fetch を実行した結果を返す。

  13. recursiveがtrueであれば、responseを返す。

  14. responseネットワークエラーでなく、かつresponseフィルタ済みレスポンスでなければ、以下を実行する:

    1. requestresponse taintingが"cors"であれば、以下を実行する:

      1. headerNamesヘッダーリスト値の抽出を`Access-Control-Expose-Headers`とresponseheader listで実行した結果を設定する。

      2. requestcredentials modeが"include"でなく、かつheaderNamesが`*`を含んでいれば、responseCORS公開ヘッダー名リストresponseheader listに含まれるすべての一意なヘッダーを設定する。

      3. それ以外でheaderNamesがnullまたは失敗でなければ、responseCORS公開ヘッダー名リストheaderNamesを設定する。

        headerNamesのうち1つは`*`である場合がありますが、この時点ではヘッダーが`*`の場合のみ一致します。

    2. 以下に応じてresponseresponse内部レスポンスとするフィルタ済みレスポンスに設定する:

      "basic"
      基本フィルタ済みレスポンス
      "cors"
      CORSフィルタ済みレスポンス
      "opaque"
      不透明フィルタ済みレスポンス
  15. internalResponseresponseを設定する。ただしresponseネットワークエラーならresponse、それ以外ならresponse内部レスポンスを設定する。

  16. internalResponseURLリスト空であるなら、 それをrequestURLリストクローンに設定する。

    レスポンスURLリストは 空になり得る。たとえば、 about: URLをfetchするときである。

  17. internalResponseredirect taintを、requestredirect-taintに設定する。

  18. requestナビゲーションリクエストであるなら、 internalResponseナビゲーションタイミング許可値 リストを、requestナビゲーションタイミング許可値 リストクローンに設定する。

  19. requestタイミング許可失敗フラグが未設定なら、 internalResponseタイミング許可通過フラグを設定する。

  20. responseネットワークエラーでなく、次のいずれかが blockedを返すなら

    その場合、responseおよびinternalResponseネットワークエラーに設定する。

  21. responsetypeが "opaque" であり、 internalResponsestatusrange statusであり、 internalResponserange-requested flagが設定されており、 requestheader listが `Range` を含まないなら、 responseおよびinternalResponseネットワークエラーに設定する。

    従来、APIは範囲が要求されていない場合でも範囲レスポンスを受け入れる。これは、 以前の範囲リクエストからの部分レスポンスまたは範囲を満たせないレスポンスが、 範囲リクエストを行っていないAPIに提供されることを防ぐ。

    さらなる詳細

    上記の手順は、次の攻撃を防ぐ:

    media要素が、クロスオリジンHTMLリソースの範囲を要求するために用いられる。これは 無効なメディアであるが、レスポンスのクローンへの参照をサービスワーカー内に保持できる。これは 後でscript要素のfetchへのレスポンスとして使用できる。部分レスポンスが有効な JavaScriptである場合(リソース全体はそうでなくても)、それを実行するとプライベート データが漏えいすることになる。

  22. responseネットワークエラーでなく、かつ requestmethodが `HEAD` または `CONNECT` であるか、またはinternalResponsestatusnull body statusであるなら、 internalResponsebodyを nullに設定し、それに向けたエンキューを(もしあれば)すべて無視する。

    これは、HTTPに違反するサーバーに対するエラー処理を標準化する。

  23. requestintegrity metadataが空文字列でないなら、 次を実行する:

    1. processBodyErrorを次の手順とする:fetchParamsおよび ネットワークエラーが与えられたものとして、fetch response handoverを実行する。

    2. responsebodyがnullであるなら、 processBodyErrorを実行し、これらの手順を中止する。

    3. bytesが与えられたときのprocessBodyを、次の手順とする:

      1. bytesrequestintegrity metadata一致しないなら、 processBodyErrorを実行し、これらの手順を中止する。[SRI]

      2. responsebodyを、bytes as a bodyに設定する。

      3. fetchParamsおよびresponseが与えられたものとして、fetch response handoverを実行する。

    4. responsebodyを、 processBodyおよびprocessBodyErrorが与えられたものとして完全に 読む

  24. そうでない場合、fetchParamsおよび responseが与えられたものとして、fetch response handoverを実行する。


フェッチレスポンス引き渡しは、フェッチパラメータfetchParamsレスポンスresponseを指定して、以下の手順を実行します:

  1. timingInfofetchParamsタイミング情報を設定する。

  2. responseネットワークエラーでなく、かつfetchParamsrequestclientセキュアコンテキストなら、timingInfoserver-timing headersresponse内部レスポンスヘッダーリストから`Server-Timing`を取得・デコード・分割した結果を設定する。

    response内部レスポンスを用いるのは安全です。`Server-Timing`ヘッダー情報の公開は`Timing-Allow-Origin`ヘッダーによって制御されます。

    ユーザーエージェントは非セキュアコンテキストのリクエストにも`Server-Timing`ヘッダーを公開する場合があります。

  3. fetchParamsrequestdestinationが"document"であれば、fetchParamscontrollerfull timing infofetchParamsタイミング情報を設定する。

  4. processResponseEndOfBodyに以下の手順を設定する:

    1. unsafeEndTimeunsafe shared current timeを設定する。

    2. fetchParamscontrollerreport timing stepsに、グローバルオブジェクトglobalを受け取る手順として以下を設定する:

      1. fetchParamsrequestURLschemeHTTP(S)スキームでなければreturnする。

      2. timingInfoend timerelative high resolution timeunsafeEndTime, globalを指定)で設定する。

      3. cacheStateresponsecache stateを設定する。

      4. bodyInforesponsebody infoを設定する。

      5. responsetiming allow passed flagが未設定なら、timingInfo不透明タイミング情報の作成timingInfoを指定)の結果を設定し、cacheStateを空文字列に設定する。

        これはresponseネットワークエラーの場合を含みます。

      6. responseStatusを0に設定する。

      7. fetchParamsrequestmodeが"navigate"でない、またはresponseredirect taintが"same-origin"であれば:

        1. responseStatusresponsestatusを設定する。

        2. mimeTypeMIMEタイプの抽出responseheader listを指定)の結果を設定する。

        3. mimeTypeが失敗でなければ、bodyInfocontent typeサポートされているMIMEタイプの最小化mimeType)の結果を設定する。

      8. fetchParamsrequestinitiator typeがnullでなければ、mark resource timingtimingInfo, fetchParamsrequestURL, fetchParamsrequestinitiator type, global, cacheState, bodyInfo, responseStatus)を実行する。

    3. processResponseEndOfBodyTaskに以下の手順を設定する:

      1. fetchParamsrequestdone flagを設定する。

      2. fetchParamsprocess response end-of-bodyがnullでなければ、fetchParamsprocess response end-of-bodyresponse)を実行する。

      3. fetchParamsrequestinitiator typeがnullでなく、かつfetchParamsrequestclientグローバルオブジェクトfetchParamstask destinationであれば、fetchParamscontrollerreport timing stepsfetchParamsrequestclientグローバルオブジェクト)を実行する。

    4. フェッチタスクをキューし、processResponseEndOfBodyTaskfetchParamstask destinationで実行する。

  5. fetchParamsprocess responseがnullでなければ、フェッチタスクをキューし、fetchParamsprocess responseresponse)をfetchParamstask destinationで実行する。

  6. internalResponseresponseを設定する。ただしresponseネットワークエラーならresponse、それ以外ならresponse内部レスポンスを設定する。

  7. responseネットワークエラーであれば、 request を引数に WebDriver BiDi フェッチエラーの手順を実行する。そうでなければ、 requestresponse を引数に WebDriver BiDi レスポンス完了の手順を実行する。

  8. internalResponsebodyがnullなら、processResponseEndOfBodyを実行する。

  9. それ以外の場合:

    1. transformStreamに新しいTransformStreamを設定する。

    2. identityTransformAlgorithmに、chunkを受け取ったときtransformStreamchunkenqueueするアルゴリズムを設定する。

    3. transformStreamのセットアップを行い、transformAlgorithmidentityTransformAlgorithmに、flushAlgorithmprocessResponseEndOfBodyに設定する。

    4. internalResponsebodystreamに、internalResponsebodystreampipe throughした結果をtransformStreamで設定する。

    このTransformStreamは、ストリームの終端到達時の通知目的で必要です。それ以外は恒等変換ストリームです。

  10. fetchParamsprocess response consume bodyがnullでなければ、以下を実行する:

    1. processBodynullOrBytesを受け取ったときfetchParamsprocess response consume bodyresponse, nullOrBytes)を実行する手順を設定する。

    2. processBodyErrorfetchParamsprocess response consume bodyresponse, failure)を実行する手順を設定する。

    3. internalResponsebodyがnullなら、フェッチタスクをキューし、processBody(null)をfetchParamstask destinationで実行する。

    4. それ以外の場合、完全に読み取るinternalResponsebodyに対してprocessBody, processBodyError, fetchParamstask destinationで実行する。

4.2. オーバーライドフェッチ

オーバーライドフェッチは、「scheme-fetch」または「http-fetch」の typefetch params fetchParams、さらにオプションの boolean makeCORSPreflight(デフォルトは false)を受け取る:

  1. requestfetchParamsrequest とする。

  2. responserequest に対して 要求のオーバーライド可能なレスポンス を実行した結果とする。

  3. response が null でなければ、response を返す。

  4. type に応じて以下を実行する:

    "scheme fetch"

    responseスキームフェッチfetchParams で実行した結果とする。

    "HTTP fetch"

    responseHTTPフェッチfetchParamsmakeCORSPreflight で実行した結果とする。

  5. response を返す。

リクエストに対してレスポンスを潜在的に上書きする アルゴリズムは、リクエスト requestを受け取り、レスポンスまたはnullのいずれかを返す。その挙動は 実装定義であり、ユーザーエージェントが レスポンスを直接返すことでリクエストに 介入すること、またはnullを返すことでリクエストの続行を許可することを可能にする。

既定では、このアルゴリズムは次の自明な実装を持つ:

  1. nullを返す。

ユーザーエージェントは一般に、この既定の実装を、多少より複雑な 一連の挙動で上書きする。たとえば、ユーザーエージェントは、その利用者の安全性を最もよく保つには `https://unsafe.example/` へのリクエストを一般的にブロックする一方で、 広く使用されているリソース `https://unsafe.example/widget.js` については破損を避けるためにshimを合成する、 と判断するかもしれない。その実装は次のようになるかもしれない:

  1. request現在のURLhost登録可能ドメインが "unsafe.example" であるなら:

    1. request現在のURLpathが « "widget.js" » であるなら:

      1. bodyを[shimされたコンテンツを表すバイト列をここに挿入する]とする。

      2. 次のプロパティを持つ新しいレスポンスを返す:

        type
        "cors"
        status
        200
        ...
        ...
        body
        bodybodyとして取得した結果。
    2. ネットワークエラーを返す。

  2. nullを返す。

4.3. スキームフェッチ

スキームフェッチは、fetch params fetchParams を受け取る:

  1. fetchParamsキャンセル済みの場合、fetchParamsに対して 適切なネットワークエラー を返す。

  2. requestfetchParamsrequest とする。

  3. requestcurrent URLscheme に応じて以下の手順を実行する:

    "about"

    requestcurrent URLpath が "blank" の場合、response を新規作成し、 status message を `OK`、 header list を « (`Content-Type`, `text/html;charset=utf-8`) »、 body を空のバイト列 本文として設定して返す。

    URL(例:"about:config")は ナビゲーション時に処理され、 fetchの文脈では ネットワークエラー となる。

    "blob"
    1. blobURLEntry を、requestcurrent URLblob URL entry とする。

    2. もし requestmethod が `GET` でない、または blobURLEntry が null であるなら、network error を返す。 [FILEAPI]

      `GET` method の制約は、相互運用性以外に有用な目的を持たない。

    3. requestEnvironment を、request を与えて 環境を決定した結果とする。

    4. isTopLevelSelfFetch を false とする。

    5. もし requestclient が non-null なら:

      1. global を、requestclientglobal object とする。

      2. 次の条件がすべて真なら:

        その場合、isTopLevelSelfFetch を true に設定する。

    6. stringOrEnvironment を次の手順の結果とする:

      1. もし requestdestination が "document" なら、 "top-level-navigation" を返す。

      2. もし isTopLevelSelfFetch が true なら、 "top-level-self-fetch" を返す。

      3. requestEnvironment を返す。

    7. blob を、blobURLEntrystringOrEnvironment を与えて blob オブジェクトを取得した結果とする。

    8. もし blobBlob オブジェクトでないなら、network error を返す。

    9. response を新しい response とする。

    10. fullLengthblobsize とする。

    11. serializedFullLength を、fullLengthserialized および isomorphic encoded したものとする。

    12. typeblobtype とする。

    13. もし requestheader list含まない 場合、 `Range` を:

      1. bodyWithType を、安全に抽出して得た blob の結果とする。

      2. responsestatus message を `OK` に設定する。

      3. responsebody を、 bodyWithTypebody に設定する。

      4. responseheader list を « (`Content-Length`, serializedFullLength), (`Content-Type`, type) » に設定する。

    14. それ以外の場合:

      1. responserange-requested flag を設定する。

      2. rangeHeader を、取得した結果、すなわち requestheader list からの `Range` とする。

      3. rangeValue を、単一の Range ヘッダー値を解析 した結果とし、rangeHeader と true を与える。

      4. もし rangeValue が failure なら、network error を返す。

      5. (rangeStart, rangeEnd) を rangeValue とする。

      6. もし rangeStart が null なら:

        1. rangeStartfullLengthrangeEnd に設定する。

        2. rangeEndrangeStart + rangeEnd − 1 に設定する。

      7. それ以外の場合:

        1. もし rangeStartfullLength 以上なら、 network error を返す。

        2. もし rangeEnd が null、または rangeEndfullLength 以上なら、rangeEndfullLength − 1 に設定する。

      8. slicedBlob を、slice blob を呼び出した結果とし、 blob, rangeStart, rangeEnd + 1, および type を与える。

        Range ヘッダーは包含的なバイト範囲を表す一方で、slice blob アルゴリズムの入力範囲はそうではない。slice blob アルゴリズムを使用するためには、 rangeEnd をインクリメントする必要がある。

      9. slicedBodyWithType を、 安全に抽出した slicedBlob の結果とする。

      10. responsebody を、 slicedBodyWithTypebody に設定する。

      11. serializedSlicedLength を、slicedBlobsizeserialized および isomorphic encoded したものとする。

      12. contentRange を、content range を構築した結果とし、 rangeStart, rangeEnd, および fullLength を与える。

      13. responsestatus を 206 に設定する。

      14. responsestatus message を `Partial Content` に設定する。

      15. responseheader list を « (`Content-Length`, serializedSlicedLength), (`Content-Type`, type), (`Content-Range`, contentRange) » に設定する。

    15. response を返す。

    "data"
    1. dataURLStruct を、requestdata: URL プロセッサcurrent URL に対して実行した結果とする。

    2. もし dataURLStruct が failure なら、network error を返す。

    3. mimeType を、dataURLStructMIME type直列化したものとする。

    4. 新しい response を返す。その status message は `OK`、header list は « (`Content-Type`, mimeType) »、そして bodydataURLStructbody本文として 用いたものである。

    "file"

    現時点では不本意ながら、file: URL は読者への演習問題として残されている。

    判断に迷う場合は、network error を返すこと。

    HTTP(S) スキーム

    fetchParams を与えて HTTP fetch を実行した結果を返す。

  4. network error を返す。

環境を決定するためには、request request を受け取る:

  1. requestreserved client が null でなければ、 requestreserved client を返す。

  2. requestclient が null でなければ、 requestclient を返す。

  3. null を返す。

4.4. HTTPフェッチ

HTTPフェッチは、 fetch params fetchParams と、オプションの boolean makeCORSPreflight(デフォルトは false)を受け取り、以下の手順を実行する:

  1. requestfetchParamsrequest とする。

  2. responseinternalResponse を null とする。

  3. requestservice-workers mode が "all" の場合:

    1. requestForServiceWorkerclonerequest を複製したものとする。

    2. requestForServiceWorkerbody が null でなければ:

      1. transformStream を新しい TransformStream とする。

      2. transformAlgorithmchunk を受け取るアルゴリズムとして以下とする:

        1. fetchParamsキャンセル済みなら、これらの手順を中止する。

        2. chunkUint8Array オブジェクトでなければ、 terminatefetchParamscontroller を終了する。

        3. それ以外の場合、enqueuechunktransformStream に追加する。ユーザーエージェントは、チャンクを 実装定義の適切なサイズに分割して enqueue してもよいし、チャンク群を 実装定義の適切なサイズに連結して enqueue してもよい。

      3. transformStreamtransformAlgorithm にセットアップする。

      4. requestForServiceWorkerbodystreamrequestForServiceWorkerbodystreampipe through transformStream した結果に設定する。

    3. serviceWorkerStartTimecoarsened shared current timefetchParamscross-origin isolated capability で実行した結果とする。

    4. fetchResponsehandle fetchrequestForServiceWorkerfetchParamscontroller および fetchParamscross-origin isolated capability とともに渡して呼び出した結果とする。 [HTML] [SW]

    5. もし fetchResponseresponse の場合:

      1. responsefetchResponse を設定する。

      2. fetchParamstiming infofinal service worker start timeserviceWorkerStartTime を設定する。

      3. fetchParamstiming infoservice worker timing inforesponseservice worker timing info を設定する。

      4. もし requestbody が null でない場合、 cancelrequestbody に undefined で適用する。

      5. internalResponseresponse に設定する。ただし、responsefiltered response であれば、 responseinternal response に設定する。

      6. WebDriver BiDi レスポンス開始の手順を requestresponse を使って実行する。

      7. 次のいずれか真の場合

        • responsetype が "error" である

        • requestmode が "same-origin" で、かつ responsetype が "cors" である

        • requestmode が "no-cors" でなく、かつ responsetype が "opaque" である

        • requestredirect mode が "manual" でなく、かつ responsetype が "opaqueredirect" である
        • requestredirect mode が "follow" でなく、かつ responseURL list が 2 つ以上の項目を持つ場合

        その場合、network error を返す。

    6. それ以外の場合、fetchResponseservice worker timing info であれば、 fetchParamstiming infoservice worker timing infofetchResponse を設定する。

  4. response が null の場合:

    1. makeCORSPreflight が true かつ以下のいずれかが真の場合:

      この場合:

      1. preflightResponseCORSプリフライトフェッチrequest で実行した結果とする。

      2. preflightResponseネットワークエラーの場合、 preflightResponse を返す。

      この手順は CORSプリフライトキャッシュ を確認し、 適切なエントリがなければ CORSプリフライトフェッチ を行い、成功すればキャッシュに登録する。 CORSプリフライトフェッチ の目的は 取得されるリソースが CORSプロトコルに対応していることを保証することである。 キャッシュは CORSプリフライトフェッチ の回数を減らすためにある。

    2. requestredirect mode が "follow" の場合、 requestservice-workers mode を "none" に設定する。

      ネットワーク由来のリダイレクト(サービスワーカー由来でない場合)はサービスワーカーに公開しない。

    3. responseinternalResponseHTTPネットワークまたはキャッシュフェッチfetchParams で実行した結果に設定する。

    4. requestresponse tainting が "cors" かつ CORSチェックrequestresponse で実行した結果が失敗の場合、 ネットワークエラー を返す。

      CORSチェックは、レスポンスstatusが304または407であるもの、あるいはレスポンスのうちservice workerからのものには 適用されないため、ここで適用される。

    5. TAOチェックrequestresponse で実行した結果が失敗なら、 requesttiming allow failed flag を設定する。

  5. もし requestresponse tainting または responsetype が "opaque" であり、さらに cross-origin resource policy checkrequestoriginrequestclientrequestdestination、および internalResponse に対して実行した結果が blocked を返すなら、 network error を返す。

    cross-origin resource policy check は、 ネットワークからのレスポンスおよびサービスワーカーからのレスポンスに対して実行される。これは CORS check とは異なり、requestclient とサービスワーカーでは、異なる埋め込みポリシーを持ち得る。

  6. internalResponsestatusリダイレクトステータスの場合:

    1. requestナビゲーションリクエストであるなら、 requestおよび internalResponseが与えられたものとして、 リクエストの ナビゲーションタイミング許可値リストに付加する

    2. internalResponsestatus が 303 でなく requestbody が null でなく connection が HTTP/2 を利用している場合、 ユーザーエージェントは RST_STREAM フレームを送信してもよい(推奨)。

      303 は特定コミュニティで特別視されるため除外されている。

    3. requestredirect mode に応じて:

      "error"
      1. responseネットワークエラー に設定する。

      "manual"
      1. requestmode が "navigate" の場合、 fetchParamscontrollernext manual redirect stepsHTTPリダイレクトフェッチfetchParamsresponse で実行する手順を設定する。

      2. それ以外の場合、 responseopaque-redirect filtered response に設定し、 その internal responseinternalResponse にする。

      "follow"
      1. WebDriver BiDi レスポンス完了 の手順を request および response で実行する。
      2. fetchParamsresponse を与えて HTTP-redirect fetch を実行した結果を response に設定する。

  7. response を返す。通常、internalResponsebodystream は この返却後もエンキューされ続けている。

4.5. HTTP リダイレクト フェッチ

HTTP-redirect fetchを、fetch params fetchParamsresponse response を与えて実行するには、次の手順を行う:

  1. request を、fetchParamsrequest とする。

  2. internalResponseresponse とする。ただし、responsefiltered response でない場合に限る。そうでない場合は responseinternal response とする。

  3. locationURL を、internalResponselocation URL とする。 これは、requestcurrent URLfragment を与えて得る。

  4. もし locationURL が null なら、response を返す。

  5. もし locationURL が failure なら、network error を返す。

  6. もし locationURLschemeHTTP(S) scheme でないなら、 network error を返す。

  7. もし requestredirect count が 20 なら、 network error を返す。

  8. requestredirect count を 1 増加させる。

  9. もし requestmode が "cors" で、 locationURLcredentials を含み、 かつ requestoriginlocationURLoriginsame origin でないなら、network error を返す。

  10. もし requestresponse tainting が "cors" であり、 かつ locationURLcredentials を含むなら、network error を返す。

    これは、クロスオリジンのリソースが同一オリジンの URL にリダイレクトする場合を検出する。

  11. もし internalResponsestatus が 303 でなく、requestbody が non-null であり、かつ requestbodysource が null なら、network error を返す。

  12. 次のいずれかが真である場合

    • internalResponsestatus が 301 または 302 で、 requestmethod が `POST` の場合

    • internalResponsestatus が 303 で、 requestmethod が `GET` または `HEAD` でない場合

    その場合:

    1. requestmethod を `GET` に設定し、 requestbody を null に設定する。

    2. headerNamerequest-body-header name)について、 削除 を行い、requestheader list から headerName を取り除く。

  13. もし requestcurrent URLorigin が、 locationURLoriginsame origin でないなら、 headerNameCORS non-wildcard request-header name)について、 削除 を行い、requestheader list から headerName を取り除く。

    すなわち、初期リクエスト後に別のオリジンが見えた瞬間に、 `Authorization` ヘッダーが削除される。

  14. もし requestbody が non-null なら、requestbody を、body に設定する。これは、 安全に抽出した requestbodysource の結果である。

    requestbodysource が null かどうかはすでに確認済みである。

  15. timingInfo を、fetchParamstiming info とする。

  16. timingInforedirect end timepost-redirect start time を、 coarsened shared current time に設定する。 これは、fetchParamscross-origin isolated capability を与えて得る。

  17. もし timingInforedirect start time が 0 なら、 timingInforedirect start timetimingInfostart time に設定する。

  18. Append(追加)を行い、locationURLrequestURL list に追加する。

  19. set request’s referrer policy on redirect を、request および internalResponse に対して呼び出す。[REFERRER]

  20. recursive を true とする。

  21. もし requestredirect mode が "manual" なら、 次を行う:

    1. Assert(断言): requestmode は "navigate" である。

    2. recursive を false に設定する。

  22. main fetch を、fetchParams および recursive を与えて実行した結果を返す。

    これは、requestmain fetch を呼び出して、 response tainting を正しく取得する必要がある。

4.6. HTTP ネットワークまたはキャッシュ フェッチ

HTTP-network-or-cache フェッチ を、fetch params fetchParams、オプショナルな boolean isAuthenticationFetch(デフォルトは false)、およびオプショナルな boolean isNewConnectionFetch(デフォルトは false)を与えて、次の手順を実行する:

一部の実装は HTTP Caching に従って部分的コンテンツのキャッシュをサポートするかもしれません。ただし、これはブラウザキャッシュでは広くサポートされていません。 [HTTP-CACHING]

  1. requestfetchParamsrequest とする。

  2. httpFetchParams を null とする。

  3. httpRequest を null とする。

  4. response を null とする。

  5. storedResponse を null とする。

  6. httpCache を null とする。

  7. revalidatingFlag を未設定とする。

  8. 次の手順を実行するが、abort when fetchParamscanceled の場合は中断する:

    1. もし requesttraversable for user prompts が "no-traversable" かつ requestredirect mode が "error" であれば、httpFetchParamsfetchParams を、httpRequestrequest を設定する。

    2. それ以外の場合:

      1. httpRequestrequestclone を設定する。

        実装は requestbodystream が null の場合(つまり単一ボディで十分な場合)は tee しないことが推奨されます。たとえば、requestbodysource が null なら、リダイレクトや認証時にフェッチは失敗します。

      2. httpFetchParamsfetchParams のコピーに設定する。

      3. httpFetchParamsrequesthttpRequest に設定する。

      ユーザープロンプトやリダイレクトが発生しうる場合、ユーザーの応答やリダイレクト先決定後に改めて新しいヘッダーでリクエストを送る必要があるかもしれません。その際、オリジナルのリクエストボディが一部送信済みとなっている可能性があるため、事前にリクエスト(ボディ含め)をクローンしてスペアを確保しておく必要があります。

    3. 次のいずれかの場合 includeCredentials を true とする:

      上記以外の場合は false とする。

    4. Cross-Origin-Embedder-Policy allows credentialsrequest で false を返す場合、includeCredentials を false に設定する。

    5. contentLengthhttpRequestbodylengthhttpRequestbody が null でない場合)、そうでなければ null とする。

    6. contentLengthHeaderValue を null とする。

    7. httpRequestbody が null かつ httpRequestmethod が `POST` または `PUT` の場合、contentLengthHeaderValue を `0` に設定する。

    8. contentLength が null でなければ contentLengthHeaderValuecontentLengthシリアライズisomorphic encode した値を設定する。

    9. contentLengthHeaderValue が null でなければ、append(`Content-Length`、contentLengthHeaderValue)を httpRequestheader list に追加する。

    10. contentLength が null でなく、httpRequestkeepalive が true ならば:

      1. inflightKeepaliveBytes を 0 とする。

      2. grouphttpRequestclientfetch group にする。

      3. inflightRecordsgroup 内で fetch records のうち、requestkeepalive が true かつ done flag が未設定なものの集合とする。

      4. For each fetchRecord of inflightRecords:

        1. inflightRequestfetchRecordrequest とする。

        2. inflightKeepaliveBytesinflightRequestbodylength を加算する。

      5. contentLengthinflightKeepaliveBytes の和が 64 kibibytes を超える場合、network error を返す。

      この制限により、bodyを含む環境設定オブジェクトの寿命を越えて生き残れるリクエストについてサイズが制限され、無限に生き残ることができなくなります。

    11. httpRequestreferrerURL の場合:

      1. referrerValuehttpRequestreferrerserialize かつ isomorphic encode した値とする。

      2. Append(`Referer`、referrerValue)を httpRequestheader list に追加する。

    12. Origin ヘッダーをリクエストに追加する。

    13. httpRequest の Fetch metadata ヘッダーを追加する。 [FETCH-METADATA]

    14. httpRequestinitiator が "prefetch" なら、structured field value を設定(`Sec-Purpose`、token prefetch)を httpRequestheader list にセットする。

    15. httpRequestheader list`User-Agent` を含まないとき、UAは:

      1. userAgenthttpRequestclient環境デフォルト `User-Agent` 値とする。

      2. Append(`User-Agent`、userAgent)を httpRequestheader list に追加する。

    16. httpRequestcache mode が "default" かつ httpRequestheader list が `If-Modified-Since` または `If-None-Match` または `If-Unmodified-Since` または `If-Match` または `If-Range` のいずれかを含むとき、 httpRequestcache mode を "no-store" に設定する。

    17. httpRequestcache mode が "no-cache", httpRequestprevent no-cache cache-control header modification flag が未設定、かつ httpRequestheader list`Cache-Control` を含まない場合、append(`Cache-Control`、`max-age=0`)を httpRequestheader list に追加する。

    18. httpRequestcache mode が "no-store" または "reload" の場合:

      1. httpRequestheader list`Pragma` を含まない場合、append(`Pragma`、`no-cache`)を httpRequestheader list に追加する。

      2. httpRequestheader list`Cache-Control` を含まない場合、append(`Cache-Control`、`no-cache`)を httpRequestheader list に追加する。

    19. httpRequestheader list`Range` を含む場合、append(`Accept-Encoding`、`identity`)を httpRequestheader list に追加する。

      これは、エンコード済みの response の一部で content codings の処理 を行う際の失敗を回避します。

      さらに、多くのサーバー は、非 identity のエンコーディングが許可されている場合に `Range` ヘッダーを誤って無視してしまうことがあります。

    20. HTTPに従い httpRequestheader list を修正する。与えられた headerhttpRequestheader list既に存在する場合は、append しない。

      ここの正規化を厳密にしたいところ。たとえば下記のようなヘッダー( `Accept-Encoding`、 `Connection`、 `DNT`、および `Host` など)は必要に応じてappend されることになります。

      ただしこの時点では `Accept`、 `Accept-Charset`, `Accept-Language` は含めてはいけません。

      `Accept` と `Accept-Language` は既に含まれています(fetch() を利用する場合、後者はデフォルトで含まれません)。また `Accept-Charset` は無駄なバイトです。詳細はHTTP header layer divisionも参照。

    21. includeCredentials が true の場合:

      1. リクエストの `Cookie` ヘッダーを追加する。

      2. httpRequestheader list`Authorization` を含まない場合:

        1. authorizationValue を null とする。

        2. もし httpRequest に対する authentication entry が存在し、かつ httpRequestuse-URL-credentials flag が未設定である、または httpRequestcurrent URLcredentials を含まない 場合、 authorizationValueauthentication entry に設定する。

        3. それ以外の場合で、httpRequestcurrent URLcredentials を含み、かつ isAuthenticationFetch が true のときは、 authorizationValuehttpRequestcurrent URL に、 `Authorization` 値に変換したものを設定する。

        4. もし authorizationValue が non-null なら、append を行い、 (`Authorization`, authorizationValue) を httpRequestheader list に追加する。

    22. proxy-authentication entry が存在する場合は、必要に応じてそれを利用する。

      ここは httpRequestcredentials mode には依存しない実装としています。

    23. WebDriver BiDi リクエスト送信前の手順を request で実行する。

    24. httpCachedetermine the HTTP cache partition の結果(httpRequest を与えて呼ぶ)で設定する。

    25. httpCache が null なら httpRequestcache mode を "no-store" に設定する。

    26. httpRequestcache mode が "no-store" でも "reload" でもない場合:

      1. storedResponsehttpCache からレスポンスを選び、必要ならバリデーション処理し、HTTP Caching の "Constructing Responses from Caches" を参考に設定する。

        HTTPの規定により、`Vary` header も考慮されます。

      2. storedResponse が null でなければ:

        1. cache mode が "default" かつ storedResponsestale-while-revalidate response で、httpRequestclient が null でない場合:

          1. responsestoredResponse に設定する。

          2. responsecache state を "local" に設定する。

          3. revalidateRequestrequestclone で作成する。

          4. revalidateRequestcache mode を "no-cache" に設定する。

          5. revalidateRequestprevent no-cache cache-control header modification flag をセットする。

          6. revalidateRequestservice-workers mode を "none" に設定する。

          7. 並列でmain fetch を(fetch paramsrequestrevalidateRequest を与えて)実行する。

            この fetch は httpCache の状態更新専用で、その response は次回キャッシュアクセスまで使われません。staleなレスポンスが今回の応答に使われます。この fetch は client のコンテキストで発行されるため、clientが消えれば終了します。

        2. それ以外の場合:

          1. storedResponsestale response であれば revalidatingFlag をセットする。

          2. revalidatingFlag がセット済み かつ httpRequestcache mode が "force-cache" または "only-if-cached" のいずれでもなければ:

            1. storedResponseheader list`ETag` を含むとき、append(`If-None-Match`、`ETag` の value)を httpRequestheader list に追加する。

            2. storedResponseheader list`Last-Modified` を含むとき、append(`If-Modified-Since`、`Last-Modified` の value)を httpRequestheader list に追加する。

            "Sending a Validation Request" 章も参照。 HTTP Caching [HTTP-CACHING]

          3. それ以外は responsestoredResponse に、responsecache state を "local" に設定する。

  9. If aborted なら appropriate network errorfetchParams で返す。

  10. response が null でない場合、 WebDriver BiDi レスポンス開始の手順を requestresponse で実行する。

  11. response が null の場合:

    1. httpRequestcache mode が "only-if-cached" の場合、network error を返す。

    2. forwardResponseHTTP-network fetchhttpFetchParams, includeCredentials, isNewConnectionFetch を与えて実行した結果とする。

    3. httpRequestmethodunsafe かつ forwardResponsestatus が 200〜399 の範囲なら httpCache の該当する storedResponses を "Invalidating Stored Responses" の規定に従い無効化し、storedResponse を null にする。[HTTP-CACHING]

    4. revalidatingFlag がセット済み かつ forwardResponsestatus が 304 なら:

      1. storedResponseheader list を、forwardResponseheader list で、"Freshening Stored Responses upon Validation" に従い更新する。

        これによりキャッシュ内の stored response も更新されます。

      2. responsestoredResponse に設定する。

      3. responsecache state を "validated" に設定する。

    5. response が null なら:

      1. responseforwardResponse に設定する。

      2. httpRequest および forwardResponsehttpCache に "Storing Responses in Caches" の規定で保存する。[HTTP-CACHING]

        forwardResponsenetwork error の場合、これは負のキャッシュ(negative caching)として扱われます。

        関連するbody info も response と一緒にキャッシュ保存されます。

  12. responseURL listhttpRequestURL listclone とする。

  13. httpRequestheader list`Range` を含む場合、responserange-requested flag をセットする。

  14. responserequest-includes-credentialsincludeCredentials に設定する。

  15. responsestatus が 401、httpRequestresponse tainting が "cors" 以外、includeCredentials が true、かつ requesttraversable for user promptstraversable navigable の場合:

    1. 要検証: 複数の `WWW-Authenticate` ヘッダー、欠落、パースエラー等。

    2. requestbody が null でない場合:

      1. requestbodysource が null なら network error を返す。

      2. requestbodybodysafely extracting requestbodysource 結果)のものに設定する。

    3. requestuse-URL-credentials flag が未設定または isAuthenticationFetch が true なら:

      1. fetchParamscanceled なら appropriate network errorfetchParams で返す。

      2. username および password をユーザーに requesttraversable for user prompts でプロンプトして取得する。

      3. Set the usernamerequestcurrent URL, username)を呼ぶ。

      4. Set the passwordrequestcurrent URL, password)を呼ぶ。

    4. HTTP-network-or-cache fetchfetchParams, true を与えて)を実行した結果を response に設定する。

  16. responsestatus が 407 の場合:

    1. requesttraversable for user prompts が "no-traversable" の場合 network error を返す。

    2. 要検証: 複数の `Proxy-Authenticate` ヘッダー、欠落、パースエラー等。

    3. fetchParamscanceled なら appropriate network errorfetchParams で返す。

    4. ユーザーにプロンプトし、その結果を proxy-authentication entry として保存する。[HTTP]

      プロキシ認証に関する詳細は HTTP に規定されています。

    5. HTTP-network-or-cache fetchfetchParams を与える)を実行した結果を response に設定する。

  17. 下記すべてが true なら:

    • responsestatus が 421

    • isNewConnectionFetch が false

    • requestbody が null または requestbody が null でなく requestbodysource が null でない

    場合:

    1. fetchParamscanceled なら appropriate network errorfetchParams で返す。

    2. HTTP-network-or-cache fetchfetchParams, isAuthenticationFetch, true を与えて)を実行した結果を response に設定する。

  18. isAuthenticationFetch が true なら authentication entryrequest と realm で作成する。

  19. response を返す。通常 responsebodystream には戻り値時点でまだ enqueue 中です。

4.7. HTTP-network フェッチ

HTTP-network fetchを、fetch params fetchParams、 オプションの boolean includeCredentials(デフォルト false)、およびオプションの boolean forceNewConnection(デフォルト false)を与えて実行するには、次の手順を行う:

  1. requestfetchParamsrequest とする。

  2. もし requestクライアントオフラインであれば、 ネットワークエラー を返す。

  3. response を null とする。

  4. timingInfofetchParamstiming info とする。

  5. networkPartitionKey を、request に対するネットワークパーティションキーの決定 を実行して得た結果とする。

  6. newConnection を、もし forceNewConnection が true なら "yes"、そうでなければ "no" にする。

  7. requestmode に応じて分岐する:

    "websocket"

    connection を、WebSocket 接続の取得requestcurrent URL を与えて)で得た結果とする。

    "webtransport"

    connection を、WebTransport 接続を取得する 処理に networkPartitionKeyrequest を渡して得られる結果とする。

    それ以外

    connection を、接続の取得networkPartitionKeyrequestcurrent URLincludeCredentials、および newConnection を与えて)で得た結果とする。

  8. 次の手順を実行する。ただし abort when fetchParamscanceled の場合は中止する:

    1. もし connection が failure なら、network error を返す。

    2. timingInfofinal connection timing info を、 clamp and coarsen connection timing infoconnectiontiming infotimingInfopost-redirect start time、 および fetchParamscross-origin isolated capability と共に呼び出した結果に設定する。

    3. もし connection が HTTP/1.x 接続で、かつ requestbody が non-null であり、かつその source が null なら、network error を返す。

    4. timingInfofinal network-request start time を、coarsened shared current timefetchParamscross-origin isolated capability を用いて得たもの)に設定する。

    5. connection 上で request を用いた HTTP リクエストを行い、その結果を response に設定する。ただし以下の注意を伴う:

      • HTTP に関する関連要件に従うこと。[HTTP] [HTTP-CACHING]

      • もし requestbody が non-null で、かつその source が null なら、ユーザーエージェントは最大 64 KiB のバッファを保持して request の一部の body をそこに保存してよい。もしユーザーエージェントがそのバッファサイズを超えて requestbody を読み、かつ再送が必要になった場合は、代わりに network error を返す。

        再送は例えば接続がタイムアウトしたときに必要になることがある。

        バッファは、もし requestbodysource が non-null の場合は不要である。なぜならその場合は body を再作成できるからである。

        もし requestbodysource が null であるなら、それは bodyReadableStream から作られていることを意味し、その場合 body を再作成できないためバッファが必要になる、ということである。

      • 次の処理を繰り返す:

        1. timingInfofinal network-response start timefetchParamscross-origin isolated capability を与えて coarsened shared current time を設定する。 これは、ユーザーエージェントの HTTP パーサーがレスポンスの最初のバイト(たとえば HTTP/2 ならフレームヘッダバイトや、HTTP/1.x ならレスポンスステータスライン)を受信した直後に行う。

        2. すべての HTTP レスポンスヘッダーが伝送されるまで待つ。

        3. WebDriver BiDi レスポンス開始の手順を requestresponse で実行する。

        4. status を HTTP レスポンスのステータスコードとする。

        5. status が 100 以上 199 以下の範囲にある場合:

          1. timingInfofirst interim network-response start time が 0 ならば、timingInfofirst interim network-response start timetimingInfofinal network-response start time で設定する。

          2. requestmode が "websocket" かつ status が 101 なら break する。

          3. status が 103 かつ fetchParamsprocess early hints response が null でない場合、fetch タスクをキューして fetchParamsprocess early hints responseresponse とともに実行する。

          4. 継続 (Continue) する。

          これらの種類の HTTP レスポンスの後には、最終的な "final" HTTP レスポンスが続く。

        6. break する。

      Fetch と HTTP の正確なレイヤリングは依然として整理が必要であり、そのため response はここでは response と HTTP レスポンスの両方を表します。

      もし HTTP リクエストが TLS クライアント証明書ダイアログを必要とする場合は、次を行う:

      1. もし requesttraversable for user promptstraversable navigable であれば、ダイアログをその requesttraversable for user prompts に表示可能にする。

      2. それ以外の場合、network error を返す。

      requestbody(ここでは body と呼ぶ)を送信するには、次の手順を実行する:

      1. もし body が null で、かつ fetchParamsprocess request end-of-body が non-null なら、queue a fetch task して fetchParams の同名の処理を fetchParamstask destination で実行する。

      2. それ以外で body が non-null の場合:

        1. processBodyChunkbytes を受け取る)を次の手順として定義する:

          1. もし fetchParamscanceled なら、これらの手順を中止する。

          2. このステップを in parallel で実行する:bytes を送信する。

          3. もし fetchParamsprocess request body chunk length が non-null なら、fetchParams の同名の処理を byteslength を与えて実行する。

        2. processEndOfBody を次の手順として定義する:

          1. もし fetchParamscanceled なら、中止する。

          2. もし fetchParamsprocess request end-of-body が non-null なら、それを実行する。

        3. processBodyError(引数 e)を次の手順として定義する:

          1. もし fetchParamscanceled なら中止する。

          2. もし e が "AbortError" DOMException であれば、abortfetchParamscontroller を中断する。

          3. それ以外の場合は、terminatefetchParamscontroller を終了する。

        4. Incrementally read を使って、requestbodyprocessBodyChunkprocessEndOfBodyprocessBodyError、および fetchParamstask destination を与えて逐次的に読み取る。

  9. If aborted なら、次を実行する:

    1. もし connection が HTTP/2 を使用しているなら、RST_STREAM フレームを送信する。

    2. fetchParams に対する appropriate network error を返す。

  10. buffer を空の byte sequence とする。

    これはユーザーエージェントのネットワークレイヤ内部の内部バッファを表す。

  11. stream を新しい ReadableStream とする。

  12. pullAlgorithm を次の手順とする:

    1. promise新しい Promise とする。

    2. 次の手順を 並行して 実行する:

      1. もし buffer のサイズがユーザーエージェントが選んだ下限より小さく、かつ 現在のフェッチが suspended であるなら、フェッチを resume する。

      2. buffer が空でなくなるまで待つ。

      3. Queue a fetch task して、以下を fetchParamstask destination で実行する。

        1. Pull from bytesbuffer から stream にデータを引き出す。

        2. もし streamerrored なら、terminatefetchParamscontroller を終了する。

        3. Resolve promise を undefined で完了する。

    3. promise を返す。

  13. cancelAlgorithm を、与えられた reason に対して abort を行い fetchParamscontroller を中断するアルゴリズムとする。

  14. Set upstream をバイト読み取り対応でセットアップし、pullAlgorithmpullAlgorithmcancelAlgorithmcancelAlgorithm に設定する。

  15. responsebody を、新しい body に設定し、その streamstream にする。

  16. WebDriver BiDi ネットワークレスポンスボディ複製の手順を、 requestresponse で実行する。

  17. (This is a tracking vector.) もし includeCredentials が true なら、ユーザーエージェントは requestresponse を与えて レスポンスの `Set-Cookie` ヘッダをパースして保存 すべきである。

  18. 次の手順を 並行して 実行する:

    1. 次の手順を実行する。ただし abort when fetchParamscanceled の場合は中止する:

      1. 繰り返し実行する:

        1. もし response のメッセージ本文から 1 バイト以上が送信されているなら:

          1. bytes を送信されたバイトとする。

          2. codings を、`Content-Encoding` と responseheader list から header list values を抽出 した結果とする。

          3. filteredCoding を "@unknown" にする。

          4. もし codings が null または failure なら filteredCoding を空文字にする。

          5. そうでなく、かつ codingssize が 1 より大きければ、filteredCoding を "multiple" にする。

          6. それ以外で、もし codings[0] が空文字、またはユーザーエージェントがサポートしており、かつ バイトケース非区別 な比較で HTTP Content Coding Registry に記載されたエントリに一致するなら、filteredCodingbyte-lowercasing を行った codings[0] にする。[IANA-HTTP-PARAMS]

          7. responsebody infocontent encodingfilteredCoding に設定する。

          8. responsebody infoencoded sizebyteslength だけ増やす。

          9. bytes を、handle content codingscodings と共に与えて処理した結果にする。

            これにより `Content-Length` ヘッダの信頼性が、元々の信頼性に応じて損なわれる可能性がある。

          10. responsebody infodecoded sizebyteslength だけ増やす。

          11. もし bytes が failure なら、terminatefetchParamscontroller を終了する。

          12. bytesbuffer に追記する。

          13. もし buffer のサイズがユーザーエージェントが選んだ上限より大きければ、ユーザーエージェントに継続中のフェッチを suspend するよう要求する。

        2. それ以外で、もし response のメッセージ本文のバイト送信が正常に完了しており、かつ streamreadable なら、closestream を閉じ、これらの並行ステップを中止する。

    2. If aborted なら、次を実行する:

      1. もし fetchParamsaborted なら、次を実行する:

        1. responseaborted flag を設定する。

        2. もし streamreadable なら、errorstream を、fetchParamscontrollerserialized abort reasondeserialize a serialized abort reason に渡した結果と実装定義の realm を用いてエラー化する。

      2. それ以外で、もし streamreadable なら、errorstream を TypeError にする。

      3. もし connection が HTTP/2 を使用しているなら、RST_STREAM フレームを送信する。

      4. それ以外の場合、パフォーマンス上問題がない限りユーザーエージェントは connection を閉じるべきである。

        例えば、再利用可能な接続で残りの転送がごく少量とわかっている場合、接続を閉じて次のフェッチでハンドシェイクをやり直すよりも、接続を開いたままにしておくほうが良いことがある。

    これらは並行して実行される。現時点では responsebody が関連するかどうか不明(response がリダイレクトである可能性がある)ためである。

  19. response を返す。通常、responsebodystream は返却後もエンキューされ続ける。

4.8. CORSプリフライトフェッチ

これは実質的に、CORSプロトコルが理解されているかどうかを確認するためのユーザーエージェント実装である。いわゆるCORSプリフライトリクエスト。成功すると、CORSプリフライトキャッシュに登録され、このフェッチの回数を最小限に抑える。

リクエスト requestが与えられたとき、 CORS-preflight fetchするには、次の手順を実行する:

  1. preflightを、新しいリクエストとする。その methodは `OPTIONS`、 URL listrequestURL listクローンinitiatorrequestinitiatordestinationrequestdestinationoriginrequestoriginreferrerrequestreferrerreferrer policyrequestreferrer policymodeは "cors"、 response taintingは "cors"、かつ WebDriver idrequestWebDriver idである。

    preflightservice-workers modeは問題にならない。 このアルゴリズムはHTTP fetchではなく、HTTP-network-or-cache fetchを用いるためである。

  2. (`Accept`、 `*/*`) を preflightheader list付加する

  3. (`Access-Control-Request-Method`、 requestmethod) をpreflightheader list付加する

  4. headersを、 requestheader listを用いた CORS-unsafe request-header namesとする。

  5. headers空でないなら:

    1. valueを、headers内の項目を互いに `,` で区切ったものとする。

    2. (`Access-Control-Request-Headers`、 value) を preflightheader list付加する

    これは意図的にcombineを用いない。 0x2Cの後に0x20を置くことは、良くも悪くも、これが実装されてきた方法ではないためである。

  6. responseを、preflightrequestとする新しいfetch paramsが 与えられたものとして、HTTP-network-or-cache fetchを実行した結果とする。

  7. requestおよびresponseについてのCORS checkがsuccessを返し、かつ responsestatusok statusであるなら:

    CORS checkは、正しいcredentials modeが用いられることを保証するため、 preflightではなくrequestに対して行われる。

    1. methodsを、 `Access-Control-Allow-Methods` およびresponseheader listが与えられたものとして、 header list valuesを抽出する結果とする。

    2. headerNamesを、 `Access-Control-Allow-Headers` およびresponseheader listが与えられたものとして、 header list valuesを抽出する結果とする。

    3. methodsまたはheaderNamesのいずれかがfailureであるなら、 ネットワークエラーを返す。

    4. methodsがnullであり、かつrequestuse-CORS-preflight flag が設定されているなら、methodsrequestmethodを含む新しいリストに設定する。

      これにより、 requestuse-CORS-preflight flagが設定されていることによって発生したCORS-preflight fetchキャッシュされることを保証する。

    5. requestmethodmethods内になく、 requestmethodCORS-safelisted methodでなく、かつ requestcredentials modeが "include" であるか、または methodsが `*` を含まないなら、ネットワークエラーを返す。

    6. requestheader listnamesの1つがCORS non-wildcard request-header nameであり、かつheaderNames内の項目に対するバイト大小無視一致でないなら、 ネットワークエラーを返す。

    7. requestheader listを用いた CORS-unsafe request-header namesの各 unsafeNameについて、unsafeNameheaderNames内の項目に対するバイト大小無視 一致でなく、かつrequestcredentials modeが "include" であるか、またはheaderNamesが `*` を含まないなら、ネットワークエラーを返す。

    8. max-ageを、 `Access-Control-Max-Age` およびresponseheader listが与えられたものとして、 header list valuesを抽出する結果とする。

    9. max-ageがfailureまたはnullであるなら、max-ageを5に設定する。

    10. max-agemax-ageに課される制限を超えるなら、max-ageを その課される制限に設定する。

    11. ユーザーエージェントがcacheを提供しないなら、 responseを返す。

    12. methods内の各methodのうち、 requestを用いるmethod cache entry matchが存在するものについて、 一致するエントリーの max-agemax-ageに設定する。

    13. methods内の各methodのうち、 requestを用いる method cache entry matchが存在しないものについて、 requestmax-agemethod、およびnullを用いて 新しいキャッシュエントリーを作成する

    14. headerNames内の各headerNameのうち、 requestを用いる header-name cache entry matchが存在するものについて、 一致するエントリーの max-agemax-ageに設定する。

    15. headerNames内の各headerNameのうち、 requestを用いる header-name cache entry matchが存在しないものについて、 requestmax-age、null、およびheaderNameを用いて 新しいキャッシュエントリーを作成する

    16. responseを返す。

  8. そうでない場合、ネットワークエラーを返す。

4.9. CORSプリフライトキャッシュ

ユーザーエージェントには CORSプレフライトキャッシュ が関連付けられている。 CORSプレフライトキャッシュリスト であり、 キャッシュエントリ のリストである。

キャッシュエントリ は次から成る:

キャッシュエントリmax-age フィールドに指定された秒数が 記録から経過した後、削除されなければならない。キャッシュエントリ は それ以前にも削除されてもよい。

新しいキャッシュエントリを作成するには、 requestmax-agemethodheaderName を与えて次の手順を実行する:

  1. entryキャッシュエントリ とし、以下のように初期化する:

    キー

    ネットワークパーティションキーを決定するrequest による結果

    バイト列化されたオリジン

    リクエストオリジンのバイト列化request で実行した結果

    URL

    requestcurrent URL

    max-age

    max-age

    クレデンシャル

    requestcredentials mode が "include" の場合 true、 それ以外は false

    メソッド

    method

    ヘッダー名

    headerName

  2. entry をユーザーエージェントの CORSプレフライトキャッシュ に追加する。

キャッシュエントリを消去するには、request を与え、 ユーザーエージェントの CORSプレフライトキャッシュ 内の キャッシュエントリ で、 keyrequest でネットワークパーティションキーを決定 した結果と一致し、 バイト列化されたオリジンrequest でリクエストオリジンのバイト列化 の結果と一致し、 URLrequestcurrent URL であるエントリを 削除 する。

キャッシュエントリ entryrequest一致するとは、 entrykeyrequest でネットワークパーティションキーを決定 した結果と一致し、 entryバイト列化されたオリジンrequest でリクエストオリジンのバイト列化 の結果と一致し、 entryURLrequestcurrent URL であり、さらに以下のいずれかが成り立つ場合を指す。

が真である。

メソッドキャッシュエントリが一致する とは、methodrequest を与えたとき、 ユーザーエージェントの CORSプレフライトキャッシュ 内に request との キャッシュエントリの一致 があり、 その メソッドmethod または `*` である キャッシュエントリ が存在することである。

ヘッダー名キャッシュエントリが一致する とは、 headerNamerequest を与えたとき、 ユーザーエージェントの CORSプレフライトキャッシュ 内の キャッシュエントリrequest との キャッシュエントリの一致 があり、次のいずれかが成り立つときである:

が真である。

4.10. CORSチェック

CORSチェックrequestresponse で実行するには、以下の手順を行う:

  1. originresponseheader list から `Access-Control-Allow-Origin` を 取得した結果とする。

  2. origin が null なら failure を返す。

    null は `null` とは異なる。

  3. requestcredentials mode が "include" でなく、かつ origin が `*` の場合、success を返す。

  4. request に対して リクエストオリジンのバイト列化 を実行した結果が origin でなければ failure を返す。

  5. requestcredentials mode が "include" でなければ success を返す。

  6. credentialsresponseheader list から `Access-Control-Allow-Credentials` を 取得した結果とする。

  7. credentials が `true` なら success を返す。

  8. failure を返す。

4.11. TAOチェック

requestresponse に対して TAO チェック を実行するには、次の手順を行う:

  1. アサートrequestorigin は "client" であってはならない。

  2. もし requesttiming allow failed flag がセットされているなら、失敗を返す。

  3. values を、`Timing-Allow-Origin` を取得・デコード・分割responseheader list に対して行った結果とする。

  4. もし values"*" を含む なら、成功を返す。

  5. もし values含む 場合、 request オリジンをシリアライズした結果request を用いて)を、 成功を返す。

  6. もし requestmode が "navigate" であり、 requestcurrent URLoriginrequestorigin同一生成元でないなら、失敗を返す。

    これは入れ子 navigable のナビゲーションのために必要です。 この場合 requestorigin はコンテナドキュメントの origin となり、 TAO チェック は失敗を返すことになる。 ナビゲーションタイミングは TAO チェック の結果を検証しないため、 入れ子のドキュメントにはタイミング情報すべてにアクセス可能だが、 コンテナドキュメントには与えられない。

  7. もし requestresponse tainting が "basic" なら、成功を返す。

  8. 失敗を返す。

リクエスト requestおよびレスポンス responseが与えられたとき、 リクエストのナビゲーション タイミング許可値リストに付加するには:

  1. Assert: requestナビゲーションリクエストである。

  2. taoValuesを、 responseheader listから `Timing-Allow-Origin` を 取得し、デコードし、分割する結果とする。

  3. taoValuesがnullなら、taoValuesを « » に設定する。

  4. taoValuesrequestナビゲーションタイミング許可値 リスト付加する

レスポンス responseおよびオリジン destinationOriginについて、 navigation TAO checkを実行するには:

  1. responseナビゲーションタイミング許可値 リストの各taoValuesについて反復する

    1. taoValuesが "*" を含むなら、 continueする。

    2. taoValuesが、直列化されたdestinationOrigin含むなら、continueする。

    3. failureを返す。

  2. successを返す。

4.12. 遅延フェッチ

遅延フェッチは、呼出し元が可能な限り遅いタイミング、すなわちフェッチグループ終了する時や タイムアウト後などにフェッチを行うよう要求できるようにする。

遅延フェッチタスクソースは、 遅延フェッチの結果を更新するために使われる タスクソース である。ユーザーエージェントはこの タスクソース のタスクを、他のタスクソース、 特にDOM操作タスクソースなどスクリプトの実行につながる タスクソースよりも優先して処理しなければならない。これは fetchLater() の呼び出しの最新状態が、依存するかもしれないスクリプトより前に反映されるようにするためである。

リクエスト request、nullまたは DOMHighResTimeStamp activateAfter、および引数を取らないアルゴリズムである onActivatedWithoutTerminationが与えられたとき、 遅延fetchを キューに入れるには:

  1. requestが与えられたものとして、クライアントからリクエストを設定する

  2. requestservice-workers modeを "none" に設定する。

  3. requestkeepaliveをtrueに設定する。

  4. deferredRecordを、新しい遅延fetchレコードとする。その requestrequestであり、その notify invokedonActivatedWithoutTerminationである。

  5. deferredRecordを、requestclientfetch group遅延fetchレコード付加する

  6. activateAfterが非nullなら、次の手順を並列に実行する:

    1. ユーザーエージェントは、次の条件のいずれかが満たされるまで待機すべきである:

      • 少なくともactivateAfterミリ秒が経過した。

      • ユーザーエージェントが、スクリプトを実行する機会を失いそうだと信じる理由を持つ。 たとえば、ブラウザーがバックグラウンドに移動されたとき、または requestclientグローバルオブジェクトWindow オブジェクトであり、その 関連文書が長期間 "hidden" visibility stateであった場合である。

    2. deferredRecord処理する

  7. deferredRecordを返す。

リクエスト request合計 リクエスト長を計算するには:

  1. totalRequestLengthを、requestURLを、 exclude fragmentをtrueに設定して 直列化したものの 長さとする。

  2. totalRequestLengthを、 直列化されたrequestreferrer長さだけ 増加させる。

  3. requestheader listの 各(name, value)について反復しtotalRequestLengthname長さ + value長さだけ増加させる。

  4. totalRequestLengthを、requestbodylengthだけ増加させる。

  5. totalRequestLengthを返す。

fetch group fetchGroupが与えられたとき、 遅延 fetchを処理するには:

  1. fetchGroup遅延fetchレコードの各 遅延fetchレコード deferredRecordについて反復しdeferredRecordについて遅延fetchを処理する

deferredRecordについて 遅延 fetchを処理するには:

  1. deferredRecordinvoke stateが "pending" でないなら、戻る。

  2. deferredRecordinvoke stateを "sent" に設定する。

  3. deferredRecordrequestfetchする。

  4. deferredRecordrequestclientグローバルオブジェクトを用いて、 deferredRecordnotify invokedを実行するため、 グローバルタスクをキューに入れる。これは遅延fetch タスクソース上で行う。

4.12.1. 遅延フェッチのクォータ

この節は規範的ではありません。

遅延フェッチクォータは、トップレベルトラバーサブル(「タブ」)ごとに640キビバイト割り当てられます。 トップレベル文書と同一オリジンの直接ネスト文書はこのクォータを使って遅延フェッチをキューしたり、パーミッションポリシーを使って一部をクロスオリジンのネスト文書に委譲したりできます。

デフォルトでは、640キビバイトのうち128キビバイトがクロスオリジンのネスト文書への委譲に割り当てられ、各文書は8キビバイトを予約します。

トップレベルのdocumentおよびそのネスト文書は、パーミッションポリシーを使って自身のクォータのうちどれだけをクロスオリジンの子文書に委譲するかを制御できます。デフォルトでは、 "deferred-fetch-minimal" ポリシーは任意のオリジンに対して有効、 "deferred-fetch" はトップレベル文書のオリジンだけに有効です。特定のオリジンやネスト文書に対して "deferred-fetch" ポリシーを緩和すれば、そのネスト文書に64キビバイトを割り当てられます。同様に "deferred-fetch-minimal" ポリシーを特定のオリジンやネスト文書に対して制限すれば、その文書がデフォルトで受け取る8キビバイト予約を防ぐことができます。トップレベル文書自身に "deferred-fetch-minimal" ポリシーを無効化すれば、128キビバイトの委譲クォータがメインプール(640キビバイト)に戻されます。

あるdocumentに割り当てられたクォータのうち、同じレポートオリジン(requestURLorigin)に同時に使えるのは64キビバイトだけです。これにより、特定のサードパーティーライブラリがデータ送信前に機会的にクォータを予約してしまう事態を防げます。

以下のいずれかのfetchLater()呼び出しは、リクエスト自体がレポートオリジンに割り当てられた64キビバイトクォータを超えるためthrowされます。リクエストのサイズはURL自体、bodyheader listreferrerを含みます。

fetchLater(a_72_kb_url);
fetchLater("https://origin.example.com", {headers: headers_exceeding_64kb});
fetchLater(a_32_kb_url, {headers: headers_exceeding_32kb});
fetchLater("https://origin.example.com", {method: "POST", body: body_exceeding_64_kb});
fetchLater(a_62_kb_url /* with a 3kb referrer */);

次のシーケンスでは、最初の2つのリクエストは成功しますが、3つ目はthrowされます。最初の2回の呼び出しでは全体の640キビバイトクォータは超えていませんが、3つ目のリクエストはhttps://a.example.comのレポートオリジンクォータを超えるためthrowされます。

fetchLater("https://a.example.com", {method: "POST", body: a_64kb_body});
fetchLater("https://b.example.com", {method: "POST", body: a_64kb_body});
fetchLater("https://a.example.com");

同一オリジンのネスト文書は親のクォータを共有します。しかし、クロスオリジンやクロスエージェントiframeはデフォルトで8キビバイトしか割り当てられません。従って、以下の例では最初の3回の呼び出しは成功し、最後はthrowされます。

// メインページ内
fetchLater("https://a.example.com", {method: "POST", body: a_64kb_body});

// 同一オリジンのネスト文書内
fetchLater("https://b.example.com", {method: "POST", body: a_64kb_body});

// https://fratop.example.com のクロスオリジンネスト文書内
fetchLater("https://a.example.com", {body: a_5kb_body});
fetchLater("https://a.example.com", {body: a_12kb_body});

前述の例でthrowされないようにするには、トップレベル文書が例えば以下のヘッダーを送信してhttps://fratop.example.comへクォータを委譲します:

Permissions-Policy: deferred-fetch=(self "https://fratop.example.com")

各ネスト文書は自身のクォータを予約します。したがって、下記のように各フレームが8キビバイトずつ予約するため動作します:

// https://fratop.example.com/frame-1 のクロスオリジンネスト文書内
fetchLater("https://a.example.com", {body: a_6kb_body});

// https://fratop.example.com/frame-2 のクロスオリジンネスト文書内
fetchLater("https://a.example.com", {body: a_6kb_body});

以下のツリーは異なるネスト文書にクォータがどのように分配されるかを示します:

上記の例では、トップレベル遷移可能とその同一オリジンの子孫は384キビバイトのクォータを共有します。その値は以下のように計算されます:

この仕様は、文字列"deferred-fetch"で識別されるポリシー制御機能を定義します。そのデフォルト許可リストは"self"です。

この仕様は、文字列"deferred-fetch-minimal"で識別されるポリシー制御機能を定義します。そのデフォルト許可リストは"*"です。

deferred-fetch-minimal用に予約されたクォータは128キビバイトです。

ナビゲーション可能コンテナは関連付けられた数値遅延フェッチ用予約クォータを持ちます。その値はミニマルクォータ(8キビバイト)、ノーマルクォータ(0または64キビバイト)。特に記載がない場合は0です。

利用可能な遅延フェッチクォータ を、document document と、origin-または-null の origin を指定して取得するには:

  1. controlDocumentdocument遅延フェッチ制御文書を設定する。

  2. navigablecontrolDocumentノード遷移可能を設定する。

  3. isTopLevelcontrolDocumentノード遷移可能トップレベル遷移可能ならtrue、そうでなければfalseを設定する。

  4. deferredFetchAllowedcontrolDocumentが"deferred-fetch"ポリシー制御機能の利用を許可されていればtrue、そうでなければfalseを設定する。

  5. deferredFetchMinimalAllowedcontrolDocumentが"deferred-fetch-minimal"ポリシー制御機能の利用を許可されていればtrue、そうでなければfalseを設定する。

  6. quotaに最初に一致する条件の結果を設定する:

    isTopLevelがtrueかつdeferredFetchAllowedがfalse
    0
    isTopLevelがtrueかつdeferredFetchMinimalAllowedがfalse

    640キビバイト

    640kbはみんなに十分なはずです。

    isTopLevelがtrue

    512キビバイト

    デフォルト640キビバイトからdeferred-fetch-minimal用予約クォータ分を減算した値

    deferredFetchAllowedがtrueかつnavigableナビゲーション可能コンテナ遅延フェッチ用予約クォータノーマルクォータ
    ノーマルクォータ
    deferredFetchMinimalAllowedがtrueかつnavigableナビゲーション可能コンテナ遅延フェッチ用予約クォータミニマルクォータ
    ミニマルクォータ
    それ以外
    0
  7. quotaForRequestOriginに64キビバイトを設定する。

  8. controlDocumentnode navigableinclusive descendant navigablesのうち、 そのactive documentdeferred-fetch control documentcontrolDocumentである各navigableについて反復する

    1. navigableactive documentshadow-including inclusive descendants内のnavigable containerである各containerについて反復しquotacontainerreserved deferred-fetch quotaだけ減少させる。

    2. navigableactive document関連設定オブジェクトfetch group遅延fetchレコード内の各遅延fetch レコード deferredRecordについて反復する

      1. deferredRecordinvoke state が "pending" でないなら、continueする。

      2. requestLengthを、 deferredRecordrequest合計リクエスト 長とする。

      3. quotarequestLengthだけ減少させる。

      4. deferredRecordrequestURLオリジンoriginsame originであるなら、 quotaForRequestOriginrequestLengthだけ減少させる。

  9. quotaが0以下なら0を返す。

  10. quotaquotaForRequestOrigin未満ならquotaを返す。

  11. quotaForRequestOriginを返す。

遅延フェッチクォータの予約は、ナビゲーション可能コンテナcontaineroriginoriginToNavigateToを指定して以下を実行します:

これはナビゲーション時、ナビゲーション元文書がnavigableの親文書である場合に呼ばれます。パーミッションポリシーで許可されていれば、コンテナおよびそのナビゲーション可能要素に最大64kbまたは8kbのクォータを予約します。予約されたクォータが実際に使われたかどうかはコンテナ文書から観測できません。このアルゴリズムは、コンテナの文書がナビゲート先コンテナにクォータを委譲する可能性があると仮定し、予約されたクォータはその場合のみ適用され、共有されることになった場合は無視されます。クォータが予約され、その文書が親と同一オリジンとなった場合、クォータは解放されます。

  1. container遅延フェッチ用予約クォータを0に設定する。

  2. controlDocumentcontainerノード文書遅延フェッチ制御文書を設定する。

  3. "deferred-fetch" の継承ポリシーcontainer, originToNavigateTo)が"Enabled"であり、controlDocument利用可能な遅延フェッチクォータノーマルクォータ以上であれば、container遅延フェッチ用予約クォータノーマルクォータに設定してreturnする。

  4. 以下すべてが真の場合:

    この場合、container遅延フェッチ用予約クォータミニマルクォータに設定する。

遅延フェッチクォータの解放(可能性あり)は、文書documentに対して、documentノード遷移可能コンテナ文書がnullでなく、かつそのorigindocument同一オリジンであれば、documentノード遷移可能navigable container遅延フェッチ用予約クォータを0に設定する。

これは文書が生成されたときに呼ばれます。同一オリジンのネスト文書は親クォータを共有するため予約しません。これは文書生成時のみ呼ばれ、originはリダイレクト処理後にのみ判明するためです。

遅延フェッチ制御文書の取得は、文書documentについて以下を実行する:

  1. documentノード遷移可能コンテナ文書がnullまたは、文書で、そのorigindocument同一オリジンでなければ、documentを返し、それ以外の場合はdocumentノード遷移可能コンテナ文書について再帰的に遅延フェッチ制御文書の取得を実行する。

5. Fetch API(フェッチAPI)

fetch()メソッドは、リソースの取得のための比較的低レベルなAPIです。現行標準ではXMLHttpRequestよりも少し広い範囲をカバーしますが、リクエスト進行状況(レスポンス進行状況ではなく)の点ではまだ不十分です。

fetch()メソッドは、リソースを取得してその内容をBlobとして抽出するのを非常に簡単にします:

fetch("/music/pk/altes-kamuffel.flac")
  .then(res => res.blob()).then(playBlob)

特定のレスポンスヘッダーだけを記録したい場合:

fetch("/", {method:"HEAD"})
  .then(res => log(res.headers.get("strict-transport-security")))

クロスオリジンリソースの特定のレスポンスヘッダーを確認し、そのあとレスポンスを処理したい場合:

fetch("https://pk.example/berlin-calling.json", {mode:"cors"})
  .then(res => {
    if(res.headers.get("content-type") &&
       res.headers.get("content-type").toLowerCase().indexOf("application/json") >= 0) {
      return res.json()
    } else {
      throw new TypeError()
    }
  }).then(processJSON)

URLクエリパラメータを扱いたい場合:

var url = new URL("https://geo.example.org/api"),
    params = {lat:35.696233, long:139.570431}
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]))
fetch(url).then(/* … */)

ボディデータを逐次受信したい場合:

function consume(reader) {
  var total = 0
  return pump()
  function pump() {
    return reader.read().then(({done, value}) => {
      if(done) {
        return
      }
      total += value.byteLength
      log(`received ${value.byteLength} bytes (${total} bytes in total)`)
      return pump()
    })
  }
}

fetch("/music/pk/altes-kamuffel.flac")
  .then(res => consume(res.body.getReader()))
  .then(() => log("全データをメモリに保持せずにボディ全体を消費しました!"))
  .catch(e => log("何か問題が発生しました: " + e))

5.1. Headersクラス

typedef (sequence<sequence<ByteString>> or record<ByteString, ByteString>) HeadersInit;

[Exposed=(Window,Worker)]
interface Headers {
  constructor(optional HeadersInit init);

  undefined append(ByteString name, ByteString value);
  undefined delete(ByteString name);
  ByteString? get(ByteString name);
  sequence<ByteString> getSetCookie();
  boolean has(ByteString name);
  undefined set(ByteString name, ByteString value);
  iterable<ByteString, ByteString>;
};

Headers オブジェクトは、 関連付けられた ヘッダーリストheader list)を持つ。 これは初期状態では空である。これは他のもの、例えば header listへのポインタでもよく、 Request オブジェクトの request の場合が例である。

Headersオブジェクトには、さらに関連付けられたガードheaders guard)があります。headers guardは、"immutable"、"request"、"request-no-cors"、"response"、"none"のいずれかです。


headers = new Headers([init])

新しいHeadersオブジェクトを生成します。initで内部のヘッダーリストを初期化できます(下記例参照)。

const meta = { "Content-Type": "text/xml", "Breaking-Bad": "<3" };
new Headers(meta);

// 上記と同等
const meta2 = [
  [ "Content-Type", "text/xml" ],
  [ "Breaking-Bad", "<3" ]
];
new Headers(meta2);
headers . append(name, value)

headersにヘッダーを追加します。

headers . delete(name)

headersからヘッダーを削除します。

headers . get(name)

nameと一致する全ヘッダー値を、カンマ+スペース区切りで文字列として返します。

headers . getSetCookie()

`Set-Cookie`名の全ヘッダー値リストを返します。

headers . has(name)

nameという名前のヘッダーが存在するかどうかを返します。

headers . set(name, value)

最初に一致したnameのヘッダー値をvalueに置換し、残りの同名ヘッダーは削除します。

for(const [name, value] of headers)

headersは反復処理可能です。


バリデートヘッダーname, value))をHeadersオブジェクトheadersに対して行うには:

  1. nameヘッダー名でない、またはvalueヘッダー値でない場合、TypeError例外を投げる。

  2. headersガードが"immutable"なら、TypeError例外を投げる。

  3. headersガードが"request"かつ(name, value)が禁止リクエストヘッダーなら、falseを返す。

  4. headersガードが"response"かつname禁止レスポンスヘッダー名なら、falseを返す。

  5. trueを返す。

"request-no-cors"の手順は共有されません。なぜならCORS安全リストリクエストヘッダーに対して常に成功する偽の値(delete()用)を持つことができないためです。

追加ヘッダーname, value))をHeadersオブジェクトheadersに対して行うには、以下を実行する:

  1. value正規化する。

  2. バリデートname, value)がheadersでfalseなら、returnする。

  3. headersガードが"request-no-cors"なら:

    1. temporaryValueheadersheader listからname取得した結果を設定する。

    2. temporaryValueがnullなら、temporaryValuevalueに設定する。

    3. それ以外の場合、temporaryValuetemporaryValue+「, 」+valueに設定する。

    4. name, temporaryValue)がno-CORS安全リストリクエストヘッダーでない場合、returnする。

  4. 追加name, value)をheadersheader listに対して実行する。

  5. headersガードが"request-no-cors"なら、特権no-CORSリクエストヘッダーの削除headersに対して実行する。

fillHeadersオブジェクトheaders、与えられたオブジェクトobject)は以下を実行する:

  1. objectsequenceなら、headerobjectの要素)について:

    1. headersizeが2でなければ、TypeError例外を投げる。

    2. 追加header[0], header[1])をheadersに対して実行する。

  2. それ以外の場合、objectrecordなら、keyvalueobjectの要素)について、追加key, value)をheadersに対して実行する。

特権no-CORSリクエストヘッダーの削除Headersオブジェクト(headers))は以下を実行する:

  1. headerName特権no-CORSリクエストヘッダー名)について:

    1. 削除headerName)をheadersheader listに対して実行する。

これは、特権のないコードによってヘッダーが変更された時に呼ばれます。

new Headers(init) コンストラクタの手順は次の通りです:

  1. thisガードを"none"に設定する。

  2. initが与えられていれば、fillthisinit)を実行する。

append(name, value) メソッドの手順は、追加name, value)をthisに対して行うこと。

delete(name)メソッドの手順は以下の通りです:

  1. バリデートname, ``)がthisでfalseなら、returnする。

    ダミーのヘッダー値を渡しても悪影響はありません。

  2. thisガードが"request-no-cors"、かつnameno-CORS安全リストリクエストヘッダー名でも特権no-CORSリクエストヘッダー名でもない場合、returnする。

  3. thisheader listname含まない場合、returnする。

  4. 削除name)をthisheader listに対して実行する。

  5. thisガードが"request-no-cors"なら、特権no-CORSリクエストヘッダーの削除thisに対して実行する。

get(name)メソッドの手順は以下の通りです:

  1. nameヘッダー名でない場合、TypeError例外を投げる。

  2. name取得thisheader listから)し、その結果を返す。

getSetCookie()メソッドの手順は以下の通りです:

  1. thisheader listが`Set-Cookie`を含まない場合、« »を返す。

  2. thisheader listのうち、nameが`Set-Cookie`とバイト大文字小文字無視で一致するヘッダー)の値を順序通り返す。

has(name)メソッドの手順は以下の通りです:

  1. nameヘッダー名でない場合、TypeError例外を投げる。

  2. thisheader listname含むならtrue、そうでなければfalseを返す。

set(name, value) メソッドの手順は以下の通りです:

  1. value正規化する。

  2. バリデートname, value)がthisでfalseなら、returnする。

  3. thisガードが"request-no-cors"かつ(name, value)がno-CORS安全リストリクエストヘッダーでない場合、returnする。

  4. セットname, value)をthisheader listに対して実行する。

  5. thisガードが"request-no-cors"なら、特権no-CORSリクエストヘッダーの削除thisに対して実行する。

反復対象の値ペアは、ソートおよび結合thisheader list)の実行結果です。

5.2. BodyInit ユニオン型

typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) XMLHttpRequestBodyInit;

typedef (ReadableStream or XMLHttpRequestBodyInit) BodyInit;

安全抽出は、型付きbodyバイト列またはBodyInitオブジェクトobjectから抽出するための手順です:

  1. objectReadableStream オブジェクトなら:

    1. アサートobjectdisturbedでもlockedでもないこと。

  2. extractobject)の結果を返す。

安全抽出操作は、例外を投げないことが保証されるextract操作のサブセットです。

extractは、 型付きbodyバイト列またはBodyInitオブジェクトobjectから抽出するための手順です。オプションのブール値 keepalive(デフォルトfalse)を受け取ります:

  1. streamをnullに設定する。

  2. objectReadableStream オブジェクトなら、streamobjectを設定する。

  3. それ以外でobjectBlob オブジェクトなら、streamobjectget streamの結果を設定する。

  4. それ以外の場合、streamに新しいReadableStreamオブジェクトを設定し、 バイト読み取り対応でセットアップする。

  5. アサートstreamReadableStreamオブジェクトであること。

  6. actionをnullに設定する。

  7. sourceをnullに設定する。

  8. lengthをnullに設定する。

  9. typeをnullに設定する。

  10. objectの型によって分岐:

    Blob

    sourceobjectを設定する。

    lengthobjectsize属性値を設定する。

    objecttype属性値が空でなければ、typeにその値を設定する。

    バイト列

    sourceobjectを設定する。

    BufferSource

    sourceobjectが保持するバイトのコピーを設定する。

    FormData

    actionに次の手順:multipart/form-dataエンコーディングアルゴリズムobjectentry listUTF-8で実行する、を設定する。

    sourceobjectを設定する。

    length未確定、詳細は html/6424参照を設定する。

    typeに`multipart/form-data; boundary=`+multipart/form-data境界文字列multipart/form-dataエンコーディングアルゴリズムで生成)を設定する。

    URLSearchParams

    sourceapplication/x-www-form-urlencodedシリアライザobjectlistを使う)を実行した結果を設定する。

    typeに`application/x-www-form-urlencoded;charset=UTF-8`を設定する。

    スカラー値文字列

    sourceUTF-8エンコードobject)の結果を設定する。

    typeに`text/plain;charset=UTF-8`を設定する。

    ReadableStream

    keepaliveがtrueなら、TypeError例外を投げる。

    objectdisturbedまたはlockedなら、TypeError例外を投げる。

  11. sourceバイト列なら、actionに「sourceを返す」手順を設定し、lengthsourcelengthを設定する。

  12. actionがnullでなければ、以下の手順を並列で実行する:

    1. actionを実行する。

      バイトが1つ以上利用可能になり、かつstreamerroredでなければ、enqueue(利用可能なバイトからUint8Arrayを生成した結果、stream)を行う。

      actionが終了したら、closestream)を行う。

  13. bodybodystream: stream, source: source, length: length)を設定する。

  14. (body, type) を返す。

5.3. Bodyミックスイン

interface mixin Body {
  readonly attribute ReadableStream? body;
  readonly attribute boolean bodyUsed;
  [NewObject] Promise<ArrayBuffer> arrayBuffer();
  [NewObject] Promise<Blob> blob();
  [NewObject] Promise<Uint8Array> bytes();
  [NewObject] Promise<FormData> formData();
  [NewObject] Promise<any> json();
  [NewObject] Promise<USVString> text();
  [NewObject] ReadableStream textStream();
};

ネットワーク層が依存してほしくない形式、例えばHTMLなどはここで公開されることはありません。そうした形式は、将来的にHTMLパーサAPIがストリームを受け入れるようになる可能性があります。

Bodyインターフェースミックスインを含むオブジェクトは、関連付けられたbody(nullまたはbody)を持ちます。

Body インターフェースミックスインを含むオブジェクトは、 その body が null でなく、 かつその bodystream乱された または ロック済み の場合、 使用不可 であると言う。


requestOrResponse . body

requestOrResponse の本体を ReadableStream として返す。

requestOrResponse . bodyUsed

requestOrResponse の本体が読み取られたかどうかを返す。

requestOrResponse . arrayBuffer()

requestOrResponse の本体を ArrayBuffer として満たされる promise を返す。

requestOrResponse . blob()

requestOrResponse の本体を Blob として満たされる promise を返す。

requestOrResponse . bytes()

requestOrResponse の本体を Uint8Array として満たされる promise を返す。

requestOrResponse . formData()

requestOrResponse の本体を FormData として満たされる promise を返す。

requestOrResponse . json()

requestOrResponse の本体を JSON として解析したもので満たされる promise を返す。

requestOrResponse . text()

requestOrResponse の本体を文字列として満たされる promise を返す。

requestOrResponse . textStream()

ReadableStream オブジェクトを返し、その中で requestOrResponse の本体は文字列チャンクとして扱われる。


MIMEタイプ取得は、RequestまたはResponseオブジェクトrequestOrResponseに対して以下を実行します:

  1. headersをnullに設定する。

  2. requestOrResponseRequestオブジェクトなら、headersrequestOrResponserequestheader listを設定する。

  3. それ以外の場合、headersrequestOrResponseresponseheader listを設定する。

  4. mimeTypeMIMEタイプ抽出headers)の結果を設定する。

  5. mimeTypeが失敗ならnullを返す。

  6. mimeTypeを返す。

bodygetterの手順は、thisbodyがnullならnullを返し、そうでなければthisbodystreamを返すこと。

bodyUsedgetterの手順は、thisbodyがnullでなく、かつthisbodystreamdisturbedならtrue、そうでなければfalseを返すこと。

consume body アルゴリズムは、Bodyを含むオブジェクトobjectと、バイト列を受け取りJavaScript値を返す(または例外を投げる)アルゴリズムconvertBytesToJSValueを受け取り、以下を実行します:

  1. object使用不可なら、TypeErrorでrejectされたpromiseを返す。

  2. promise新しいpromiseを設定する。

  3. errorStepserror)にpromiseerrorrejectする手順を設定する。
  4. successStepsバイト列data)にpromiseconvertBytesToJSValuedata)の結果でresolveする手順(例外ならerrorStepsを実行)を設定する。
  5. objectbodyがnullなら、空のバイト列successStepsを実行する。

  6. それ以外なら、完全に読み取るobjectbodysuccessStepserrorStepsobject関連グローバルオブジェクト)を実行する。

  7. promiseを返す。

arrayBuffer() メソッドのステップは、consume bodythis で実行し、次のステップで指定される バイト列 bytes を受け取った場合: thisrelevant realmbytes から ArrayBuffer を生成する処理の結果を返す。

上記のメソッドは RangeError によりリジェクトされる場合がある。

blob() メソッドのステップは、consume bodythis で実行し、次のステップで指定される バイト列 bytes を受け取った場合:内容が bytes であり、その type 属性が this で MIME タイプを取得 した結果である Blob を返す。

bytes() メソッドのステップは、consume bodythis で実行し、次のステップで指定される バイト列 bytes を受け取った場合: thisrelevant realmbytes から Uint8Array を生成する処理の結果を返す。

上記のメソッドは RangeError によりリジェクトされる場合がある。

formData() メソッドのステップは、consume bodythis で実行し、次のステップで指定される バイト列 bytes を受け取った場合:

  1. mimeTypethis で MIME タイプを取得 した結果とする。

  2. mimeType が null でなければ、その mimeTypeエッセンス により次の処理に分岐して実行:

    "multipart/form-data"
    1. bytesmimeType の `boundary` パラメータ値を用いて Returning Values from Forms: multipart/form-data にしたがってパースする。 [RFC7578]

      `Content-Disposition` ヘッダーに `filename` パラメータが含まれる各パートは、 その内容を値とし entry にパースする。その値は内容であり、 File オブジェクトとして生成される。 name 属性はそのパートの `filename` パラメータの値とし、 type 属性はそのパートの `Content-Type` ヘッダーの値(ヘッダーがなければ `text/plain`)にする。

      `Content-Disposition` ヘッダーに `filename` パラメータが 含まれない各パートは、その内容を UTF-8(BOMなしで)でデコードして entry にパースする。 これは `Content-Type` ヘッダーや `charset` パラメータの有無や値にかかわらず行われる。

      `Content-Disposition` ヘッダーの `name` パラメータ値が `_charset_` であっても 他と同様にパースされ、エンコーディングの変更にはならない。

    2. なんらかの理由で失敗した場合は TypeError をスローする。

    3. パース結果のすべての entryentry list に追加して 新しい FormData オブジェクトを返す。

    上記は `multipart/form-data` 向けの大まかな記述であり、 より詳細なパース仕様は今後記載される予定。 ボランティア歓迎。

    "application/x-www-form-urlencoded"
    1. entries を、bytes をパースした結果とする。

    2. entriesentry list とした 新しい FormData オブジェクトを返す。

  3. TypeError をスローする。

json() メソッドのステップは、consume bodythis で実行し、 bytes から JSON をパース する。

上記メソッドは SyntaxError でリジェクトされる場合がある。

text() メソッドのステップは、consume bodythis で実行し、 UTF-8 デコード する。

textStream() メソッドの手順は次のとおりです:

  1. this使用不能 である場合、TypeError を投げる。

  2. thisbody が null である場合:

    1. emptyStream を、this関連レルム における新しい ReadableStream とする。

    2. emptyStream設定する

    3. emptyStream閉じる

    4. emptyStream を返す。

  3. stream を、thisbodystream とする。

  4. decoder を、this関連レルム における新しい TextDecoderStream オブジェクトとする。

  5. decoderUTF-8設定する

    これは、`Content-Type` ヘッダーの有無や値に関係なく、 また `charset` パラメーターの有無や値に関係なく行われる。

  6. streamdecoderパイプスルー した結果を返す。

5.4. Requestクラス

typedef (Request or USVString) RequestInfo;

[Exposed=(Window,Worker)]
interface Request {
  constructor(RequestInfo input, optional RequestInit init = {});

  readonly attribute ByteString method;
  readonly attribute USVString url;
  [SameObject] readonly attribute Headers headers;

  readonly attribute RequestDestination destination;
  readonly attribute USVString referrer;
  readonly attribute ReferrerPolicy referrerPolicy;
  readonly attribute RequestMode mode;
  readonly attribute RequestCredentials credentials;
  readonly attribute RequestCache cache;
  readonly attribute RequestRedirect redirect;
  readonly attribute DOMString integrity;
  readonly attribute boolean keepalive;
  readonly attribute boolean isReloadNavigation;
  readonly attribute boolean isHistoryNavigation;
  readonly attribute AbortSignal signal;
  readonly attribute RequestDuplex duplex;

  [NewObject] Request clone();
};
Request includes Body;

dictionary RequestInit {
  ByteString method;
  HeadersInit headers;
  BodyInit? body;
  USVString referrer;
  ReferrerPolicy referrerPolicy;
  RequestMode mode;
  RequestCredentials credentials;
  RequestCache cache;
  RequestRedirect redirect;
  DOMString integrity;
  boolean keepalive;
  AbortSignal? signal;
  RequestDuplex duplex;
  RequestPriority priority;
  any window; // can only be set to null
};

enum RequestDestination { "", "audio", "audioworklet", "document", "embed", "font", "frame", "iframe", "image", "json", "manifest", "object", "paintworklet", "report", "script", "sharedworker", "style", "text", "track", "video", "worker", "xslt" };
enum RequestMode { "navigate", "same-origin", "no-cors", "cors" };
enum RequestCredentials { "omit", "same-origin", "include" };
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
enum RequestRedirect { "follow", "error", "manual" };
enum RequestDuplex { "half" };
enum RequestPriority { "high", "low", "auto" };

"serviceworker" は、 RequestDestination から省略されています。なぜなら、これは JavaScript から観測できないためです。実装は、destination としてサポートする必要がありますが、"websocket" および "webtransport" は、RequestMode から省略されています。なぜなら、これらも JavaScript から使用または観測することができないためです。

Requestオブジェクトには関連付けられたrequestrequest)があります。

Requestオブジェクトには、関連付けられたheaders(nullまたはHeadersオブジェクト、初期値はnull)があります。

Requestオブジェクトには、関連付けられたsignal(nullまたはAbortSignalオブジェクト、初期値はnull)があります。

Requestオブジェクトのbodyは、そのrequestbodyです。


request = new Request(input [, init])

新しい request を返します。その url プロパティは、 input が文字列の場合は inputinputRequest オブジェクトの場合は その url となります。

init 引数は、以下のようなプロパティを持つオブジェクトです:

method
requestmethod を設定する文字列。
headers
Headers オブジェクト、オブジェクトリテラル、または2要素配列の配列で requestheaders を設定。
body
BodyInit オブジェクトまたは null を指定して requestbody を設定。
referrer
同一オリジンのURL、"about:client"、または空文字列を指定し、requestreferrer を設定。
referrerPolicy
referrer policy を指定し、requestreferrerPolicy を設定。
mode
CORS を使うか同一オリジンURLに限定するかを示す文字列を指定。 requestmode を設定。 input が文字列の場合はデフォルトで "cors" です。
credentials
クレデンシャルを常に/絶対に送信しない/同一オリジン時のみ送信するか(またレスポンスで受信したクレデンシャルを使うか)を示す文字列を指定。 requestcredentials を設定。 input が文字列の場合はデフォルトで "same-origin" です。
cache
フェッチ時にリクエストがブラウザキャッシュとどう連携するかを示す文字列で requestcache を設定。
redirect
リダイレクトを追随するか・エラーとするか・不透明で返すかを示す文字列で requestredirect を設定。
integrity
request で取得するリソースの暗号学的ハッシュ値を指定し、requestintegrity を設定。
keepalive
真偽値で requestkeepalive を設定。
signal
AbortSignal を指定して requestsignal を設定。
window
null のみ指定可。request を任意の Window から切り離す用途。
duplex
"half" のみ有効で、ハーフデュプレックス(リクエスト全体を送信後にレスポンスを処理)フェッチを行うための値。 "full" は将来のフルデュプレックスフェッチ用途で予約済み(リクエスト送信中にもレスポンス処理可)。 bodyReadableStream の場合はこれを指定。 "full" の定義は issue #1254 参照。
priority
requestpriority を設定する文字列。
request . method
request の HTTP メソッドを返します。デフォルトは "GET" です。
request . url
request の URL を文字列で返します。
request . headers
request に紐づく Headers オブジェクトを返します。 ユーザーエージェントがネットワーク層で追加するヘッダー(例:"Host" ヘッダーなど)はこのオブジェクトには含まれません。
request . destination
request が要求するリソース種別を返します(例:"document" や "script")。
request . referrer
request のリファラーを返します。 値は init で明示的に設定した同一オリジンURL、リファラーなしの場合は空文字列、デフォルト時は "about:client" となります。 これはフェッチ実行時の Referer ヘッダー値決定に用いられます。
request . referrerPolicy
request に紐付けられた referrer policy を返します。フェッチ時のリファラー計算に使用されます。
request . mode
request に紐付けられた mode を返します。CORS 利用有無や同一オリジン限定かを示す文字列です。
request . credentials
request に紐付けられた credentials mode を返します。クレデンシャル送信有無・条件を表す文字列です。
request . cache
requestcache mode を返します。フェッチ時のキャッシュ連携方法を示す文字列です。
request . redirect
request に関連付けられた リダイレクトモード を返す。 これはリクエストのリダイレクトがフェッチ中にどう扱われるかを示す文字列である。 リクエスト は デフォルトでリダイレクトに従う。
request . integrity
request のサブリソースインテグリティ(取得リソースの暗号学的ハッシュ値)を返します。 値はスペース区切りで複数のハッシュを持つことがあります。[SRI]
request . keepalive
request が作成元のグローバルより長生きできるかどうかの真偽値を返します。
request . isReloadNavigation
request がリロードナビゲーション用か否かの真偽値を返します。
request . isHistoryNavigation
request が履歴ナビゲーション用か(いわゆる戻る/進む)かの真偽値を返します。
request . signal
request に紐付けられた AbortSignal オブジェクトを返し、それに abort 済みか、および abort イベントハンドラも含みます。
request . duplex
"half" を返します。これは「ハーフデュプレックス」(リクエスト全体を先に送り、その後レスポンスを処理)であることを示します。 将来は "full"(リクエスト送信中にレスポンス処理可能)も返し得ます。"full" の定義は issue #1254 参照。
request . clone()

request のクローンを返します。


Requestオブジェクトの作成は、Request オブジェクトを、request requestheaders guard guardAbortSignal オブジェクトsignalrealm realmを指定して次の手順で作成します:

  1. requestObjectrealm新しいRequestオブジェクトを生成する。

  2. requestObjectrequestrequestに設定する。

  3. requestObjectheadersを、realm新しいHeadersオブジェクト(headers listrequestheaders listguardguard)に設定する。

  4. requestObjectsignalsignalに設定する。

  5. requestObjectを返す。


new Request(input, init) コンストラクターの手順は次のとおりです:

  1. request を null とする。

  2. fallbackMode を null とする。

  3. baseURL を、this関連設定オブジェクトAPI ベース URL とする。

  4. signal を null とする。

  5. input が文字列である場合:

    1. parsedURL を、baseURL を用いて input解析する結果とする。

    2. parsedURL が失敗である場合、TypeError投げる

    3. parsedURL資格情報を含む場合、 TypeError投げる

    4. request を、その URLparsedURL である新しい request に設定する。

    5. fallbackMode を "cors" に設定する。

  6. そうでなければ:

    1. 表明: inputRequest オブジェクトである。

    2. requestinputrequest に設定する。

    3. signalinputsignal に設定する。

  7. origin を、this関連設定オブジェクトorigin とする。

  8. traversableForUserPrompts を "client" とする。

  9. requestユーザープロンプト用の traversable環境設定オブジェクト であり、かつその originorigin同一オリジンである場合、traversableForUserPromptsrequestユーザープロンプト用の traversable に設定する。

  10. init["window"] が存在するかつ null でない場合、 TypeError投げる

  11. init["window"] が存在する場合、 traversableForUserPrompts を "no-traversable" に設定する。

  12. request を、次のプロパティを持つ新しい request に設定する:

    URL
    requestURL
    method
    requestmethod
    header list
    requestheader list のコピー。
    unsafe-request flag
    設定済み。
    client
    This関連設定オブジェクト
    traversable for user prompts
    traversableForUserPrompts
    internal priority
    requestinternal priority
    origin
    requestorigin origin の伝播は、サービスワーカーによって処理される ナビゲーションリクエストに対してのみ重要である。このシナリオでは、リクエストは現在の client とは異なる origin を持つことがある。
    referrer
    requestreferrer
    referrer policy
    requestreferrer policy
    mode
    requestmode
    credentials mode
    requestcredentials mode
    cache mode
    requestcache mode
    redirect mode
    requestredirect mode
    integrity metadata
    requestintegrity metadata
    keepalive
    requestkeepalive
    reload-navigation flag
    requestreload-navigation flag
    history-navigation flag
    requesthistory-navigation flag
    URL list
    requestURL listクローン
    initiator type
    "fetch"。
  13. init空でない場合:

    1. requestmode が "navigate" である場合、それを "same-origin" に設定する。

    2. requestreload-navigation flag を解除する。

    3. requesthistory-navigation flag を解除する。

    4. requestorigin を "client" に設定する。

    5. requestreferrer を "client" に設定する。

    6. requestreferrer policy を空文字列に設定する。

    7. requestURLrequestcurrent URL に設定する。

    8. requestURL list を « requestURL » に設定する。

    これは、サービスワーカーが、たとえばクロスオリジンのスタイルシート内の 画像からのリクエストを「リダイレクト」し、変更を加えたときに、それがもはや元のソース (すなわちクロスオリジンのスタイルシート)から来たようには見えず、代わりにそのリクエストを 「リダイレクト」したサービスワーカーから来たように見えるようにするために行われる。 元のソースは、サービスワーカーと同じ種類のリクエストすら生成できない可能性があるため、 これは重要である。したがって、これが行われなければ、元のソースを信頼するサービスが 悪用される可能性がある。ただし、それはいくぶん考えにくい。

  14. init["referrer"] が存在する場合:

    1. referrerinit["referrer"] とする。

    2. referrer が空文字列である場合、requestreferrer を "no-referrer" に設定する。

    3. そうでなければ:

      1. parsedReferrer を、baseURL を用いて referrer解析する結果とする。

      2. parsedReferrer が失敗である場合、TypeError投げる

      3. 次のいずれかが真である場合

        その場合、requestreferrer を "client" に設定する。

      4. そうでなければ、requestreferrerparsedReferrer に設定する。

  15. init["referrerPolicy"] が存在する場合、requestreferrer policy をそれに設定する。

  16. mode を、init["mode"] が存在する場合はそれとし、 そうでなければ fallbackMode とする。

  17. mode が "navigate" である場合、TypeError投げる

  18. mode が null でない場合、requestmodemode に設定する。

  19. init["credentials"] が存在する場合、 requestcredentials mode をそれに設定する。

  20. init["cache"] が存在する場合、 requestcache mode をそれに設定する。

  21. requestcache mode が "only-if-cached" であり、かつ requestmode が "same-origin" でない場合、 TypeError投げる

  22. init["redirect"] が存在する場合、 requestredirect mode をそれに設定する。

  23. init["integrity"] が存在する場合、 requestintegrity metadata をそれに設定する。

  24. init["keepalive"] が存在する場合、 requestkeepalive をそれに設定する。

  25. init["method"] が存在する場合:

    1. methodinit["method"] とする。

    2. methodmethod でない、または method禁止メソッドである場合、TypeError投げる

    3. method正規化する

    4. requestmethodmethod に設定する。

  26. init["signal"] が存在する場合、signal をそれに設定する。

  27. init["priority"] が存在する場合:

    1. requestinternal priority が null でない場合、 requestinternal priority実装定義の方法で更新する。

    2. そうでなければ、requestpriorityinit["priority"] に設定する。

  28. thisrequestrequest に設定する。

  29. signals を、signal が null でない場合は « signal » とし、 そうでなければ « » とする。

  30. thissignal を、signals から 依存 abort signal を作成する結果に設定する。 その際、AbortSignal および this関連レルム を用いる。

  31. thisheaders を、 this関連レルムを持つ新しい Headers オブジェクトに設定する。その header listrequestheader list であり、guard は "request" である。

  32. thisrequestmode が "no-cors" である場合:

    1. thisrequestmethodCORS セーフリスト済みメソッドでない場合、 TypeError投げる

    2. thisheadersguard を "request-no-cors" に設定する。

  33. init空でない場合:

    ヘッダーは、この mode では許可されないヘッダーを含む可能性があるため サニタイズされる。そうでなければ、それらは以前にサニタイズ済みであるか、特権 API によって 設定されて以降変更されていない。

    1. headers を、thisheaders と、それに関連付けられた header list のコピーとする。

    2. init["headers"] が存在する場合、 headersinit["headers"] に設定する。

    3. thisheadersheader list を空にする。

    4. headersHeaders オブジェクトであるなら、そのheader listの各 headerについて反復しheaderthisheaders付加する

    5. そうでなければ、thisheadersheaders埋める

  34. inputBody を、inputRequest オブジェクトである場合は inputrequestbody とし、そうでなければ null とする。

  35. init["body"] が存在するかつ null でない、または inputBody が null でない、のいずれかであり、かつ requestmethod が `GET` または `HEAD` である場合、TypeError投げる

  36. initBody を null とする。

  37. init["body"] が存在するかつ null でない場合:

    1. bodyWithType を、requestkeepalive に設定された keepalive を用いて、 init["body"] を抽出する結果とする。

    2. initBodybodyWithTypebody に設定する。

    3. typebodyWithTypetype とする。

    4. type が null でなく、かつ thisheadersheader list が `Content-Type` を含まない場合、 (`Content-Type`, type) を thisheaders追加する

  38. inputOrInitBody を、initBody が null でない場合は initBody とし、そうでなければ inputBody とする。

  39. inputOrInitBody が null でなく、かつ inputOrInitBodysource が null である場合:

    1. initBody が null でなく、かつ init["duplex"] が存在しない場合、TypeError を投げる。

    2. thisrequestmode が "same-origin" でも "cors" でもない場合、TypeError を投げる。

    3. thisrequestuse-CORS-preflight flag を設定する。

  40. finalBodyinputOrInitBody とする。

  41. initBody が null であり、かつ inputBody が null でない場合:

    1. inputBody使用不能である場合、TypeError投げる

    2. finalBody を、inputBodyプロキシを作成する結果に設定する。

  42. thisrequestbodyfinalBody に設定する。

method getter の手順は、thisrequestmethod を返すことである。

url getter の手順は、thisrequestURL を、シリアライズして返すことである。

headers getter の手順は、 thisheaders を返すことである。

destination getter の手順は、thisrequestdestination を返すことである。

referrer getter の手順は次のとおりである:

  1. thisrequestreferrer が "no-referrer" である場合、空文字列を返す。

  2. thisrequestreferrer が "client" である場合、"about:client" を返す。

  3. thisrequestreferrer を、 シリアライズして返す。

referrerPolicy getter の手順は、 thisrequestreferrer policy を返すことである。

mode getter の手順は、thisrequestmode を返すことである。

credentials getter の手順は、 thisrequestcredentials mode を返すことである。

cache getter の手順は、thisrequestcache mode を返すことである。

redirect getter の手順は、 thisrequestredirect mode を返すことである。

integrity getter の手順は、 thisrequestintegrity metadata を返すことである。

keepalive getter の手順は、 thisrequestkeepalive を返すことである。

isReloadNavigation getter の手順は、 thisrequestreload-navigation flag が設定されている場合は true を返し、そうでなければ false を返すことである。

isHistoryNavigation getter の手順は、 thisrequesthistory-navigation flag が 設定されている場合は true を返し、そうでなければ false を返すことである。

signal getter の手順は、thissignal を返すことである。

Thissignal は常に コンストラクターおよび クローン作成時に初期化される。

duplex getter の手順は、 "half" を返すことである。


clone() メソッドの手順は次のとおりである:

  1. this使用不能である場合、TypeError投げる

  2. clonedRequest を、thisrequestクローンする結果とする。

  3. 表明: thissignal は null でない。

  4. clonedSignal を、 « thissignal » から 依存 abort signal を作成する結果とし、 AbortSignal および this関連レルム を用いる。

  5. clonedRequestObject を、clonedRequestthisheadersguardclonedSignal および this関連レルム が与えられたうえで、 Request オブジェクトを作成する結果とする。

  6. clonedRequestObject を返す。

5.5. Responseクラス

[Exposed=(Window,Worker)]
interface Response {
  constructor(optional BodyInit? body = null, optional ResponseInit init = {});

  [NewObject] static Response error();
  [NewObject] static Response redirect(USVString url, optional unsigned short status = 302);
  [NewObject] static Response json(any data, optional ResponseInit init = {});

  readonly attribute ResponseType type;

  readonly attribute USVString url;
  readonly attribute boolean redirected;
  readonly attribute unsigned short status;
  readonly attribute boolean ok;
  readonly attribute ByteString statusText;
  [SameObject] readonly attribute Headers headers;

  [NewObject] Response clone();
};
Response includes Body;

dictionary ResponseInit {
  unsigned short status = 200;
  ByteString statusText = "";
  HeadersInit headers;
};

enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredirect" };

Response オブジェクトは、関連付けられた responseresponse)を持つ。

Response オブジェクトはまた、関連付けられた headers(null または Headers オブジェクト)を持ち、 初期値は null である。

Response オブジェクトの body は、その responsebody である。


response = new Response(body = null [, init])

本体が body であり、status、status message、および headers が init によって与えられる Response を作成する。

response = Response . error()

ネットワークエラー Response を作成する。

response = Response . redirect(url, status = 302)

statusurl へリダイレクトするリダイレクト Response を作成する。

response = Response . json(data [, init])

本体が JSON エンコードされた data であり、status、status message、および headers が init によって与えられる Response を作成する。

response . type

response の type、たとえば "cors" を返す。

response . url

response が URL を持つ場合はその URL を返し、そうでなければ空文字列を返す。

response . redirected

response がリダイレクトを通じて取得されたかどうかを返す。

response . status

response の status を返す。

response . ok

response の status が ok status であるかどうかを返す。

response . statusText

response の status message を返す。

response . headers

response の headers を Headers として返す。

response . clone()

response のクローンを返す。


response responseheaders guard guard、および realm realm が与えられたとき、Response オブジェクトを 作成するには、次の手順を実行する:

  1. responseObject を、realm を持つ 新しい Response オブジェクトとする。

  2. responseObjectresponseresponse に設定する。

  3. responseObjectheaders を、realm を持つ 新しい Headers オブジェクトに設定する。その headers listresponseheaders list であり、guardguard である。

  4. responseObject を返す。

Response オブジェクト responseResponseInit init、および null または body with type body が与えられたとき、 response を初期化するには:

  1. init["status"] が 200 から 599 までの範囲(両端を含む)にない場合、 RangeError投げる

  2. init["statusText"] が空文字列ではなく、かつ reason-phrase トークン生成規則に一致しない場合、TypeError投げる

  3. responseresponsestatusinit["status"] に設定する。

  4. responseresponsestatus messageinit["statusText"] に設定する。

  5. init["headers"] が存在する場合、 responseheadersinit["headers"] で 埋める

  6. body が null でない場合:

    1. responsestatusnull body status である場合、 TypeError投げる

      101 と 103 は、他の場所で使用されるため null body status に含まれる。 それらはこの手順には影響しない。

    2. responsebodybodybody に設定する。

    3. bodytype が null でなく、かつ responseheader list が `Content-Type` を含まない場合、 (`Content-Type`, bodytype) を responseheader list追加する


new Response(body, init) コンストラクターの手順は次のとおりである:

  1. thisresponse を新しい response に設定する。

  2. thisheaders を、 this関連レルムを持つ 新しい Headers オブジェクトに設定する。その header listthisresponseheader list であり、guard は "response" である。

  3. bodyWithType を null とする。

  4. body が null でない場合、bodyWithTypebody抽出する結果に設定する。

  5. thisinit、 および bodyWithType が与えられたうえで、 response を初期化するを実行する。

静的 error() メソッドの手順は、新しい network error、 "immutable"、および current realm が与えられたうえで、Response オブジェクトを 作成する結果を返すことである。

静的 redirect(url, status) メソッドの 手順は 次のとおりである:

  1. parsedURL を、 current settings objectAPI base URL を用いて url解析する結果とする。

  2. parsedURL が失敗である場合、TypeError投げる

  3. statusredirect status でない場合、RangeError投げる

  4. responseObject を、新しい response、"immutable"、および current realm が与えられたうえで、Response オブジェクトを作成する結果とする。

  5. responseObjectresponsestatusstatus に設定する。

  6. value を、parsedURLシリアライズし、 同型エンコードしたものとする。

  7. (`Location`, value) を responseObjectresponseheader list追加する

  8. responseObject を返す。

静的 json(data, init) メソッドの手順は 次のとおりである:

  1. bytes を、data に対して JavaScript 値を JSON バイト列へシリアライズするを実行した結果とする。

  2. body を、bytes抽出する結果とする。

  3. responseObject を、新しい response、"response"、および current realm が与えられたうえで、Response オブジェクトを作成する結果とする。

  4. responseObjectinit、および (body, "application/json") が与えられたうえで、 response を初期化するを実行する。

  5. responseObject を返す。

type getter の手順は、thisresponsetype を返すことである。

url getter の手順は、 thisresponseURL が null である場合は空文字列を返し、 そうでなければ thisresponseURL を、 exclude fragment を true に設定して シリアライズして返すことである。

redirected getter の手順は、 thisresponseURL listsize が 1 より大きい場合は true を返し、そうでなければ false を返すことである。

リダイレクトの結果である responses を除外するには、 これを直接 API を通じて行う。たとえば fetch(url, { redirect:"error" }) である。 このようにすれば、潜在的に安全でない response が誤って漏洩することはない。

status getter の手順は、 thisresponsestatus を返すことである。

ok getter の手順は、 thisresponsestatusok status である場合は true を返し、 そうでなければ false を返すことである。

statusText getter の手順は、 thisresponsestatus message を返すことである。

headers getter の手順は、 thisheaders を返すことである。


clone() メソッドの手順は次のとおりである:

  1. this使用不能である場合、TypeError投げる

  2. clonedResponse を、thisresponseクローンする結果とする。

  3. clonedResponsethisheadersguard、 および this関連レルム が与えられたうえで、Response オブジェクトを作成する結果を返す。

5.6. Fetchメソッド

partial interface mixin WindowOrWorkerGlobalScope {
  [NewObject] Promise<Response> fetch(RequestInfo input, optional RequestInit init = {});
};

dictionary DeferredRequestInit : RequestInit {
  DOMHighResTimeStamp activateAfter;
};

[Exposed=Window]
interface FetchLaterResult {
  readonly attribute boolean activated;
};

partial interface Window {
  [NewObject, SecureContext] FetchLaterResult fetchLater(RequestInfo input, optional DeferredRequestInit init = {});
};

fetch(input, init) メソッドの手順は次のとおりである:

  1. p新しい promise とする。

  2. requestObject を、Request の初期値を、inputinit を引数として コンストラクターとして呼び出した結果とする。これが例外を投げる場合、 p をそれで拒否し、p を返す。

  3. requestrequestObjectrequest とする。

  4. requestObjectsignal中止済みである場合:

    1. prequest、null、および requestObjectsignalabort reason で、 fetch() 呼び出しを中止する

    2. p を返す。

  5. globalObject を、requestclientglobal object とする。
  6. globalObjectServiceWorkerGlobalScope オブジェクトである場合、 requestservice-workers mode を "none" に設定する。
  7. responseObject を null とする。

  8. relevantRealmthis関連レルム とする。

  9. locallyAborted を false とする。

    これにより、中止要求が fetch の呼び出しと同じスレッドから来る場合に、 予測可能なタイミングで promise を拒否できる。

  10. controller を null とする。

  11. requestObjectsignal に、 次の中止手順を追加する:

    1. locallyAborted を true に設定する。

    2. 表明: controller は null でない。

    3. requestObjectsignalabort reason で、 controller中止する

    4. prequestresponseObject、および requestObjectsignalabort reason で、 fetch() 呼び出しを中止する

  12. controller を、request および response が与えられた processResponse を次の手順として、 fetch を呼び出した結果に設定する:

    1. locallyAborted が true である場合、これらの手順を中止する。

    2. responseaborted flag が設定されている場合:

      1. deserializedError を、controllerserialized abort reasonrelevantRealm が与えられたうえで、 serialized abort reason を逆シリアライズする結果とする。

      2. prequestresponseObject、および deserializedError で、 fetch() 呼び出しを中止する

      3. これらの手順を中止する。

    3. responsenetwork error である場合、pTypeError拒否し、 これらの手順を中止する。

    4. responseObject を、response、"immutable"、および relevantRealm が与えられたうえで、Response オブジェクトを作成する結果に設定する。

    5. presponseObject解決する

  13. p を返す。

promiserequestresponseObject、および errorfetch() 呼び出しを中止するには:

  1. promiseerror拒否する

    これは、promise がすでに満たされている場合は何もしない。

  2. requestbody が null でなく、かつ 読み取り可能である場合、requestbodyerrorキャンセルする。

  3. responseObject が null である場合、返る。

  4. responseresponseObjectresponse とする。

  5. responsebody が null でなく、かつ 読み取り可能である場合、responsebodyerrorエラーにする

FetchLaterResult は、関連付けられた activated getter steps を持ち、 これは boolean を返すアルゴリズムである。

activated getter の手順は、 thisactivated getter steps を実行した結果を 返すことである。

fetchLater(input, init) メソッドの手順は次のとおりである:

  1. requestObject を、Request の初期値を、inputinit を引数として コンストラクターとして呼び出した結果とする。

  2. requestObjectsignal中止済みである場合、 signalabort reason を投げる。

  3. requestrequestObjectrequest とする。

  4. activateAfter を null とする。

  5. init が与えられており、かつ init["activateAfter"] が存在する場合、activateAfterinit["activateAfter"] に設定する。

  6. activateAfter が 0 未満である場合、RangeError を投げる。

  7. this関連グローバルオブジェクト関連付けられた document完全にアクティブでない場合、TypeError を投げる。

  8. requestURLschemeHTTP(S) scheme でない場合、 TypeError を投げる。

  9. requestURL潜在的に信頼できる URL でない場合、 TypeError を投げる。

  10. requestbody が null でなく、かつ requestbodylength が null である場合、TypeError を投げる。

    bodyReadableStream オブジェクトであるリクエストは、 遅延できない。

  11. quota を、requestclient および requestURLorigin が与えられたうえで、 利用可能な deferred-fetch quota とする。

  12. requestedrequesttotal request length とする。

  13. quotarequested より小さい場合、 quotaquota であり、requestedrequested である QuotaExceededError投げる

  14. activated を false とする。

  15. deferredRecord を、requestactivateAfter、および 次の手順: activated を true に設定する、が与えられたうえで、 deferred fetch をキューに入れるを呼び出した結果とする。

  16. requestObjectsignal次の中止手順を追加する: deferredRecordinvoke state を "aborted" に設定する。

  17. activated getter stepsactivated を返すものである新しい FetchLaterResult を返す。

次の呼び出しは、ドキュメントが終了したときにフェッチされるリクエストをキューします:

fetchLater("https://report.example.com", {
  method: "POST",
  body: JSON.stringify(myReport),
  headers: { "Content-Type": "application/json" }
})

次の呼び出しは5秒後にこのリクエストをキューし、返された値で本当にアクティベートされたかどうか確認できます。ユーザーエージェントがタイマーをスロットルしても、リクエストは必ず実行されます。

const result = fetchLater("https://report.example.com", {
  method: "POST",
  body: JSON.stringify(myReport),
  headers: { "Content-Type": "application/json" },
  activateAfter: 5000
});

function check_if_fetched() {
  return result.activated;
}

FetchLaterResultオブジェクトはAbortSignalと組み合わせて使うこともできます。例えば:

let accumulated_events = [];
let previous_result = null;
const abort_signal = new AbortSignal();
function accumulate_event(event) {
  if (previous_result) {
    if (previous_result.activated) {
      // リクエストは既にアクティベートされているので、新しく始められます。
      accumulated_events = [];
    } else {
      // このリクエストをabortして、すべてのイベントで新規リクエストを開始します。
      signal.abort();
    }
  }

  accumulated_events.push(event);
  result = fetchLater("https://report.example.com", {
    method: "POST",
    body: JSON.stringify(accumulated_events),
    headers: { "Content-Type": "application/json" },
    activateAfter: 5000,
    abort_signal
  });
}

以下のいずれかのfetchLater()呼び出しは例外が投げられます:

// potentially trustworthy URLのみサポート
fetchLater("http://untrusted.example.com");

// deferredリクエストの長さは事前に分かっている必要があります。
fetchLater("https://origin.example.com", {body: someDynamicStream});

// deferred fetchはactiveなwindowでのみ動作します。
const detachedWindow = iframe.contentWindow;
iframe.remove();
detachedWindow.fetchLater("https://origin.example.com");

deferred fetch quotaの例も参照。

5.7. ガベージコレクション

ユーザーエージェントは、スクリプトから観測できない場合、進行中のfetchを終了してもよい。

「スクリプトから観測できる」とは、fetch() の引数と戻り値で観測できることを意味します。それ以外の方法(サーバーとのサイドチャネル通信など)は含みません。

サーバーがガベージコレクションを観測できる例は既に存在します。例えば WebSocketXMLHttpRequest オブジェクトなどです。

ユーザーエージェントは、終了が観測できないためfetchを終了できる。

fetch("https://www.example.com/")

ユーザーエージェントは、promise経由で終了が観測できるためfetchを終了できない。

window.promise = fetch("https://www.example.com/")

関連するbodyが観測できないため、ユーザーエージェントはfetchを終了できる。

window.promise = fetch("https://www.example.com/").then(res => res.headers)

終了が観測できないため、ユーザーエージェントはfetchを終了できる。

fetch("https://www.example.com/").then(res => res.body.getReader().closed)

promiseオブジェクトにハンドラを登録することで、終了が観測できるためユーザーエージェントはfetchを終了できない。

window.promise = fetch("https://www.example.com/")
  .then(res => res.body.getReader().closed)

登録されたハンドラで終了が観測できるため、ユーザーエージェントはfetchを終了できない。

fetch("https://www.example.com/")
  .then(res => {
    res.body.getReader().closed.then(() => console.log("stream closed!"))
  })

(上記の非観測性の例は、組み込みプロパティや関数(body.getReader()など)が上書きされていないことを前提としています。)

6. data: URL

data: URL についての参考情報は RFC 2397 を参照のこと。この節は、実際にデプロイ済みのコンテンツとの互換性を保つために、同 RFC の規範的な処理要件を置き換える。[RFC2397]

data: URL 構造体とは、以下からなる構造体である: MIME タイプMIME タイプ)、および bodyバイト列)。

data: URL処理は、URL dataURL を受け取り、次の手順を実行する:

  1. アサートdataURLスキーム は "data" である。

  2. input を、URLシリアライザdataURL に対し、フラグメント除外 を true 指定で実行した結果とする。

  3. input から先頭の "data:" を取り除く。

  4. positioninput の先頭を指すようにする。

  5. mimeType を、U+002C(,)でないコードポイントの連続position から収集したものとする。

  6. mimeType の前後の ASCII 空白 を取り除く。

    ここで削除されるのは、U+0020 SPACE コードポイント のみである。

  7. positioninput の末尾を超えていたら、失敗を返す。

  8. position を1だけ進める。

  9. encodedBodyinput の残り全体とする。

  10. bodyencodedBody のパーセントデコード とする。

  11. もし mimeType が U+003B(;)で終わり、続けて0個以上のU+0020 SPACE、その後に "base64"(ASCII大文字小文字無視で判定)があれば、以下を行う:

    1. stringBodybody のアイソモーフィックデコード とする。

    2. bodystringBody の forgiving-base64 decode の結果にする。

    3. body が失敗なら、失敗を返す。

    4. mimeType の末尾6つのコードポイント を削除する。

    5. mimeType 末尾から U+0020 SPACE コードポイント を(もしあれば)取り除く。

    6. mimeType 末尾の U+003B(;)を一つ取り除く。

  12. もし mimeType が ";" で始まるなら、"text/plain" を先頭に付加する。

  13. mimeTypeRecordmimeType のパース 結果とする。

  14. mimeTypeRecord が失敗なら、 text/plain;charset=US-ASCII に設定する。

  15. data: URL 構造体を生成して返す。MIME タイプは mimeTypeRecord、bodyは body。

参考文献

このセクションおよびその下位セクションは参考情報のみです。

HTTPヘッダー階層の区分

fetchにおいては、API層(HTMLのimg、CSSのbackground-image)、早期fetch層、Service Worker層、ネットワーク&キャッシュ層があります。`Accept`や`Accept-Language`は早期fetch層(通常はユーザーエージェントが設定)で扱われます。他のほとんどのユーザーエージェント制御ヘッダー(`Accept-Encoding`、`Host`、`Referer`など)はネットワーク&キャッシュ層で設定されます。開発者はAPI層またはService Worker層(通常はRequestオブジェクト経由)でヘッダーを設定できます。 禁止リクエストヘッダーはほぼ制御できませんが、`Accept`は制御でき、例えば`Referer`は省略・制限できます。

HTTPリダイレクトのアトミックな取り扱い

リダイレクト(responsestatus または internal response(もしあれば)の statusリダイレクトステータスの場合)は、APIに公開されません。 リダイレクトを公開すると、クロスサイトスクリプティング攻撃などでは取得できない情報が漏れる可能性があります。

例えばhttps://example.org/authに対するfetchで、HttpOnly付きのCookieが含まれている場合、https://other-origin.invalid/4af955781ea1c84a3b11にリダイレクトされる可能性があります。この新しいURLには秘密情報が含まれています。リダイレクトを公開すれば、その秘密がクロスサイトスクリプティング攻撃で取得されてしまいます。

CORSプロトコルの安全な基本設定

IP認証やファイアウォールによってデータが保護されているリソース(残念ながら現在も比較的多い)では、CORSプロトコルの使用は安全ではありません。(このためCORSプロトコルが考案されました。)

しかし、下記のようなヘッダーの使用は安全です:

Access-Control-Allow-Origin: *

リソースがCookieやHTTP認証で追加情報を公開している場合でも、上記のヘッダーを使ってもそれが漏れることはありません。API(XMLHttpRequestなど)にリソースを共有できます。 これはcurlwgetと同様です。

言い換えれば、リソースがWeb上の任意のデバイスからcurlwgetでアクセスできない場合、上記のヘッダーは含めるべきではありません。アクセスできる場合は問題ありません。

CORSプロトコルとHTTPキャッシュ

CORSプロトコルの要件が、 `Access-Control-Allow-Origin` を * または静的な オリジンに設定するより複雑である場合、`Vary` を使用することになる。 [HTML] [HTTP] [HTTP-CACHING]

Vary: Origin

特に、`Vary` が使用されず、サーバーが特定のリソースについて CORS リクエストへの応答でのみ `Access-Control-Allow-Origin` を送信するよう 構成されている場合に何が起こるかを考える。ユーザーエージェントがそのリソースに対する 非CORSリクエストへの レスポンスを受け取った場合(たとえば、ナビゲーション リクエストの結果として)、そのレスポンスには `Access-Control-Allow-Origin` が 欠落し、ユーザーエージェントはそのレスポンスをキャッシュする。その後、ユーザーエージェントがそのリソースに対する CORSリクエストに遭遇すると、 以前の非CORSリクエストからの そのキャッシュ済みレスポンスを、`Access-Control-Allow-Origin` なしで使用する。

しかし、上記と同じシナリオで `Vary: Origin` が使用されている場合、それにより ユーザーエージェントは、`Access-Control-Allow-Origin` を含む レスポンスをfetchすることになる。 つまり、`Access-Control-Allow-Origin` を欠く 以前の非CORS リクエストからのキャッシュ済みレスポンスを使用するのではない。

しかし、特定のリソースについて `Access-Control-Allow-Origin` が * または静的なオリジンに設定されている場合は、そのリソースに対する レスポンスでは常に `Access-Control-Allow-Origin` を送信するよう サーバーを構成すること — 非CORS リクエストに対してもCORS リクエストに対しても — そして `Vary` を使用しないこと。

WebSocket

接続を確立する過程で、WebSocket オブジェクトは特殊な種類の フェッチrequestmode が "websocket" であるリクエストを使う)を開始します。これにより、多くのフェッチポリシーの判断(例えば HTTP Strict Transport Security (HSTS) など)を共有できます。最終的に、フェッチは WebSockets に呼び出され、専用の接続を取得することになります。[WEBSOCKETS] [HSTS]

フェッチは以前、WebSocket の接続を取得するWebSocket 接続を確立する を直接定義していましたが、現在はどちらも WebSockets で定義されています。[WEBSOCKETS]

他の標準での fetch の利用

本質的に フェッチrequestresponse の交換です。実際には、標準で正しく採用・利用するにはかなり複雑な仕組みです。この節ではそのための助言を提供します。

必ずドメインの専門家にレビューを依頼してください。

この仕様は作業中です。

リクエストの準備

フェッチの最初のステップは、 リクエストを作成し、 その各項目を埋めることである。

リクエストURLおよびmethodを設定することから始める。 これはHTTPで定義されている。`POST` または `PUT` のリクエストが bodyを必要とする場合、リクエストbodyバイト列、または 自分が作成した ReadableStreamstreamとする 新しいbodyに設定する。[HTTP]

destination表の指針を用いて、自分のリクエストdestinationを選ぶ。DestinationsContent Security Policyに影響し、 `Sec-Fetch-Dest` ヘッダーなどの他の含意も持つため、単なる情報提供用メタデータをはるかに超えるものである。新しい機能が destinationを必要とし、それがdestination表にない場合は、 議論するために issueを 提出 してほしい。[CSP]

自分のリクエストclientを、 自分が動作している 環境設定オブジェクトに設定する。 Webに公開されるAPIは一般に Web IDLで定義され、そこではinterfaceを実装するすべてのオブジェクトが、 使用できる関連設定オブジェクトを持つ。たとえば、 要素に関連付けられたリクエストは、 そのリクエストclientを、要素の node document関連設定オブジェクトに設定することになる。JavaScript、HTML、CSS、または他のDocument サブリソースによって直接Webに公開されるすべての機能は、 clientを持つべきである。

自分のfetchingが 直接Webに公開されない場合、たとえば現在のWindow またはWorkerに依存せず バックグラウンドで送信される場合は、リクエストclientを nullのままにし、代わりにリクエストoriginpolicy containerservice-workers mode、および referrerを適切な値に設定する。たとえば、事前に 環境設定オブジェクトからコピーする。これらのより高度な場合には、 自分のfetchがContent Security Policyおよび referrer policyをどのように扱うかの詳細を明確にしておくこと。また、 コールバック(fetchの呼び出しとレスポンスの処理を参照)は並列キューに投稿されるため、並行性も扱うようにすること。[REFERRER] [CSP]

クロスオリジンリソースをどのように扱うつもりかをよく考える。一部の機能は same originでのみ動作することがあり、その場合は自分のリクエストmodeを "same-origin" に設定する。そうでない場合、新しいWeb公開機能はほぼ常にその modeを "cors" に設定すべきである。自分の機能がWebに公開されない場合、または CORSなしでクロスオリジンリソースをfetchする別の理由があると考える場合は、議論するために issueを 提出 してほしい。

クロスオリジンリクエストについては、資格情報をリクエストに含めるかどうかも決定する。 含める場合は、自分のリクエストcredentials modeを "include" に設定する。

自分のfetchをResource Timingに報告する必要があるか、およびどの initiator typeで報告するかを判断する。 initiator typeリクエストに渡すことで、 fetchが完了しレスポンスが完全にダウンロードされると、Resource Timingへの報告が自動的に行われる。[RESOURCE-TIMING]

自分のリクエストが追加のHTTPヘッダーを必要とする場合、そのheader listを、 それらのヘッダーを含むheader listに 設定する。たとえば、« (`My-Header-Name`, `My-Header-Value`) » である。カスタムヘッダーの送信には、 CORS-preflight fetchが必要になるなどの含意があり得るため、注意して扱うこと。

既定のキャッシュ機構を上書きしたい場合、たとえばこの リクエストのキャッシュを無効化したい場合は、 リクエストのcache modeを "default" 以外の値に設定する。

自分のリクエストがリダイレクトをサポートするようにしたいかどうかを決定する。サポートしたくない場合は、その redirect modeを "error" に設定する。

requestの残りのパラメーターを一通り確認し、自分に関連するものが他にあるかを見る。 残りのパラメーターは使用頻度が低く、多くの場合は特殊な目的のためであり、 この標準の§ 2.2.5 Requests節で詳細に文書化されている。

fetch の呼び出しとレスポンス処理

リクエストのほかに、 fetch操作は、いくつかの 省略可能な 引数を取る。アルゴリズムを取るそれらの引数については、そのアルゴリズムはタスクから (または並列キュー内で、useParallelQueueがtrueの場合に)呼び出される。

リクエストの設定が 完了したら、 fetchにどのアルゴリズムを渡すかを決定するために、 レスポンスをどのように処理したいか、特にどの段階で コールバックを受け取りたいかを決定する:

完了時

これは、たとえば scriptsstyle resourcesなど、ほとんどの呼び出し元が レスポンスを扱う方法である。 レスポンスbody は全体が バイト列へ読み込まれ、その後、呼び出し元によって処理される。

完了時にレスポンスを処理するには、 fetchprocessResponseConsumeBody引数としてアルゴリズムを渡す。与えられた アルゴリズムには、レスポンスと、完全に読み込まれた bodyレスポンス内部レスポンスのもの)を表す引数が渡される。第2引数の値は 次の意味を持つ:

null
レスポンスbodyがnullである。 これは、レスポンスが ネットワークエラーであるか、null body statusを持つことによる。
failure
レスポンスbodyの内容を完全に読む試行が失敗した。たとえばI/Oエラーによる。
バイト列

レスポンス内部レスポンスbodyの内容を完全に 読むことに成功した。

完全な内容を含むバイト列は、 リクエストmodeが "no-cors" である場合にも渡される。呼び出し元は、 そのような内容を扱う際には注意しなければならない。それは要求元の オリジンからアクセス可能であってはならないためである。たとえば、呼び出し元は "no-cors" レスポンスの内容を用いて画像内容を直接ユーザーに表示してもよいが、その画像内容を 埋め込み文書内のスクリプトに直接公開すべきではない。

  1. requestを、リクエストとする。そのURLhttps://stuff.example.com/であり、clientthis関連設定オブジェクトである。

  2. requestfetchする。 その際、 processResponseConsumeBodyを、 レスポンス responseとnull、failure、 またはバイト列 contentsが与えられたときの次の手順に設定する:

    1. contentsがnullまたはfailureであるなら、ユーザーにエラーを提示する。

    2. そうでなければ、responseからのメタデータを考慮してcontentsを解析し、 それに対して独自の操作を行う。

まずヘッダー、その後チャンクごと

場合によっては、たとえば動画を再生する場合や画像を段階的に読み込む場合、呼び出し元は レスポンスをストリームし、一度に1チャンクずつ処理したいことがある。 レスポンスは、 ヘッダーが処理されるとfetch呼び出し元に引き渡され、呼び出し元は そこから継続する。

レスポンスをチャンクごとに処理するには、 fetchprocessResponse引数へアルゴリズムを渡す。与えられた アルゴリズムには、レスポンスのヘッダーが受信されたときにレスポンスが渡され、呼び出し元は レスポンスの残りをダウンロードするために、そのレスポンスbodystreamを読み取る責任を負う。 便宜上、 processResponseEndOfBody引数へもアルゴリズムを渡してよい。 これは、レスポンスとそのbodyを完全に読み終えたときに呼び出される。なお、 processResponseConsumeBodyとは異なり、 processResponseまたはprocessResponseEndOfBody引数を渡しても、 レスポンスが完全に読まれることは保証されず、呼び出し元は自分でそれを読む責任を負う。

processResponse引数は、 レスポンスheader listおよびstatusを、 bodyをまったく扱わずに処理するためにも有用である。これは、たとえば ok statusを持たない レスポンスを扱うときに使用される。

  1. requestを、リクエストとする。そのURLhttps://stream.example.com/であり、clientthis関連設定オブジェクトである。

  2. requestfetchする。 その際、 processResponseを、 レスポンス responseが与えられたときの 次の手順に設定する:

    1. responseネットワークエラーであるなら、ユーザーに エラーを提示する。

    2. そうでなく、responsestatusok statusでないなら、 ユーザーに何らかのフォールバック値を提示する。

    3. そうでなければ、readerを取得する。対象はresponsebodystreamであり、 responseheaders listからMIMEタイプを抽出することで識別される MIMEタイプに適した方法で処理する。

レスポンスを無視する

場合によっては、たとえば navigator.sendBeacon()の場合など、 レスポンスがまったく不要なことがある。 レスポンスを処理し、コールバックを fetchに渡すことは任意であるため、 コールバックを省略すると、レスポンスを期待せずにfetchすることになる。そのような場合、 レスポンスbodystream は破棄され、呼び出し元は内容を不必要にダウンロードすることを心配しなくてよい。

リクエストfetchする。その URLhttps://fire-and-forget.example.com/methodは `POST`、かつclientthis関連設定オブジェクトである。

レスポンスを扱うためのコールバックとは別に、fetchは高度な場合のために追加のコールバックを受け付ける。 processEarlyHintsResponseは、特に レスポンスstatusが 103であるものを対象としており、現在は ナビゲーションによってのみ扱われる。processRequestBodyChunkLengthおよび processRequestEndOfBodyは、リクエストbodyのアップロード 進行状況を呼び出し元に通知する。

fetch操作は、 それが呼び出されたのと同じスレッドで開始し、 その後、内部操作を並列に実行するために分岐することに注意する。前述のコールバックは、 指定されたevent loopに投稿される。これは既定では clientグローバルオブジェクトである。 レスポンスを並列に処理し、メインスレッドとのやり取りを自分で扱うには、 fetchを、useParallelQueueをtrueに設定して行う。

進行中の fetch の操作

すでに開始された fetch 操作を操作するには、 fetch 呼び出しで返される fetch controller を使います。例えば、ユーザーやページのロジックで abort したり、 ブラウザ内部の事情で terminate することができます。

terminate や abort 以外にも、タイミングの報告initiator type を渡していない場合の報告、 完全なタイミング情報の取得(ナビゲーションのみ)なども可能です。 fetch controller次の手動リダイレクトの処理にも使われます( requestredirect mode が "manual" の場合)。

謝辞

感謝を表します: Adam Barth、 Adam Lavin、 Alan Jeffrey、 Alexey Proskuryakov、 Andreas Kling、 Andrés Gutiérrez、 Andrew Sutherland、 Andrew Williams、 Ángel González、 Anssi Kostiainen、 Arkadiusz Michalski、 Arne Johannessen、 Artem Skoretskiy、 Arthur Barstow、 Arthur Sonzogni、 Asanka Herath、 Axel Rauschmayer、 Ben Kelly、 Benjamin Gruenbaum、 Benjamin Hawkes-Lewis、 Benjamin VanderSloot、 Bert Bos、 Björn Höhrmann、 Boris Zbarsky、 Brad Hill、 Brad Porter、 Bryan Smith、 Caitlin Potter、 Cameron McCormack、 Carlo Cannas、 白丞祐 (Cheng-You Bai)、 Chirag S Kumar、 Chris Needham、 Chris Rebert、 Clement Pellerin、 Collin Jackson、 Daniel Robertson、 Daniel Veditz、 Dave Tapuska、 David Benjamin、 David Håsäther、 David Orchard、 Dean Jackson、 Devdatta Akhawe、 Domenic Denicola、 Dominic Farolino、 Dominique Hazaël-Massieux、 Doug Turner、 Douglas Creager、 Eero Häkkinen、 Ehsan Akhgari、 Emily Stark、 Eric Lawrence、 Eric Orth、 Feng Yu、 François Marier、 Frank Ellerman、 Frederick Hirsch、 Frederik Braun、 Gary Blackwood、 Gavin Carothers、 Glenn Maynard、 Graham Klyne、 Gregory Terzian、 Guohui Deng(邓国辉)、 Hal Lockhart、 Hallvord R. M. Steen、 Harris Hancock、 Henri Sivonen、 Henry Story、 Hiroshige Hayashizaki、 Honza Bambas、 Ian Hickson、 Ilya Grigorik、 isonmad、 Jake Archibald、 James Graham、 Jamie Mansfield、 Janusz Majnert、 Jeena Lee、 Jeff Carpenter、 Jeff Hodges、 Jeffrey Yasskin、 Jensen Chappell、 Jeremy Roman、 Jesse M. Heines、 Jianjun Chen、 Jinho Bang、 Jochen Eisinger、 John Wilander、 Jonas Sicking、 Jonathan Kingston、 Jonathan Watt、 최종찬 (Jongchan Choi)、 Jordan Stephens、 Jörn Zaefferer、 Joseph Pecoraro、 Josh Matthews、 jub0bs、 Julian Krispel-Samsel、 Julian Reschke、 송정기 (Jungkee Song)、 Jussi Kalliokoski、 Jxck、 Kagami Sascha Rosylight、 Keita Suzuki、 Keith Yeung、 Kenji Baheux、 Lachlan Hunt、 Larry Masinter、 Liam Brummitt、 Linus Groh、 Louis Ryan、 Luca Casonato、 Lucas Gonze、 Łukasz Anforowicz、 呂康豪 (Kang-Hao Lu)、 Maciej Stachowiak、 Malisa、 Manfred Stock、 Manish Goregaokar、 Marc Silbey、 Marcos Caceres、 Marijn Kruisselbrink、 Mark Nottingham、 Mark S. Miller、 Martin Dürst、 Martin O’Neal、 Martin Thomson、 Matt Andrews、 Matt Falkenhagen、 Matt Menke、 Matt Oshry、 Matt Seddon、 Matt Womer、 Mhano Harkness、 Michael Ficarra、 Michael Kohler、 Michael™ Smith、 Mike Pennisi、 Mike West、 Mohamed Zergaoui、 Mohammed Zubair Ahmed、 Moritz Kneilmann、 Ms2ger、 Nico Schlömer、 Nicolás Peña Moreno、 Nidhi Jaju、 Nikhil Marathe、 Nikki Bee、 Nikunj Mehta、 Noam Rosenthal、 Odin Hørthe Omdal、 Olli Pettay、 Ondřej Žára、 O. Opsec、 Patrick Meenan、 Perry Jiang、 Philip Jägenstedt、 R. Auburn、 Raphael Kubo da Costa、 Robert Linder、 Rondinelly、 Rory Hewitt、 Ross A. Baker、 Ryan Sleevi、 Sam Atkins、 Samy Kamkar、 Sébastien Cevey、 Sendil Kumar N、 Shao-xuan Kang、 Sharath Udupa、 Shivakumar Jagalur Matt、 Shivani Sharma、 Sigbjørn Finne、 Simon Pieters、 Simon Sapin、 Simon Wülker、 Srirama Chandra Sekhar Mogali、 Stephan Paul、 Steven Salat、 Sunava Dutta、 Surya Ismail、 Tab Atkins-Bittner、 Takashi Toyoshima、 吉野剛史 (Takeshi Yoshino)、 Thomas Roessler、 Thomas Steiner、 Thomas Wisniewski、 Tiancheng "Timothy" Gu、 Tobie Langel、 Tom Schuster、 Tomás Aparicio、 triple-underscore、 保呂毅 (Tsuyoshi Horo)、 Tyler Close、 Ujjwal Sharma、 Vignesh Shanmugam、 Vladimir Dzhuvinov、 Wayne Carr、 Xabier Rodríguez、 Yehuda Katz、 Yoav Weiss、 Yoshisato Yanagisawa、 Youenn Fablet、 Yoichi Osato、 平野裕 (Yutaka Hirano)、 Zhenbin Xu 素晴らしい協力に感謝します。

本現行標準は Anne van Kesteren (Apple, annevk@annevk.nl) によって執筆されています。

知的財産権

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft)。この成果物は Creative Commons Attribution 4.0 International License に基づきライセンスされています。ソースコードに組み込まれる部分については、BSD 3-Clause License に基づきライセンスされます。

これは現行標準です。 特許審査版に関心がある場合は 現行標準レビュー草案を参照してください。

索引

この仕様で定義されている用語

参照で定義される用語

参考文献

規範的参考文献

[ABNF]
D. Crocker, Ed.; P. Overell. 構文仕様のための Augmented BNF: ABNF. 2008年1月. インターネット標準. URL: https://www.rfc-editor.org/info/rfc5234/
[BEACON]
Ilya Grigorik; Alois Reitbauer. Beacon. URL: https://w3c.github.io/beacon/
[COOKIES]
Johann Hofmann; Anne van Kesteren. Cookies: HTTP 状態管理メカニズム. URL: https://httpwg.org/http-extensions/draft-ietf-httpbis-layered-cookies.html
[CSP]
Mike West; Antonio Sartori. Content Security Policy レベル 3. URL: https://w3c.github.io/webappsec-csp/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位 モジュール レベル 4. URL: https://drafts.csswg.org/css-values-4/
[DOM]
Anne van Kesteren. DOM 標準. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. Encoding 標準. Living Standard. URL: https://encoding.spec.whatwg.org/
[FETCH-METADATA]
Mike West. Fetch Metadata リクエスト ヘッダー. URL: https://w3c.github.io/webappsec-fetch-metadata/
[FILEAPI]
Marijn Kruisselbrink. File API. URL: https://w3c.github.io/FileAPI/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. URL: https://w3c.github.io/hr-time/
[HSTS]
J. Hodges; C. Jackson; A. Barth. HTTP Strict Transport Security (HSTS). 2012年11月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6797/
[HTML]
Anne van Kesteren; et al. HTML 標準. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTTP]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP セマンティクス. 2022年6月. インターネット 標準. URL: https://httpwg.org/specs/rfc9110.html
[HTTP-CACHING]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP キャッシュ. 2022年6月. インターネット 標準. URL: https://httpwg.org/specs/rfc9111.html
[HTTP1]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP/1.1. 2022年6月. インターネット標準. URL: https://httpwg.org/specs/rfc9112.html
[HTTP3]
M. Bishop, Ed.. HTTP/3. 2022年6月. Proposed Standard. URL: https://httpwg.org/specs/rfc9114.html
[HTTP3-DATAGRAM]
D. Schinazi; L. Pardue. HTTP Datagrams と Capsule Protocol. 2022年8月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc9297/
[IANA-HTTP-PARAMS]
Hypertext Transfer Protocol (HTTP) パラメーター. URL: https://www.iana.org/assignments/http-parameters/http-parameters.xhtml
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. Living Standard. URL: https://infra.spec.whatwg.org/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing 標準. Living Standard. URL: https://mimesniff.spec.whatwg.org/
[MIX]
Emily Stark; Mike West; Carlos IbarraLopez. Mixed Content. URL: https://w3c.github.io/webappsec-mixed-content/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[REFERRER]
Jochen Eisinger; Emily Stark. Referrer Policy. URL: https://w3c.github.io/webappsec-referrer-policy/
[REPORTING]
Douglas Creager; Ian Clelland; Mike West. Reporting API. URL: https://w3c.github.io/reporting/
[RESOURCE-TIMING]
Yoav Weiss; Noam Rosenthal. Resource Timing. URL: https://w3c.github.io/resource-timing/
[RFC7405]
P. Kyzivat. ABNF における大文字小文字を区別する 文字列のサポート. 2014年12月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc7405/
[RFC7578]
L. Masinter. フォームから値を返す: multipart/form-data. 2015年7月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc7578/
[RFC9218]
K. Oku; L. Pardue. HTTP のための拡張可能な優先度付け スキーム. 2022年6月. Proposed Standard. URL: https://httpwg.org/specs/rfc9218.html
[RFC9651]
M. Nottingham; P-H. Kamp. HTTP のための Structured Field Values. 2024年9月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc9651/
[SECURE-CONTEXTS]
Mike West. Secure Contexts. URL: https://w3c.github.io/webappsec-secure-contexts/
[SRI]
Frederik Braun. Subresource Integrity. URL: https://w3c.github.io/webappsec-subresource-integrity/
[STALE-WHILE-REVALIDATE]
M. Nottingham. 古いコンテンツのための HTTP Cache-Control 拡張. 2010年5月. Informational. URL: https://httpwg.org/specs/rfc5861.html
[STREAMS]
Adam Rice; et al. Streams 標準. Living Standard. URL: https://streams.spec.whatwg.org/
[SVCB]
B. Schwartz; M. Bishop; E. Nygren. DNS による Service Binding と Parameter Specification (SVCB および HTTPS リソースレコード). 2023年11月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc9460/
[SW]
Monica CHINTALA; Yoshisato Yanagisawa. Service Workers Nightly. URL: https://w3c.github.io/ServiceWorker/
[TLS]
E. Rescorla. Transport Layer Security (TLS) Protocol Version 1.3. 2018年8月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc8446/
[UPGRADE-INSECURE-REQUESTS]
Mike West. Upgrade Insecure Requests. URL: https://w3c.github.io/webappsec-upgrade-insecure-requests/
[URL]
Anne van Kesteren. URL 標準. Living Standard. URL: https://url.spec.whatwg.org/
[WEBCRYPTO]
Daniel Huigens. Web Cryptography レベル 2. URL: https://w3c.github.io/webcrypto/
[WEBDRIVER-BIDI]
James Graham; Alex Rudenko; Maksim Sadym. WebDriver BiDi. URL: https://w3c.github.io/webdriver-bidi/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. Living Standard. URL: https://webidl.spec.whatwg.org/
[WEBSOCKETS]
Adam Rice. WebSockets 標準. Living Standard. URL: https://websockets.spec.whatwg.org/
[WEBTRANSPORT]
Nidhi Jaju; Victor Vasiliev; Jan-Ivar Bruaroey. WebTransport. URL: https://w3c.github.io/webtransport/
[WEBTRANSPORT-HTTP3]
V. Vasiliev. HTTP/3 上の WebTransport. URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3
[XHR]
Anne van Kesteren. XMLHttpRequest 標準. Living Standard. URL: https://xhr.spec.whatwg.org/

参考情報文献

[HTTPVERBSEC1]
複数ベンダーの Web サーバーは HTTP TRACE メソッドをデフォルトで有効にしている。. URL: https://www.kb.cert.org/vuls/id/867593
[HTTPVERBSEC2]
Microsoft Internet Information Server (IIS) は HTTP TRACK メソッド経由のクロスサイトスクリプティングに対して脆弱である。. URL: https://www.kb.cert.org/vuls/id/288308
[HTTPVERBSEC3]
HTTP プロキシのデフォルト構成は任意の TCP 接続を許可する。. URL: https://www.kb.cert.org/vuls/id/150227
[NAVIGATION-TIMING]
Zhiheng Wang. Navigation Timing. 2012年 12月17日. REC. URL: https://www.w3.org/TR/navigation-timing/
[ORIGIN]
A. Barth. Web Origin の概念. 2011年12月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6454/
[RFC1035]
P. Mockapetris. ドメイン名 - 実装と 仕様. 1987年11月. インターネット標準. URL: https://www.rfc-editor.org/info/rfc1035/
[RFC2397]
L. Masinter. "data" URL スキーム. 1998年8月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc2397/
[RFC3986]
T. Berners-Lee; R. Fielding; L. Masinter. Uniform Resource Identifier (URI): 汎用構文. 2005年1月. インターネット標準. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC5952]
S. Kawamura; M. Kawashima. IPv6 アドレスのテキスト表記に 関する推奨. 2010年8月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc5952/
[RFC6960]
S. Santesson; et al. X.509 インターネット公開鍵 基盤 Online Certificate Status Protocol - OCSP. 2013年6月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc6960/
[RFC7301]
S. Friedl; et al. Transport Layer Security (TLS) Application-Layer Protocol Negotiation 拡張. 2014年7月. Proposed Standard. URL: https://www.rfc-editor.org/info/rfc7301/
[RFC7918]
A. Langley; N. Modadugu; B. Moeller. Transport Layer Security (TLS) False Start. 2016年8月. Informational. URL: https://www.rfc-editor.org/info/rfc7918/
[RFC8470]
M. Thomson; M. Nottingham; W. Tarreau. HTTP における Early Data の使用. 2018年9月. Proposed Standard. URL: https://httpwg.org/specs/rfc8470.html
[RFC9163]
E. Stark. HTTP のための Expect-CT 拡張. 2022年6月. Experimental. URL: https://www.rfc-editor.org/info/rfc9163/

IDL索引

typedef (sequence<sequence<ByteString>> or record<ByteString, ByteString>) HeadersInit;

[Exposed=(Window,Worker)]
interface Headers {
  constructor(optional HeadersInit init);

  undefined append(ByteString name, ByteString value);
  undefined delete(ByteString name);
  ByteString? get(ByteString name);
  sequence<ByteString> getSetCookie();
  boolean has(ByteString name);
  undefined set(ByteString name, ByteString value);
  iterable<ByteString, ByteString>;
};

typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) XMLHttpRequestBodyInit;

typedef (ReadableStream or XMLHttpRequestBodyInit) BodyInit;
interface mixin Body {
  readonly attribute ReadableStream? body;
  readonly attribute boolean bodyUsed;
  [NewObject] Promise<ArrayBuffer> arrayBuffer();
  [NewObject] Promise<Blob> blob();
  [NewObject] Promise<Uint8Array> bytes();
  [NewObject] Promise<FormData> formData();
  [NewObject] Promise<any> json();
  [NewObject] Promise<USVString> text();
  [NewObject] ReadableStream textStream();
};
typedef (Request or USVString) RequestInfo;

[Exposed=(Window,Worker)]
interface Request {
  constructor(RequestInfo input, optional RequestInit init = {});

  readonly attribute ByteString method;
  readonly attribute USVString url;
  [SameObject] readonly attribute Headers headers;

  readonly attribute RequestDestination destination;
  readonly attribute USVString referrer;
  readonly attribute ReferrerPolicy referrerPolicy;
  readonly attribute RequestMode mode;
  readonly attribute RequestCredentials credentials;
  readonly attribute RequestCache cache;
  readonly attribute RequestRedirect redirect;
  readonly attribute DOMString integrity;
  readonly attribute boolean keepalive;
  readonly attribute boolean isReloadNavigation;
  readonly attribute boolean isHistoryNavigation;
  readonly attribute AbortSignal signal;
  readonly attribute RequestDuplex duplex;

  [NewObject] Request clone();
};
Request includes Body;

dictionary RequestInit {
  ByteString method;
  HeadersInit headers;
  BodyInit? body;
  USVString referrer;
  ReferrerPolicy referrerPolicy;
  RequestMode mode;
  RequestCredentials credentials;
  RequestCache cache;
  RequestRedirect redirect;
  DOMString integrity;
  boolean keepalive;
  AbortSignal? signal;
  RequestDuplex duplex;
  RequestPriority priority;
  any window; // can only be set to null
};

enum RequestDestination { "", "audio", "audioworklet", "document", "embed", "font", "frame", "iframe", "image", "json", "manifest", "object", "paintworklet", "report", "script", "sharedworker", "style", "text", "track", "video", "worker", "xslt" };
enum RequestMode { "navigate", "same-origin", "no-cors", "cors" };
enum RequestCredentials { "omit", "same-origin", "include" };
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
enum RequestRedirect { "follow", "error", "manual" };
enum RequestDuplex { "half" };
enum RequestPriority { "high", "low", "auto" };

[Exposed=(Window,Worker)]
interface Response {
  constructor(optional BodyInit? body = null, optional ResponseInit init = {});

  [NewObject] static Response error();
  [NewObject] static Response redirect(USVString url, optional unsigned short status = 302);
  [NewObject] static Response json(any data, optional ResponseInit init = {});

  readonly attribute ResponseType type;

  readonly attribute USVString url;
  readonly attribute boolean redirected;
  readonly attribute unsigned short status;
  readonly attribute boolean ok;
  readonly attribute ByteString statusText;
  [SameObject] readonly attribute Headers headers;

  [NewObject] Response clone();
};
Response includes Body;

dictionary ResponseInit {
  unsigned short status = 200;
  ByteString statusText = "";
  HeadersInit headers;
};

enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredirect" };

partial interface mixin WindowOrWorkerGlobalScope {
  [NewObject] Promise<Response> fetch(RequestInfo input, optional RequestInit init = {});
};

dictionary DeferredRequestInit : RequestInit {
  DOMHighResTimeStamp activateAfter;
};

[Exposed=Window]
interface FetchLaterResult {
  readonly attribute boolean activated;
};

partial interface Window {
  [NewObject, SecureContext] FetchLaterResult fetchLater(RequestInfo input, optional DeferredRequestInit init = {});
};

MDN

Headers/Headers

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Headers/append

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Headers/delete

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Headers/get

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Headers/getSetCookie

In all current engines.

Firefox112+Safari17+Chrome113+
Opera?Edge113+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js19.7.0+
MDN

Headers/has

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Headers/set

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Headers

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Request/Request

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera27+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile27+
MDN

Request/arrayBuffer

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/arrayBuffer

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/blob

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/blob

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/body

FirefoxNoneSafari11.1+Chrome105+
Opera?Edge105+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/body

In all current engines.

Firefox65+Safari10.1+Chrome43+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/bodyUsed

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/bodyUsed

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/cache

In all current engines.

Firefox48+Safari10.1+Chrome64+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/clone

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/credentials

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/destination

In all current engines.

Firefox61+Safari10.1+Chrome65+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/formData

In all current engines.

Firefox39+Safari14.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/formData

In all current engines.

Firefox39+Safari14.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/headers

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/integrity

In all current engines.

Firefox51+Safari10.1+Chrome46+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/json

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/json

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/method

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/mode

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/redirect

In all current engines.

Firefox43+Safari10.1+Chrome46+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/referrer

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/referrerPolicy

In all current engines.

Firefox47+Safari10.1+Chrome52+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet7.2+Opera Mobile?
MDN

Request/signal

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/text

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/text

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/url

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile27+
MDN

Request

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Response/Response

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/clone

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/error_static

In all current engines.

Firefox39+Safari10.1+Chrome43+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/headers

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/json_static

Firefox115+SafariNoneChrome105+
Opera?Edge105+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/ok

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/redirect_static

In all current engines.

Firefox39+Safari10.1+Chrome44+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/redirected

In all current engines.

Firefox49+Safari10.1+Chrome57+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView60+Samsung Internet8.0+Opera Mobile?
MDN

Response/status

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/statusText

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/type

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/url

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

fetch

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
MDN

Headers/Access-Control-Allow-Credentials

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Access-Control-Allow-Headers

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Access-Control-Allow-Methods

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Access-Control-Allow-Origin

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Access-Control-Expose-Headers

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Access-Control-Max-Age

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Access-Control-Request-Headers

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Access-Control-Request-Method

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
MDN

Headers/Cross-Origin-Resource-Policy

In all current engines.

Firefox74+Safari12+Chrome73+
OperaNoneEdge79+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS Safari?Chrome for Android?Android WebView?Samsung Internet11.0+Opera MobileNone
MDN

Headers/Origin

In all current engines.

Firefox70+SafariYesChromeYes
Opera?EdgeYes
Edge (Legacy)12+IEYes
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Headers/Sec-Purpose

In only one current engine.

Firefox115+SafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera MobileNone
MDN

Headers/X-Content-Type-Options

In all current engines.

Firefox50+Safari11+Chrome64+
OperaYesEdge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android64+Android WebView?Samsung Internet?Opera MobileYes