HTTP接続の処理

HTTP接続の処理

Introduction

This section is non-normative.

[907] This document is an implementation of Web transport protocols.

Fetch and connections

[908] The request's current server url is a URL record. Once a value is set, the current server url is that value. Otherwise, the current server url is same as its current url.

This field can be used to implement a reverse proxy.

[1303] In the basic fetch, when request's current url's scheme is ftp, return the result of performing an HTTP fetch using request.

[896] To modify request's header list per HTTP in HTTP-network-or-cache fetch, run these steps:

  1. [898] Append Accept-Encoding header, if necessary.
    1. REQUIRED for Web compat docs.github.com
  2. [897] Append DNT header, if necessary.
  3. [899] Append Upgrade-Insecure-Requests header, if necessary.

[1304] In the steps to obtain a connection, to choose a connection for origin origin from the user agent's connection pool, run these steps:

  1. [1305] If origin's scheme is ftp:
    1. [1306] Return null.
  2. [1307] Otherwise:
    1. [1308] Return a connection whose to be closed is false, 状態 is 「初期」 or 「要求待ち」, and WebSocket接続の状態 is null in the user agent's connection pool, if any, or null.

[1325] In the steps to obtain a connection, just before establishing an HTTP connection, run these steps:

  1. [1326] Wait until implementation dependent constraints on the number of relevant connections in the user agent's connection pool is small enough. If the user agent detects an idle connection in its connection pool, it may choose to abort that connection.

[822] In the steps to obtain a connection, to establish an HTTP connection, run these steps:

  1. [808] Let transport be the result of establishing a transport.
    request url
    the request's current url
    server url
    the request's current server url
    credentials
    true
    acceptSslCerts
    the request's acceptSslCerts flag
    user agent
    the user agent
    skip DNS cache
    whether the request's cache mode is either one of no-cache, reload, and no-store, or not
  2. [823] If transport is a failure:
    1. [824] Return a failure.
  3. [1296] Otherwise, if transport's http protocol is http2:
  4. [932] Otherwise, if transport's http protocol is ftp:
    1. [934] If the HTTP-network-or-cache fetch steps set credentials to the request:
      1. [935] Set username and password to the appropriate values.
    2. [1285] Otherwise:
      1. [1286] Set username to anonymous.
      2. [1287] Set password to User@.
    3. [933] Let connection be the result of initiating an FTP connection with transport, username, and password.
    4. [1291] Wait until connection's established promise is resolved or rejected.
    5. [1292] If connection's established promise is resolved:
      1. [1293] Return ftp.
    6. [1294] Otherwise:
      1. [1295] Return a failure.
  5. [825] Otherwise:
    1. [826] Return an HTTP connection:
      HTTP connection
      endpoint type
      client
      transport
      transport

[809] To obtain a WebSocket connection for url, run these steps:

  1. [821] Let transport be the result of establishing a transport.
    request url
    url
    server url
    url
    acceptSslCerts
    the request's acceptSslCerts flag
    user agent
    the user agent
    ws
    true
    skip DNS cache
    whether the request's cache mode is either one of no-cache, reload, and no-store, or not
  2. [827] If transport is a failure:
    1. [828] Return a failure.
  3. [829] Otherwise:
    1. [830] Return an HTTP connection:
      HTTP connection
      endpoint type
      client
      transport
      transport

[607] To wait for other connections of host, port, and ws in user agent, run these steps:

  1. [1324] If ws is false, abort these steps.
  2. [831] If host is a domain:
    1. [832] Let n be an implementation dependent small number.
  3. [833] Otherwise:
    1. [834] Let n be 1.
  4. [835] Wait while the number of connections with the following conditions is not less than n:

[1336] To establish a WebSocket connection, given a url, protocols, and client, run these steps:

  1. [1337] Let requestURL be a copy of url, with its scheme set to "http", if url's scheme is "ws", and to "https" otherwise.
  2. [1338] Let request be a request:
    Request
    url
    url
    client
    client
    skip-service-worker flag
    true
    synchronous flag
    true
    mode
    websocket
    credentials mode
    include
    cache mode
    no-store
    redirect mode
    error
    WebSocket subprotocols
    protocols
  3. [1339] Fetch request with process response >>1348 and process response done >>1342.

[1348] The process response with response is as follows:

  1. [1340] If response is not a network error and response's WebSocket connection established is true:
    1. [1346] The WebSocket Connection is Established with:
      Extensions In Use
      response's header list's `Sec-WebSocket-Extensions` header's value, if any, or null
      Subprotocol In Use
      response's header list's `Sec-WebSocket-Protocol` header's value, if any, or null

[1342] The process response done with response is as follows:

  1. [1345] Let exit status be response's exit status.
  2. [1350] If exit status is null:
    1. [1351] Set exit status to an exit status whose 失敗 is false.
  3. [1343] The WebSocket Connection Is Closed with:
    Fail The WebSocket Connection
    exit status's 失敗
    cleanly
    exit status's WebSocket cleanly is true
    The WebSocket Connection Close Code
    exit status's WebSocket状態符号
    The WebSocket Connection Close Reason
    exit status's WebSocket理由文字列

[838] To make an HTTP request over connection using request in HTTP-network fetch, with credentials flag and optional not retryable flag, run these steps:

  1. [1344] Configure connection such that any notification is handled by >>839, which uses websocket data type and websocket data.
  2. [837] If connection's transport's http protocol is http2:
  3. [930] If connection's transport's http protocol is ftp:
    1. [1289] Send an FTP request request over connection.
  4. [931] Otherwise:
    1. [541] If connection's transport's request mode is HTTP proxy:
      1. [845] Let target be request's originpathquery.
    2. [843] Otherwise:
      1. [844] Let target be request's current url's pathquery.
    3. [901] Let host header be request's current url's hostport.
    4. [900] Append Host/host header to request's header list.
    5. [905] Append Connection/keep-alive to request's header list.
    6. [840] Send an HTTP request over connection.
      HTTP request
      要求メソッド
      request's method
      要求対象
      target
      ヘッダーリスト
      request's header list
      本体
      request's body
      mode
      request's mode

[839] Any notification msg from connection is processed as follows, switched by msg's type:

要求の本体の一部の送信の通知
Process transmitted as follows:
  1. Increase request's body stream's transmitted bytes
要求の送信完了の通知
  1. Set request's body stream's done flag
応答のヘッダー受信完了の通知
Process http response and WebSocket connection established as follows:
  1. [856] If connection's transport's request mode is not HTTP proxy and http response's 状態符号 is 407:
    1. [857] Set response to a network error.
  2. [858] Otherwise:
    1. [841] Set response to a response:
      Response
      status
      http response's 状態符号
      status message
      http response's 理由句
      header list
      http response's ヘッダーリスト
      HTTPS state
      connection's transport's HTTPS state
      WebSocket connection established
      WebSocket connection established
    2. [892] If connection's transport's protocol is tls and connection's transport's has alert is false:
      1. [893] Process the HSTS header of response, if any.
      2. [894] Process the PKP headers of response, if any.
  3. [842] Now headers are transmitted. Return response.
datastart の通知
Process data type as follows:
  1. [537] If request's mode is websocket:
    1. [1360] Set websocket data type to data type.
    2. [1349] If data type is Text:
      1. [538] Set websocket data to the empty string.
    3. [1352] Otherwise:
      1. [1353] Set websocket data to the empty byte string.
data の通知
Process data as follows:
  1. [1354] If request's mode is websocket:
    1. [1356] Append data to websocket data.
  2. [1355] Otherwise:
    1. Write data to response's body stream
dataend の通知
  1. [1357] If request's mode is websocket:
    1. [1359] A WebSocket Message Has Been Received with:
      type
      websocket data type
      data
      websocket data
  2. [1358] Otherwise:
    1. Set response's body stream's done flag
wsclosing の通知
The WebSocket Closing Handshake Is Started.
完了の通知
Process http response and exit status as follows:
  1. [851] If exit status's 失敗 is true:
    1. [852] If headers are transmitted:
      1. [855] Mutate response into a network error whose exit status is exit status.
    2. [257] Otherwise, if not retryable is false, exit status's can retry is true, and the user agent wants to retry the request:
      1. [882] Let connection be the result of obtaining a connection, given request's current url's origin and credentials.
      2. [883] If connection is a failure, return a network error and abort these steps.
      3. [884] Return the result of recursively making an HTTP request over connection using request, with credentials flag, with not retryable flag set.
    3. [854] Otherwise:
      1. [853] Return a network error whose exit status is exit status.

[247] The user agent might not want to retry the request because, e.g., there is a request body specified as a ReadableStream.

TLS client certificate dialog
[357] HTTP CONNECT プロキシからの応答の受信
[539] WebSocket server steps

[1375] A request has following additional field:

acceptSslCerts
A boolean. Initially, false.

[1347] A response has following additional fields:

exit status
An exit status or null. Initially, null.
incomplete message flag
A boolean. Initially, false.
WebSocket connection established flag
A boolean. Initially, false.

Hosts and ports

[323] An IP address is an IPv4 address or IPv6 address.

[365] A port is a 16-bit unsigned integer.

Name resolution

[1278] A user agent has DNS cache, which is a map from a domain to a pair of (address (IP address or failure), expires (number)).

[1328] The DNS cache has an associated monotonic clock, which is an implementation dependent monotonic clock.

[1281] The DNS cache timeout is 60 seconds.

[369] The underlying platform is expected to provide the way to resolve a name, which receives a string host string and a boolean skip DNS cache and returns a IP address or failure. If the platform does not support a feature equivalent to skip DNS cache, it MUST be ignored.

[509] It asynchronously returns.

[615] The user agent user agent's name resolution steps for host host and optional boolean skip DNS cache (whose default is false) are:

  1. [616] If host is a domain:
    1. [1309] If skip DNS cache is false:
      1. [1283] Let cached be user agent's DNS cache [ host ].
    2. [1310] Otherwise:
      1. [1311] Let cached be null.
    3. [1280] Let now be the current value of user agent's DNS cache's monotonic clock.
    4. [1284] If cached is null or cached's expires is a time after now:
      1. [402] Let host string be the result of serializing host.
      2. [617] Let addr be the result of resolving host string with skip DNS cache.
      3. [1377] If addr is an IPv4 address in the range 0.0.0.0/8:
        1. [1380] Set addr to a failure.
      4. [1279] Set user agent's DNS cache [ host ] to (addr, DNS cache timeout after now).
      5. [1282] Return addr.
    5. [1312] Otherwise:
      1. [1313] Return cached's address.
  2. [618] Otherwise:
    1. [619] Return host.
[508] These steps asynchronously return an IP address or failure.

Verification of service identity

[943] The service identity verification steps for host and certificate are these steps:

  1. [947] Let domains be a list of the dNSName values in certificate's subjectAltName extension, if any.
  2. [948] Let addresses be a list of the iPAddress values in certificate's subjectAltName extension, if any.
  3. [949] If all of these conditions are true:
    1. [967] Let cn be certificate's subject field has the first CN value.
  4. [968] Otherwise:
    1. [969] Let cn be null.
  5. [944] If host is a domain:
    1. [958] For each domain in domains:
      1. [957] If host certificate-domain-pattern matches domain:
        1. [959] Return true and abort these steps.
    2. [970] If cn is not null and host certificate-domain-pattern matches cn:
      1. [971] Return true and abort these steps.
  6. [945] Otherwise, if host is an IPv4 address:
    1. [954] For each address in addresses:
      1. [955] If address represents the same IPv4 address as host:
        1. [956] Return true and abort these steps.
    2. [963] If cn is the result of applying IPv4 serializer to host:
      1. [972] Return true and abort these steps.
  7. [946] Otherwise, if host is an IPv6 address:
    1. [950] For each address in addresses:
      1. [951] If address represents the same IPv6 address as host:
        1. [952] Return true and abort these steps.
  8. [953] Return false.

[960] Whether a domain domain certificate-domain-pattern matches a string pattern or not is the value returned by the following steps:

  1. [962] If the last character of pattern, if any, is a . character:
    1. [973] Return false and abort these steps.
  2. [975] Let canonicalized pattern be pattern, converted to ASCII lowercase.
  3. [974] If domain is canonicalized pattern, optionally followed by a . character:
    1. [976] Return true and abort these steps.
  4. [977] If the first two characters of canonicalized pattern, if any, is *.:
    1. [979] Remove the first two characters from canonicalized pattern.
    2. [980] If canonicalized pattern does not contain any . character, or canonicalized pattern is an ICANN public suffix:
      1. [982] Return false and abort these steps.
    3. [983] If domain is one or more characters, followed by canonicalized pattern, optionally followed by a . character:
      1. [984] Return true and abort these steps.
  5. [978] Return false.

[1327] A string string is an ICANN public suffix if the public suffix of string is string when only ICANN domains are taken into account.

URLs

[1058] The hostport of a URL record url is the concatenation of:

  1. [1059] host
  2. [902] If url's port is not null:
    1. [903] :
    2. [904] url's port, serialized

[622] The effective port of url is the value returned by these steps:

  1. [623] Let port be url's port.
  2. [624] If port is null:
    1. [625] Set port to the value determined by the url's scheme:
      ftp
      21
      http
      80
      https
      443
  3. [626] Return port.

[1057] The pathquery of a URL record url is the concatenation of:

  1. [846] /
  2. [847] The strings in url's path, separated from each other by /
  3. [848] If url's query is not null:
    1. [849] ?
    2. [850] url's query

[1299] The originpathquery of a URL record url is the value returned by these steps:

  1. [1300] Set clone be a copy of url.
  2. [1301] Strip clone for use as a referrer.
  3. [1302] Return the result of applying the URL serializer to clone.

[1056] The proxy environment variable parser for string value MUST run these steps:

  1. [1028] If value does not begin with a scheme followed by ://:
    1. [1316] prepend http:// to value.
  2. [1029] Return the result of applying the URL parser to value.

[1318] These steps can return a URL record or a failure.

Proxies

[1314] A user agent user agent has get proxies steps, which are invoked with user agent and URL record url. The get proxies steps must return a list of zero or more proxy configuration objects.

[1052] url's scheme has to be a network scheme.

[612] A proxy configuration has protocol, which is one of: tcp, unix, http, https, socks4, and socks5.

[1017] The value tcp represents direct access (i.e. no proxy).

[613] A proxy configuration whose protocol is http, https, socks4, or socks5 has host, whose value is a host, and port, whose value is an integer or null. The initial value of the port is null.

[543] A proxy configuration whose protocol is http or https has username, whose value is a string, and password, whose value is a string or null. The initial value of the username is the empty string. The initial value of the password is null.

[614] A proxy configuration whose protocol is unix has path, whose value is a byte string.

[1315] The get proxies steps are implementation dependent. Following subsections include examples of such steps.

Proxy configurations from environment variables

[1043] This subsection applies to a user agent that supports environment variable based proxy configurations.

[1317] A user agent has following states:

HTTP proxy
A proxy configuration or null.
HTTPS proxy
A proxy configuration or null.
FTP proxy
A proxy configuration or null.
no proxy hosts
A list of hosts.

[836] Upon initialization, a user agent MUST run these steps:

  1. [1021] Set user agent's HTTP proxy to the result of parsing environment variable http_proxy.
  2. [1022] Set user agent's HTTPS proxy to the result of parsing environment variable https_proxy.
  3. [1023] Set user agent's FTP proxy to the result of parsing environment variable ftp_proxy.
  4. [1037] Let no_proxy be the result of getting the environment variable no_proxy.
  5. [1038] If no_proxy value is not null and is not the empty string:
    1. [1039] For each substring value obtained by splitting no_proxy value by a , character:
      1. [1040] Remove any leading and trailing C0 controls and space characters from value.
      2. [1041] Let host be the result of applying the host parser to value.
      3. [1042] If host is not an error, append host to user agent's no proxy hosts.

[1024] To parse an environment variable whose name is name, run these steps:

  1. [1025] Let value be the result of getting the environment variable name.
  2. [1026] If value is null or the empty string:
    1. [1027] Return null and abort these steps.
  3. [1055] Let url be the result of applying the proxy environment variable parser to value.
  4. [1030] If url's scheme is http or https:
    1. [1031] Return a proxy configuration.
      Proxy configuration
      protocol
      url's scheme
      host
      url's host
      port
      url's port
      username
      url's username
      password
      url's password
  5. [1032] Otherwise, if url's scheme is socks4 or socks5 and url's host is not null:
    1. [1033] Return a proxy configuration.
      Proxy configuration
      protocol
      url's scheme
      host
      url's host
      port
      url's port
  6. [1034] Otherwise:
    1. [1035] The user agent MAY report an error and MAY terminate the user agent.
    2. [1036] Return null.

[1045] To get an environment variable with string name, run these steps:

  1. [1047] Let value be the value of the user agent's process's environment variable whose name is name, if any, or the empty string.
  2. [1290] Let uc name be name, converted to ASCII uppercase.
  3. [1373] Let uc value be the value of the user agent's process's environment variable whose name is uc name, if any, or the empty string.
  4. [1046] If value is not the empty string and value is not uc value:
    1. [1049] Let encoding be the encoding of the platform.
    2. [1048] Return the result of decoding value in encoding.
  5. [1050] Otherwise:
    1. [1051] Return null.

[1374] For security, uppercase environment variable HTTP_PROXY cannot be used.

[1000] The get proxies steps for url are these steps:

  1. [1018] For each host host in user agent's no proxy hosts:
    1. [1019] If host equals url's host:
      1. [1020] Return a list whose only member is a proxy configuration whose protocol is tcp and abort these steps.
  2. [611] If url's scheme is http and user agent's HTTP proxy is not null:
    1. [1012] Return a list whose only member is user agent's HTTP proxy and abort these steps.
  3. [1013] If url's scheme is https and user agent's HTTPS proxy is not null:
    1. [1014] Return a list whose only member is user agent's HTTPS proxy and abort these steps.
  4. [1015] If url's scheme is ftp and user agent's FTP proxy is not null:
    1. [1016] Return a list whose only member is user agent's FTP proxy and abort these steps.
  5. [546] Return a list whose only member is a proxy configuration whose protocol is tcp.

Proxy configurations from ProxyRules

Proxy configurations from WebDriver

Proxy configurations from PAC

[1319] This subsection applies to a user agent which is configured to use a PAC script to choose appropriate proxies.

[1320] A user agent has following states, whose values can be configured by the user:

PAC URL
A URL record or null.
use WPAD flag
A boolean.

[1004] A user agent has a PAC script, which is initially null.

[1001] The user agent MUST send appropriate WPAD request if its use WPAD flag is true.

[1003] If a PAC URL is provided by WPAD processing, the user agent MUST fetch the PAC file. Otherwise, if PAC URL is not null, the user agent MUST fetch the PAC URL. When a PAC script file is fetched, the user agent's PAC script MUST be set to the file.

[1321] The get proxies steps for url are these steps:

  1. [544] If user agent's PAC script is not null:
    1. [545] Process user agent's PAC script with url.
    2. [1011] Return the result of the previous step and abort these steps.
  2. [1322] Return a list whose only member is a proxy configuration whose protocol is tcp.

Transports

[640] A transport has following states:

[408] Transport
protocol
One of tcp, unix, http1connect, http2connect, tls, socks4, and socks5.
endpoint type
Either client or server.
http protocol
Either http1, http2, or ftp. The default is http1.
proxy configuration
A proxy configuration.
送信閉じ済みフラグ
初期状態では未設定。
受信閉じ済みフラグ
初期状態では未設定。
送信待ちバッファー
初期状態では空のリスト。
request mode
The value is either default or HTTP proxy. If the request mode of a transport is HTTP proxy, a request has to be sent over the transport as an HTTP request whose request target is an absolute URL.
HTTPS state
An HTTPS state value. Either none, deprecated, or modern. The default is none.
[819] There are also protocol dependent additional states.

[38] An exit status has following states:

[469] Exit status
リセット
。既定値は
失敗
WebSocket cleanly
か null。既定値は null。
WebSocket 状態符号
整数か null。既定値は null。
WebSocket 理由
文字列か null。既定値は null。
can retry
A boolean. The default is false.

[1054] To create a transport for a proxy configuration proxy with a URL record url and optional ws and skip DNS cache flags in user agent, run rhese steps:

  1. [549] If user agent does not support proxy's protocol:
    1. [550] Return a failure and abort these steps.
  2. [551] Switch by proxy's protocol:
    tcp
    1. [552] Set effective port be the effective port of url.
    2. [553] Set addr to the result of applying name resolution steps to url's host with skip DNS cache in user agent.
    3. [554] If addr is an error:
      1. [555] Return a failure and abort these steps.
    4. [557] Wait for other connections of addr, port, and ws in user agent in user agent.
    5. [558] Return the result of establishing a TCP transport to addr and effective port.
    unix
    1. [559] Return the result of establishing a UNIX socket domain transport with proxy's path, url's host, and url's effective port.
    http or https
    1. [560] Wait for other connections of url's host, port, and ws in user agent.
    2. [561] Let proxy port be proxy's port.
    3. [562] If proxy port is null:
      1. [563] If proxy's protocol is http, set proxy port to 80.
      2. [564] If proxy's protocol is https, set proxy port to 443.
    4. [565] Let proxy addr be the result of applying name resolution steps to proxy's host in user agent.
    5. [566] If proxy addr is an error:
      1. [567] Return a failure and abort these steps.
    6. [568] Let transport be the result of establishing a TCP transport to proxy addr and proxy port.
    7. [570] If proxy's protocol is https:
      1. [571] Set transport to the result of running the TLS steps for transport and proxy's host.
    8. [556] If transport is a failure:
      1. [569] Return a failure and abort these steps.
    9. [572] If url's scheme is https:
      1. [577] Let http be an HTTP connection:
        HTTP connection
        endpoint type
        client
        transport
        transport
      2. [578] Set transport to the result of establishing an HTTP CONNECT transport with http and url.
        credentials flag and proxy credentials
      3. [579] If transport is a failure whose HTTP response's status is 407:
        1. Show proxy auth dialog
    10. [580] Otherwise:
      1. [581] Set transport's request mode to HTTP proxy.
    11. [548] Return transport.
    socks4
    1. [582] Let effective port be the effective port of url.
    2. [583] Set addr to the result of applying name resolution steps to url's host with skip DNS cache in user agent.
    3. [584] If addr is not an IPv4 address:
      1. [585] Return a failure and abort these steps.
    4. [587] Wait for other connections of addr, port, and ws in user agent.
    5. [588] Let proxy port be proxy's port.
    6. [589] If proxy port is null, set proxy port to 1080.
    7. [590] Let proxy addr be the result of applying name resolution steps to proxy's host in user agent.
    8. [591] Let transport be the result of establishing a TCP connection to proxy addr and proxy port.
    9. [592] Return the result of establishing a SOCKS4 connection with transport, addr, and effective port.
    socks5
    1. [593] Let effective port be the effective port of url.
    2. [594] Wait for other connections of url's host, port, and ws in user agent.
    3. [595] Let proxy port be proxy's port.
    4. [597] If proxy port is null, set proxy port to 1080.
    5. [596] Let proxy addr be the result of applying name resolution steps to proxy's host in user agent.
    6. [598] Let transport be the result of establishing a TCP transport to proxy addr and proxy port.
    7. [599] Return the result of establishing a SOCKS5 transport with transport, url's host, and effective port.

[634] These steps asynchronously return.

[542] To establish a transport for URL records request url and server url and a user agent user agent, optionally with credentials, ws, acceptSslCerts, and skip DNS cache flags, run these steps:

  1. [936] Assert: request url's scheme is a network scheme.
  2. [909] Assert: Either server url's scheme is http or server url is request url.
  3. [1009] Let proxies be the result of getting proxies for server url in user agent.
  4. [547] For each proxy in proxies, in order, run these substeps:
    1. [1053] Set transport to the result of creating a transport for proxy proxy with server url, ws, and skip DNS cache.
    2. [600] If transport is not a failure:
      1. [601] If request url's scheme is https:
        1. [602] Set transport to the result of running the TLS steps for transport, request url's host, credentials flag, ws flag, and acceptSslCerts flag, in user agent.
      2. [603] Otherwise, if transport's request mode is not HTTP proxy and request url's scheme is ftp:
        1. [929] Set transport's http protocol to ftp.
    3. [927] If transport is not a failure:
      1. [1182] Set transport's proxy configuration to proxy.
      2. [605] Return transport and abort these steps.
  5. [606] Return a failure.
[507] These steps asynchronously return.

[642] アプリケーションは、 transport に次の指示を行えます。

  • バイトの送信の指示
  • 正常終了の送信の指示
  • 中断の指示
  • credentials の送信の指示

[643] バイトの送信の指示は、送信するバイト (0-255 のいずれかの値)と、 緊急データか否かのフラグ (既定値は未設定。) を引数とし、次のように処理します。

  1. [644] 送信閉じ済みフラグが設定されていれば、例外を投げて停止します。
  2. [645] 送信待ちバッファーが満杯なら、例外を投げて停止します。
  3. [646] 緊急データフラグが設定されていて、 transport の種類が緊急データに対応していないものなら、 例外を投げて停止します。
  4. [647] 送信待ちバッファーの末尾に、 引数のバイト、 引数の緊急データか否かのフラグ、 約束の組を追加します。
  5. [648] 追加した約束を返します。

[649] 返された約束は、バイトが送信された際に解決されます。

[650] バイト列を送信するとは、当該バイト列について先頭のバイトから順にバイトの送信の指示を行い、最後のバイトが返した約束を返す (空バイト列なら解決済みの約束を返す) ことをいいます。

[651] 正常終了の送信の指示は、次のように処理します。

  1. [652] 送信閉じ済みフラグが設定されていれば、例外を投げて停止します。
  2. [653] 送信閉じ済みフラグを設定します。
  3. [654] transportの種類に応じた処理を行います。

[655] 中断の指示は、次のように処理します。

  1. [656] 送信閉じ済みフラグ受信閉じ済みフラグの両方が設定されていれば、 例外を投げて停止します。
  2. [657] 送信閉じ済みフラグを設定します。
  3. [658] 受信閉じ済みフラグを設定します。
  4. [659] 送信待ちバッファーの先頭の項目から順に、 約束拒絶していきます。
  5. [660] transportの種類に応じた処理を行います。
  6. [661] 中断の通知を行います。リセットフラグを設定します。

[662] credentials の送信の指示は、 transportの種類に応じた処理を実行します。そのようなものがなければ、 例外を投げます。 なお引数として、transportの種類に応じた credentials を受け取ります。

[663] transportは、アプリケーションに対して次の通知を行います。

[669] transportの種類に依存した方法で次のバイトを送信可能であると判断したら、 次のようにします。

  1. [670] 送信待ちバッファーが空なら、ここで停止します。
  2. [671] 送信待ちバッファーの先頭の項目を取得し、バッファーからは削除します。
  3. [672] transportの種類に依存した方法で取得した項目のバイトを送信します。 (あれば) 緊急データフラグを引渡します。
  4. [673] 取得した項目の約束解決します。

TCP

[1435] A transport whose protocol is tcp has following additional states:

remote host
A host.
remote port
A port.
local host
A host.
local port
A port.
tcp connection
A TCP connection.

[742] To TCP connect to host host and port port, establish a connection to host and port as described in TCP specifications and asynchronously returns a new TCP connection representing the connection if the connection is established, or failure if the connection cannot be established. A TCP connection has local address, which is an IP address, and local port, which is a port.

[1437] To set TCP options of TCP connection tcp, run these steps:

  1. [420] Disable the SO_OOBINLINE option of tcp.
  2. [424] Enable the SO_NODELAY option of tcp.
  3. [437] Run the implementation dependent steps for setting TCP keep alive options, e.g.:
    1. [635] Enable the SO_KEEPALIVE option of tcp.
    2. [636] Set TCP_KEEPIDLE option of tcp to 45 seconds.
    3. [637] Set TCP_KEEPINTVL option of tcp to 45 seconds.

[627] To establish a TCP transport to IP address addr and port port, run these steps:

  1. [1416] If addr is 127.0.53.53:
    1. [1417] Return a failure and abort these steps.
  2. [628] Let tcp be the result of invoking TCP connect with addr and port.
  3. [629] If tcp is failure:
    1. [782] Return failure and abort these steps.
  4. [674] Let transport be a new transport:
    [406] Transport
    protocol
    tcp
    endpoint type
    client
    remote host
    addr
    remote port
    port
    local host
    tcp's local address
    local port
    tcp's local port
    tcp connection
    tcp
  5. [641] Set TCP options of tcp.
  6. [818] Return transport.
[510] These steps asynchronously return.

[411] Whenever it accepts a TCP connection tcp from IP address remote addr and port remote port, a TCP server listening IP address addr and port port MUST run the TCP after accept steps with tcp, addr, port, remote addr, and remote port.

[524] The TCP after accept steps with TCP connection tcp, IP address addr, port port, IP address remote addr, and port remote port are:

  1. [414] Let transport be a new transport representing the TCP connection, with following states:
    [417] Transport
    protocol
    tcp
    endpoint type
    server
    remote host
    remote addr
    remote port
    remote port
    local host
    addr
    local port
    port
    tcp connection
    tcp
  2. [1436] Set TCP options of tcp.
  3. [460] Optionally, run implementation dependent steps (e.g. DoS protection).
  4. [446] Return transport.

[676] TCPセグメントを受信したら、次のようにします。

  1. [677] TCP に従い処理し、不適切と判断すればここで停止します。
  2. [678] RST フラグが設定されていれば、
    1. [679] 送信閉じ済みフラグを設定します。
    2. [680] 受信閉じ済みフラグを設定します。
    3. [681] 中断を通知します。リセットフラグを設定します。
  3. [682] データの各バイトについて、順に、
    1. [683] バイトの受信を通知します。当該バイトの値を渡します。 緊急ポインターが本バイトを指していれば、緊急データフラグも設定します。
  4. [684] FIN フラグが設定されていれば、
    1. [685] 受信閉じ済みフラグを設定します。
    2. [686] 正常終了の受信を通知します。

[687] タイムアウトその他の理由でtransportが利用できないことを検知したら、 次のようにします。

  1. [688] 送信閉じ済みフラグを設定します。
  2. [689] 受信閉じ済みフラグを設定します。
  3. [690] 中断を通知します。

[691] バイトを送信できるかどうかは、フロー制御輻輳制御その他の状況により決定します。

[692] バイトの送信は、次のようにします。

  1. [693] 緊急データフラグが設定されていれば、
    1. [694] 指定されたバイトをデータとして含み、緊急ポインターが当該バイトを指すセグメントを送信することにします。
  2. [695] それ以外なら、
    1. [696] 指定されたバイトをデータとして含むセグメントを送信することにします。

[697] 実際の送信時には、前後のバイトとまとめたセグメントで送信されたり、 必要に応じて再送されたりします。

[698] 緊急データに対応しています。

[699] 正常終了の送信の指示があれば、次のようにします。

  1. [700] FIN フラグが設定されたセグメントを送信することにします。

[701] 中断の指示があれば、次のようにします。

  1. [702] 必要に応じて FIN フラグが設定されたセグメントを送信することにします。
  2. [703] TCP で受信したデータの処理を以後行わないことにします。

HTTP CONNECT

[633] A transport whose protocol is http1connect or http2connect has following additional states:

http
An HTTP connection.
established
A boolean. Initially, false.

[739] To establish an HTTP CONNECT transport with HTTP connection http and URL record url, run these steps:

  1. [740] Let transport be a transport:
    [632] Transport
    protocol
    If http's protocol is http2, http2connect. Otherwise, http1connect.
    endpoint type
    client
    http
    http
  2. [766] Send an HTTP request over http:
    method
    CONNECT
    request target
    url's hostport
    header list
    Host
    url's hostport
    Proxy-Connection
    keep-alive
    User-Agent
    default `User-Agent` value
  3. [741] If failed, return a failure and abort these steps.
  4. [817] Process notifications from http as follows:
    [744] 要求のヘッダー受信完了の通知
    1. [745] 応答の状態符号が 200 なら、
      1. [746] Set transport's established to true.
      2. [747] Return transport.
    2. [748] Otherwise:
      1. [749] Return a failure.
    [750] 要求data の通知
    1. [751] If transport's established is true:
      1. [752] データの各バイトについて、順に、
        1. [753] バイトの受信を通知します。当該バイトの値を渡します。
    [754] 要求dataend の通知
    1. [755] If transport's established is true:
      1. [756] 受信閉じ済みフラグを設定します。
      2. [757] 正常終了の受信を通知します。
    [758] 要求の完了の通知
    1. [759] If connection's exit status's 失敗 is true:
      1. [760] If transport's established is true:
        1. [761] 送信閉じ済みフラグを設定します。
        2. [762] 受信閉じ済みフラグを設定します。
        3. [763] 中断を通知します。
      2. [764] Otherwise:
        1. [765] Return a failure.

[738] XXX server accept steps

[767] バイトは常に送信可能とします。

[768] バイトの送信は、次のようにします。

  1. [769] transport's http でトンネルに指定されたバイトを送信します。

[770] 正常終了の送信の指示があれば、次のようにします。

  1. [771] transport's http に接続の正常終了を指示します。

[772] 中断の指示があれば、次のようにします。

  1. [773] transport's http に中断を指示します。

HTTP/2

SOCKS4

[743] A transport whose protocol is socks4 has following additional state:

transport
A transport.

[774] To establish a SOCKS4 transport to IPv4 address address and port port over transport transport, run these steps:

  1. [776] transportで 0x04 0x01 p1 p2 a1 a2 a3 a4 0x00 を送信します。
  2. [777] transportから8バイト受信するのを最大30s待ちます。
  3. [778] 受信した最初の2バイトが 0x00 0x5A でなければ、
    1. [779] transportの中断を指示します。
    2. [780] Return a failure and abort these steps.
  4. [781] Return a new transport:
    [630] Transport
    protocol
    socks4
    endpoint type
    client
    transport
    transport
[511] These steps asynchronously return.

[783] 接続確立後は、指示はtransportへの指示とし、 transportからの通知があればそれを通知します。

SOCKS5

[775] A transport whose protocol is socks5 has following additional state:

transport
A transport.

[784] To establish a SOCKS5 transport to destination host and port port over transport transport, run these steps:

  1. [785] If host is a domain whose length is greater than 255:
    1. [803] Return a failure and abort these steps.
  2. [786] transportで 0x05 0x01 0x00 を送信します。
  3. [787] transportから2バイト受信するのを最大30s待ちます。
  4. [788] 受信したのが 0x05 0x00 でなければ、
    1. [789] transportの中断を指示します。
    2. [790] Return a failure and abort these steps.
  5. [791] transportで 0x05 0x01 0x00 A p1 p2 を送信します。
  6. [792] transportから5バイト受信するのを最大30s待ちます。
  7. [793] 受信した最初の3バイトが 0x05 0x00 0x00 でないか、 第4バイトが 0x01, 0x03, 0x04 のいずれでもないか、 5バイトに満たなければ、
    1. [794] transportの中断を指示します。
    2. [795] Return a failure and abort these steps.
  8. [796] 第4バイトが 0x01 なら、transportから5バイト受信するのを最大30s待ちます。
  9. [797] 第4バイトが 0x03 なら、第5バイトを8ビット符号無し整数として解釈し、 transportからそのバイト数 + 2 バイト分受信するのを最大30s待ちます。
  10. [798] 第4バイトが 0x04 なら、transportから17バイト受信するのを最大30s待ちます。
  11. [799] 得られたのが指定のバイト数に満たなければ、
    1. [800] transportの中断を指示します。
    2. [801] Return a failure and abort these steps.
  12. [802] Return a transport:
    [576] Transport
    protocol
    socks5
    endpoint type
    client
    transport
    transport
[520] These steps asynchronously return.

[804] 接続確立後は、指示はtransportへの指示とし、 transportからの通知があればそれを通知します。

Unix domain sockets

[805] To establish a Unix domain socket connection for byte string path with host host and integer port, run these steps:

  1. [807] ソケットAPIを使って新たに接続します。
    アドレス族
    AF_UNIX
    パス名
    path
    ソケット型
    SOCK_STREAM
  2. [806] If failed, return a failure and abort these steps.
  3. [820] Return a new transport representing the socket, with following states:
    [631] Transport
    protocol
    unix
    endpoint type
    client
[522] These steps asynchronously return.

[604] A Unix domain socket server, whenever it accepts a connection, MUST run the Unix domain socket after accept steps.

[586] The Unix domain socket after accept steps are:

  1. [608] Let transport be a new transport representing the Unix domain socket connection, with following states:
    [620] Transport
    protocol
    unix
    endpoint type
    server
  2. [675] Return transport.

[810] バイトが送信可能かどうかは、 send によりバイト列を送信できるかどうかとします。

[811] バイトの送信は、 send によります。

[812] 正常終了の送信の指示があれば、 shutdown SHUT_WR を実行します。

[813] 中断の指示があれば、 shutdown SHUT_RDWR を実行します。

[814] recv によりバイト列を受信したら、 各バイトを順に、バイトの受信を通知します。

[815] recv で何も受信しなくなれば、 送信閉じ済みフラグを設定し、正常終了の受信を通知します。

[816] sendrecv でエラーが発生したら、 送信閉じ済みフラグ受信閉じ済みフラグを設定し、 中断を通知します。

TLS

[877] A transport whose protocol is tls has following additional states:

is ev
A boolean. The default is false.
remote certificates
A list of certificates.
has alert
A boolean. The default is false.

[638] The TLS steps for transport, url, and credentials, with optional ws and acceptSslCerts flags, in user agent are as follows:

  1. credentials
  2. [878] If ws is true:
    1. [879] Set alpn protocols to (http/1.1).
  3. [880] Otherwise:
    1. [881] Set alpn protocols to (h2, http/1.1).
    2. If switched from HTTP/2 to HTTP/1.1
  4. [356] Initiate TLS handshake.
    Minimum TLS version
    1.0
    Underlying transport
    transport
    Compression
    Disabled
    TLS session cache
    user agent's TLS session cache
    SNI host
    If url's host is a domain, url's host. Otherwise, null.
    Use OCSP stapling request
    true
    ALPN protocol names
    alpn protocols
    Certificate database
    user agent's certificate database
    Additional verification for server certificate cert
    Return the result of running the service identity verification steps with url's host and cert.
  5. [861] If failed, return a failure and abort these steps.
  6. [865] Let alpn be the ALPN protocol name obtained by the TLS handshake.
  7. [872] Let version be the TLS protocol version in use.
  8. [873] Let cipher be the cipher suite and parameters in use.
  9. [866] If alpn is null or http/1.1:
    1. [867] Set protocol to http1.
  10. [868] Otherwise, if alpn is h2:
    1. [869] Set protocol to http2.
    2. [885] If one of the following conditions is met:
      1. connection error INADEQUATE_SECURITY
      2. [886] Return a failure and abort these steps.
  11. [870] Otherwise:
    1. [871] Return a failure and abort these steps.
  12. [874] Let certs be the received certificates.
  13. [876] Let ev be whether certs contain a valid EV certificate or not.
  14. [985] Let ocsp be the OCSP stapling response, if any, or null.
  15. [993] For each cert in certs's CA certificates:
    1. [994] If the result of running the certificate revocation verification steps with certificate set to cert, certificate type set to CA certificate, and ocsp set to null, is false:
    2. [704] Return a failure and abort these steps.
  16. [862] If the result of running the certificate revocation verification steps with certificate set to certs's end entity certificate, certificate type set to end entity, and ocsp, is false:
    1. [704] Return a failure and abort these steps.
  17. [705] Apply PKP verification for certs and url's host in user agent.
  18. [860] Let tls transport be a new transport that represents the TLS connection, with following states:
    [1423] Transport
    protocol
    tls
    endpoint type
    client
    http protocol
    protocol
    is ev
    ev
    remote certificates
    certs
  19. [859] Set tls transport's HTTPS state to modern or deprecated, as determined by an implementation dependent algorithm whose inputs are version, cipher, certs, and whether there are TLS warnings or not.
  20. [906] Return tls transport.

[1376] If acceptSslCerts flag is set, ignore verification errors.
[941] When SNI host is null, the TLS client is not expected to send any SNI extension in the handshake.

[895] The certificate revocation verification steps for certificate (a certificate), certificate type (CA certificate or end entity certificate), and ocsp (an OCSP response or null) are these steps:

  1. [864] If the user agent's certificate database knows whether cert has been revoked or not:
    1. [875] Return true if cert has been revoked, or false otherwise, and abort these steps.
  2. [937] If ocsp is a valid OCSP response:
    1. [999] Return true if cert has been revoked according to ocsp, or false otherwise, and abort these steps.
  3. [989] Otherwise, if cert has the OCSP must-staple option enabled:
    1. [940] Return false and abort these steps.
  4. [990] Let duration be cert's notAfter timestamp - cert's notBefore timestamp.
  5. [991] If duration is less than 10 days (i.e. cert is a short-lived certificate):
    1. [992] Return true and abort these steps.
  6. [863] Let ocsp url be cert's OCSP URL.
  7. [995] If ocsp url is not null, the implementation MAY run these substeps:
    1. [996] Send an OCSP request for cert to ocsp url. Set ocsp to the result.
    2. [997] If ocsp is a valid OCSP response:
      1. [986] Let result be true if cert has been revoked according to ocsp, or false otherwise.
      2. [998] Optionally, save result to the user agent's certificate database as the cached verification result for cert.
      3. [988] Return result and abort these steps.
  8. unset EV flag (and set HTTPS state to deprecated?)
  9. [987] Return true.

[523] These steps asynchronously return.
[939] is EV flag

[384] A user agent has TLS session cache and certificate database.


[923] A TLS server, whenever its underlying transport accepts a connection, MUST run these steps:

  1. [928] Assert: The underlying transport protocol is TCP or Unix domain socket.
  2. [925] Let transport be the result of running TCP after accept steps, if the underlying transport protocol is TCP, or Unix domain socket after accept steps, otherwise.
  3. [1424] Start TLS over transport.
    • [706] Optionally, perform implementation dependent verification of the client certificates.
    • OCSP stapling
  4. If failed, ...
  5. [1433] Let protocol be http/1.1.
  6. ALPN: H2
  7. [1431] Let certs be the received certificates.
  8. [1426] Let tls transport be a new transport that represents the TLS connection, with following states:
    [1430] Transport
    protocol
    tls
    endpoint type
    server
    http protocol
    protocol
    remote certificates
    certs
  9. Verify TLS version and cipher suites.
  10. [1434] Return transport.
[1427] These steps asynchronously return.

[707] transportからバイトを受信したら、バイト緊急データフラグを TLS に従い処理します。

[708] closure alert を受信したら、次のようにします。

  1. [709] 正常終了の受信を通知します。

[710] error alert を受信したら、次のようにします。

  1. [891] Set connection's has alert to true.
  2. [711] alert level警告 and user agent does not have HSTS policy or pin for url's host:
    1. [712] 警告を通知します。
  3. [713] それ以外なら、
    1. [714] 送信閉じ済みフラグを設定します。
    2. [715] 受信閉じ済みフラグを設定します。
    3. [716] 中断を通知します。リセットフラグを設定します。

[717] transportから正常終了を受信したら、次のようにします。

  1. [718] 受信閉じ済みフラグが設定されていなければ、
    1. [719] 受信閉じ済みフラグを設定します。
    2. [720] 正常終了の受信を通知します。

[721] transportから中断を受信したら、次のようにします。

  1. [722] 受信閉じ済みフラグ送信閉じ済みフラグのどちらかが未設定なら、
    1. [723] 送信閉じ済みフラグを設定します。
    2. [724] 受信閉じ済みフラグを設定します。
    3. [725] 中断を通知します。

[726] バイトの送信は、 TLS に従い処理します。

[727] バイトを送信できるかどうかは、新たなバイトを入力として TLS で処理できるかどうかとします。

[728] 正常終了の送信の指示があれば、次のようにします。

  1. [729] closure alert を送信します。
  2. [730] transportに正常終了の送信を指示します。

[731] 中断の指示があれば、transportに中断を指示します。

[732] TLS の処理によりバイト列を送信するべきときは、 transportで指定されたバイト列を送信します。

[889] TLS renegotiation: If protocol is http2 and after preface, connection error PROTOCOL_ERROR

[733] TLS の最初の handshake または再折衝によりクライアント証明書を要求された時は、 次のようにします。

  1. [734] challenge の受信を通知します。
    transport
    transport
    challenge
    (サーバーなら) ClientHello や (クライアントなら) CertificateRequest に含まれる情報のうち必要なもの。

[735] credentials の送信は、次のようにします。

  1. [736] TLScredentials を受け付ける状態でなければ、例外を投げて停止します。
  2. [737] そうでなければ、与えられた credentialsTLS の処理に引渡します。

HTTP/1

[355] An HTTP connection has following states:

endpoint type
client or server.
transport
A transport.

[34] An HTTP connection whose protocol is http1 has following additional states:

状態
後述の状態遷移における状態のいずれか。初期値は「初期」。
write mode
One of null, "raw", "websocket", or "sent". Initially, null.
to be closed
A boolean. Initially, false.
要求
要求か null。初期値は null です。
応答
応答か null。初期値は null です。
一時バッファー
バイト列。初期値は空。
最後のヘッダー
ヘッダーか null
残り長さ
非負整数か null か「chunked」かエラー。
response received
A boolean. Initially, true.
要求の転送済
非負整数。初期値は 0。
要求の処理完了
Promise か null。初期値は null。
WebSocket key
A byte string or null. Initially, null.
WebSocket接続の状態
CONNECTINGOPENCLOSING、null のいずれか。初期値は null。
フレーム
WebSocketフレームまたは null。初期値は null。
WebSocket data type
Text, Binary, or null. Initially, null.
decoder
A TextDecoder or null. Initially, null.
exit status
An exit status or null. Initially, null.
切断タイマー
タイマー。
stream request method
A byte string or null. Initially, null.
stream WebSocket subprotocols
An ordered set of zero or more byte strings. Initially, an empty set.
stream received
A boolean. Initially, false.
stream sent
A boolean. Initially, false.

[314] タイマーは、初期状態では動作していません。時間と動作が設定されると、 指定時間経過後に指定の動作が実行されます。既に設定された動作は取り消され、実行されません。

[62] 要求は、次のようなデータ構造です。

要求
要求メソッド
バイト列。
要求対象
バイト列。
プロトコルの版
1.1
ヘッダーリスト
0個以上のヘッダーのリスト。
本体
バイト列。初期値は空。
mode
A mode value.
WebSocket subprotocols
An ordered set of zero or more byte strings. Initially, an empty list.

[63] 応答は、次のようなデータ構造です。

応答
プロトコルの版
0.9, 1.0, 1.1 のいずれか。初期値は 0.9
状態符号
非負整数。初期値は 200
理由句
バイト列。初期値は OK
ヘッダーリスト
0個以上のヘッダーのリスト。初期値は空。
incomplete message
A boolean. Initially, false.

アプリケーションからの指示

[42] 要求の送信は、次のようにします。この処理は、 connection and 要求である送信する要求を入力として受け取ります。

  1. [90] Assert: The following conditions have to be true:
  2. [61] 要求を、送信する要求に設定します。
  3. [135] Set connection's stream request method to 送信する要求's 要求メソッド.
  4. [64] 応答を、新しい応答に設定します。
  5. [60] 一時バッファーを、空バイト列に設定します。
  6. [59] 状態を、「応答前」に設定します。
  7. [77] 要求Connection: ヘッダーがあって close (ASCII大文字・小文字不区別) 接続オプションが指定されていれば、
    1. [78] Set connection's to be closed flag to true.
  8. [98] If 要求's mode is websocket:
    1. [258] Set connection's WebSocket接続の状態 to CONNECTING.
    2. [1331] Set connection's WebSocket key be a nonce consisting of a randomly selected 16-byte value that has been forgiving-base64 encoded.
    3. [265] Append `Sec-WebSocket-Key`/connection's WebSocket key to 要求's header list.
    4. [266] Append `Sec-WebSocket-Version`/`13` to 要求's header list.
    5. [1332] For each protocol in 要求's WebSocket subprotocols, combine `Sec-WebSocket-Protocol`/protocol in 要求's header list.
    6. [264]
      Let permessageDeflate be a user-agent defined "permessage-deflate" extension header value.
    7. [1333] Append `Sec-WebSocket-Extensions`/permessageDeflate to 要求's header list.
    8. [57] Set connection's write mode to "websocket".
    9. [241] Set connection's stream WebSocket subprotocols to 要求's WebSocket subprotocols.
  9. [491] Otherwise, if connection's stream request method is CONNECT:
    1. [498] Set connection's write mode to "before tunnel data".
  10. [35] Otherwise:
    1. [57] Set connection's write mode to "raw".
  11. [45] 要求の処理完了を、新しい Promise に設定します。
  12. [48] 要求の処理完了を返します。
  13. [46] 並列に要求のバイト列の送信を行います。

[25] ここで要求のバイト列の送信は、次のようにします。

  1. [47] HTTP/1.1 に従い要求ヘッダー部 (空行の CRLF まで) を表すバイト列の各バイトを順に、
    1. connection's transportバイトの送信を指示します。
    2. エラーが返されたら、ここで停止します。
  2. [1] 要求メッセージ本体が存在する場合、各バイトを順に、
    1. connection's transportバイトの送信を指示します。
    2. エラーが返されたら、ここで停止します。
    3. 要求の転送済を、1だけ大きな値に設定します。
    4. 要求について要求の本体の一部の送信を通知して構いません。
  3. [75] Run the sent steps for connection.

[259] WebSocket メッセージ送信は、次のようにします。 この処理は、バイト列であるデータと、テキストまたはバイナリーのいずれかの種別を引数として受け取ります。

  1. [278] 前提として、次の条件を満たす必要があります。
    • [289] データの長さは 263 未満かつ実装の扱える範囲内である
  2. [271] WebSocket接続の状態OPEN でなければ、 エラーを返して停止します。
  3. [268] WebSocketフレームを作成します。
    FIN
    1
    RSV1
    0
    RSV2
    0
    RSV3
    0
    opcode
    種別がテキストなら 1、バイナリーなら 2
    mask
    1
    長さ
    データのバイト数
    マスクキー
    無作為に決定した4バイトのバイト列
    データ
    データ
  4. [269] 作成した WebSocketフレームのデータの各バイトについて、 先頭から i バイト目 (先頭が0バイト) であれば、 マスクキーi mod 4 バイト目 (先頭が0バイト) と XOR した結果に差し替えます。
  5. [270] connection's transportWebSocketフレームのバイト列を送信することとします。

[260] ping 送信は、次のようにします。 この処理は、バイト列であるデータと、応答フラグを受け取ります。

  1. [287] 前提として、次の条件を満たす必要があります。
    • [288] データの長さは 263 未満かつ実装の扱える範囲内である
  2. [272] WebSocket接続の状態OPEN でなければ、 エラーを返して停止します。
  3. [273] WebSocketフレームを作成します。
    FIN
    1
    RSV1
    0
    RSV2
    0
    RSV3
    0
    opcode
    応答フラグが設定されていれば 10、されていなければ 9
    mask
    1
    長さ
    データのバイト数
    マスクキー
    無作為に決定した4バイトのバイト列
    データ
    指定されたバイト列
  4. [274] 作成した WebSocketフレームのデータの各バイトについて、 先頭から i バイト目 (先頭が0バイト) であれば、 マスクキーi mod 4 バイト目 (先頭が0バイト) と XOR した結果に差し替えます。
  5. [275] connection's transportWebSocketフレームのバイト列を送信することとします。

[107] If a request whose method is CONNECT has been sent and a response whose status is 200 has been received, and the connection is not yet closed, one or more bytes can be sent over the connection. That is, to send a byte string bytes over tunnel connection connection, run these steps:

  1. [335] Assert:
    In CONNECT mode
  2. [109] connection's transportbytes の送信を指示します。
  3. [110] エラーが返されたら、ここで停止します。

[1443] To close a tunnel connection connection, run these steps:

  1. [1444] Run the sent steps for connection with close flag set to true.

[50] WebSocket connection の正常終了は、次のようにします。引数として非負整数または null である状態符号と、 バイト列である理由を受け取ります。

  1. [286] Assert:
  2. [49] If WebSocket接続の状態 is CLOSING:
    1. [277] Abort these steps.
  3. [281] WebSocketフレームを作成します。
    FIN
    1
    RSV1
    0
    RSV2
    0
    RSV3
    0
    opcode
    8
    mask
    1
    長さ
    データのバイト数
    マスクキー
    無作為に決定した4バイトのバイト列
    データ
    状態符号が null なら空、 そうでなければ、状態符号を表す16ビット符号無し整数 (ネットワークバイト順) と、 それに続けて理由
  4. [282] 作成した WebSocketフレームのデータの各バイトについて、 先頭から i バイト目 (先頭が0バイト) であれば、 マスクキーi mod 4 バイト目 (先頭が0バイト) と XOR した結果に差し替えます。
  5. [297] WebSocket接続の状態を、 CLOSING に設定します。
  6. [174] 要求について、 wsclosing を通知します。
  7. [284] connection's transport で、作成した WebSocketフレームのバイト列を送信することとします。
  8. [315] 切断タイマーにより20s後に次の要求に進むことにします。

[73] To close connection connection, run these steps:

  1. [108] Assert:
    Not sending a body, CONNECT, or WS mode
  2. [72] Set connection's to be closed flag to true.
  3. [66] 状態が「初期」か「要求待ち」なら、
    1. [55] connection's transport で正常終了の送信を指示します。

[52] 接続の中断は、次のようにします。

  1. [39] Set the connection's exit status to a new exit status whose 失敗 is true.
  2. Abort the writable stream
  3. [44] Run the sent steps for connection with close flag set to true.
  4. Cancel the readable stream

アプリケーションへの通知

[11] 状態機械は、要求について次の通知を行います。 それぞれ、次に示す引数 (あれば) 付きで通知されます。

[15]要求について、2種類の送信の通知と3種類の受信の通知をそれぞれこの順序で行うか、 その途中で失敗の通知で中断するかのいずれかです。 送信の通知と受信の通知はどちらもそれぞれ進行し、相互の順序は不定です。 送信の完了は通知されないことがあります (失敗の場合)。 data の通知は、0回以上の任意の回数行います。 data の通知のかわりに 0回以上の ping の通知がある場合があります。 トンネルでは最初に datastart の通知、最後に dataend の通知があります。 完了の通知の前に、 wsclosing の通知があるかもしれません。

initial
要求の送信
v
>>
3
->
reqbody
->
reqeof
->
headers
->
rerror
->
reset
reqbody
本体一部送信
->
reqbody
->
reqeof
v
>>
2
->
rerror
->
reset
reqeof
送信完了
v
>>
1
->
reset
headers
ヘッダー受信
v
>>
3
->
body
->
complete
->
reset
body
受信
v
>>
4
->
complete
->
body
->
reset
complete
完了 (成功)
v
>>
3
reset
完了 (失敗)
>>
5
[253] 図の「受信」は、 data 、ping の受信、 wsclosing, datastart, dataend を表します。

The state machine

[68] クライアント状態機械を持ちます。

[53] connection's transportバイト受信の通知があると、次のようにします。 ただし、状態が「初期」なら、状態が変化するまで待ってから実行します。

  1. [14] 緊急データフラグが設定されていなければ、
    1. [37] 状態により決まる処理を行います。

[40] 正常終了の受信の通知があると、次のようにします。

  1. [54] 状態により決まる正常終了処理を行います。

[13] 中断の通知があると、次のようにします。

  1. [359] リセットフラグが設定されていれば、
    1. [328] Connection error connection with a new exit status whose リセット and 失敗 are true.
  2. [41] Otherwise:
    1. [525] 状態により決まる中断処理を行います。

[252] WebSocketフレームは、次のようなデータ構造です。

WebSocketフレーム
FIN
0 か 1。
RSV1
0 か 1。
RSV2
0 か 1。
RSV3
0 か 1。
opcode
0-15 の整数
mask
0 か 1。
長さ
非負整数
マスクキー
4バイトのバイト列または null。
データ
バイト列または文字列

「初期」状態

[69] 正常終了か中断を受信したら、

  1. [366] Connection error connection with a new exit status whose 失敗 is 中断.

「要求待ち」状態

[2] バイトを受信したら、何もせずに無視します。

[33] 正常終了か中断を受信したら、

  1. [326] Connection error connection with a new exit status whose 失敗 is 中断.

「要求送信中」状態

[56] バイトを受信したら、何もせずに無視します。

[67] 正常終了 or 中断を受信したら、

  1. [360] If 失敗:
    1. [76] Connection error connection with a new exit status (whose 失敗 is false).
  2. [361] Otherwise:
    1. [368] 次の要求に進みます。

「応答前」状態

[24] バイトを受信したら、

  1. [130] Set connection's response received to true.
  2. [26] 受信したバイトを、一時バッファーの末尾に連結します。
  3. [27] 一時バッファーの末尾4バイトが HTTP (ASCII大文字・小文字不区別) なら、
    1. 応答プロトコルの版を 1.0 に設定します。
    2. 状態を、「応答ヘッダー」に設定します。
    3. 一時バッファーを、空に設定します。
  4. [28] それ以外で、一時バッファーの長さが8バイトなら、
    1. [236] If connection's stream request method is PUT or CONNECT:
      1. [320] Connection error connection.
    2. [237] Otherwise:
      1. [367] 要求について datastart を通知します。
      2. [922] 要求について data を通知します。一時バッファーを引渡します。
      3. [452] 残り長さを、 null に設定します。
      4. [485] 状態を、「応答本体」に設定します。

[8] 正常終了か中断を受信したら、

  1. [132] 一時バッファー空文字列なら、
    1. [133] Let exit status be a new exit status whose 失敗 is true.
    2. [434] If not 中断 and connection's response received is false:
      1. [915] Set exit status's can retry to true.
    3. [136] Connection error connection with exit status.
  2. [240] If connection's stream request method is PUT or CONNECT:
    1. [363] Connection error connection.
  3. [924] Otherwise:
    1. [280] Run the headers received steps for connection.
    2. [920] 要求について datastart を通知します。
    3. [530] 要求について data を通知します。一時バッファーを引渡します。
    4. [918] 中断なら、
      1. [919] Set connection's response's incomplete message flag to true.
    5. [921] 要求について dataend を通知します。
    6. [141] If 中断:
      1. [142] Connection error with a new exit status (whose 失敗 is false).
    7. [322] Otherwise:
      1. [926] Set connection's to be closed flag to true.
      2. [438] 次の要求に進みます。

「応答ヘッダー」状態

[36] バイトを受信したら、

  1. 一時バッファーの末尾に受信したバイトを追加します。
  2. 一時バッファーの末尾が 0x0A 0x0A または 0x0A 0x0D 0x0A なら、
    1. [137] ヘッダーの処理 (>>138) を行います。
  3. それ以外で、 一時バッファーの長さが 218‐1 なら、
    1. [364] Connection error connection.

[12] 正常終了か中断を受信したら、

  1. [139] Connection error connection with a new exit status whose 失敗 is true.

[138] ヘッダーの処理は、次のようにします。

  1. [140] 一時バッファーをヘッダー群として構文解析します。
  2. [113] 応答プロトコルの版1.1 で、 Transfer-Encoding: ヘッダーがあって、 chunked (ASCII大文字・小文字不区別) が転送符号化として指定されていれば、
    1. [114] 残り長さを、「chunked」に設定します。
  3. [115] それ以外なら、
    1. [32] 残り長さを、応答Content-Length: ヘッダーの処理の結果とします。
  4. [448] 残り長さがエラーなら:
    1. [449] Connection error connection.
  5. [540] Otherwise, if connection's stream request method is CONNECT and 応答状態符号200 なら、
    1. [290] Run the headers received steps for connection, with tunnel flag set to true.
    2. [374] 要求について datastart を通知します。
    3. [375] Set connection's to be closed flag to true.
    4. [376] 状態を、「トンネル」に設定します。
    5. [362] Set 残り長さ to null.
  6. [143] それ以外で、WebSocket接続の状態CONNECTING で、 応答状態符号101 なら、
    1. [144] If one of following conditions are true:
      ... then run these substeps:
      1. [294] Run the headers received steps for connection.
      2. [248] Let exit status be a new exit status:
        Exit status
        失敗
        cleanly
        状態符号
        1006
        理由
        空文字列
      3. [245] Connection error connection with exit status.
    2. [146] それ以外なら、
      1. [291] WebSocket接続の状態を、 OPEN に設定します。
      2. [296] Run the headers received steps for connection, with WebSocket flag set to true.
      3. [292] Set connection's to be closed flag to true.
      4. [293] 状態を、「WebSocketフレーム前」に設定します。
      5. [147] 一時バッファーを、空に設定します。
  7. [106] それ以外で、 応答状態符号1xx なら、
    1. [337] If connection's stream request method is CONNECT or WebSocket接続の状態CONNECTING なら、
      1. [224] Connection error connection.
    2. [341] それ以外なら、
      1. [342] 応答プロトコルの版状態符号理由句ヘッダーリストを初期値に設定します。
      2. [382] 状態を、「応答前」に設定します。
      3. [383] 一時バッファーを、空バイト列に設定します。
  8. [344] それ以外なら、
      1. [316] Run the headers received steps for connection.
    1. [385] 要求について datastart を通知します。
    2. [346]
      ... のいずれかの場合、
      1. [347] 残り長さを、0に設定します。
    3. [87] 残り長さが 0 なら、
      1. [79] 応答Connection: ヘッダーがあって close (ASCII大文字・小文字不区別) 接続オプションが指定されていれば、
        1. [80] Set connection's to be closed flag to true.
      2. [81] それ以外で、応答プロトコルの版1.0 で、 keep-alive (ASCII大文字・小文字不区別) 接続オプションが指定された Connection: ヘッダーがなければ、
        1. [82] Set connection's to be closed flag to true.
      3. [343] 次の要求に進みます。
    4. [116] それ以外で、 残り長さが「chunked」なら、
      1. [117] 状態を、「塊前」に設定します。
    5. [88] それ以外なら、
      1. [16] 状態を、「応答本体」に設定します。

[295] The headers received steps for connection, with optional WebSocket and tunnel flags (both defaulted to false) are these steps:

  1. [319] If connection's write mode is "before tunnel data":
    1. [256] If tunnel is true:
      1. [345] Set connection's write mode to "raw".
    2. [373] Otherwise:
      1. [490] Run the sent steps for connection.
  2. [145] 要求について応答のヘッダー受信完了を通知, with WebSocket connection established set to WebSocket.

「応答本体」状態

[6] バイトを受信したら、

  1. [451] 要求について data を通知します。受信したバイトを引渡します。
  2. [453] 残り長さなら、
    1. [454] 残り長さを1減らします。
    2. [386] 残り長さが0なら、
      1. [387] 要求について dataend を通知します。
      2. [83] 応答Connection: ヘッダーがあって close (ASCII大文字・小文字不区別) 接続オプションが指定されていれば、
        1. [84] Set connection's to be closed flag to true.
      3. [85] それ以外で、応答プロトコルの版1.0 で、 keep-alive (ASCII大文字・小文字不区別) 接続オプションが指定された Connection: ヘッダーがなければ、
        1. [86] Set connection's to be closed flag to true.
      4. [244] 次の要求に進みます。

[7] 正常終了か中断を受信したら、

  1. [388] 残り長さなら、
    1. [389] Set connection's response's incomplete message flag to true.
    2. [395] 要求について dataend を通知します。
    3. [455] Let exit status be a new exit status.
    4. [391] 応答プロトコルの版1.1 or 中断:
      1. [392] Set exit status's 失敗 to true.
    5. [134] Connection error connection with exit status.
  2. [390] Otherwise, 残り長さ is 0:
    1. [441] 要求について dataend を通知します。
    2. [442] If 中断:
      1. [444] Connection error connection with a new exit status (whose 失敗 is false).
    3. [445] Otherwise:
      1. [470] Set connection's to be closed flag to true.
      2. [477] 次の要求に進みます。
  3. [400] Otherwise:
    1. [396] If 中断:
      1. [916] Set connection's response's incomplete message flag to true.
    2. [401] 要求について dataend を通知します。
    3. [397] If 中断:
      1. [398] Connection error connection with a new exit status (whose 失敗 is false).
    4. [399] Otherwise:
      1. [403] Set connection's to be closed flag to true.
      2. [404] 次の要求に進みます。

「塊前」状態

[118] バイトを受信したら、

  1. [394] ASCII十六進数字なら、
    1. [456] 一時バッファーを、指定されたバイトに設定します。
    2. [457] 状態を、「塊サイズ」に設定します。
  2. [458] それ以外なら、
    1. [917] Set connection's response's incomplete message flag to true.
    2. [405] 要求について dataend を通知します。
    3. [246] Connection error connection with a new exit status (whose 失敗 is false).

[119] 正常終了か中断を受信したら、

  1. [459] Set connection's response's incomplete message flag to true.
  2. [407] 要求について dataend を通知します。
  3. [254] Connection error connection with a new exit status (whose 失敗 is false).

「塊サイズ」状態

[120] バイトを受信したら、

  1. [462] ASCII十六進数字なら、
    1. [463] 一時バッファーに、指定されたバイトを追加します。
  2. [464] それ以外なら、
    1. [465] 一時バッファーを、十六進数として解釈します。
    2. [466] 残り長さを、得られた値に設定します。
    3. [467] 残り長さがエラー (桁溢れ) なら、
      1. [468] Set connection's response's incomplete message flag to true.
      2. [410] 要求について dataend を通知します。
      3. [393] Connection error connection with a new exit status (whose 失敗 is false).
    4. [428] それ以外で、残り長さが 0 なら、
      1. [431] 要求について dataend を通知します。
      2. [429] 状態を、「trailer 前」に設定します。
      3. [430] 一時バッファーを、空に設定します。
    5. [471] それ以外なら、
      1. [472] バイトが 0x0A なら、
        1. [473] 状態を、「塊」に設定します。
      2. [474] それ以外なら、
        1. [475] 状態を、「塊拡張」に設定します。

[122] 正常終了か中断を受信したら、

  1. [476] Set connection's response's incomplete message flag to true.
  2. [413] 要求について dataend を通知します。
  3. [409] Connection error connection with a new exit status (whose 失敗 is false).

「塊拡張」状態

[121] バイトを受信したら、

  1. [479] 0x0A なら、
    1. [480] 状態を、「塊」に設定します。

[123] 正常終了か中断を受信したら、

  1. [481] Set connection's response's incomplete message flag to true.
  2. [416] 要求について dataend を通知します。
  3. [412] Connection error connection with a new exit status (whose 失敗 is false).

「塊」状態

[124] バイトを受信したら、

  1. [249] 要求について data を通知します。受信したバイトを引渡します。
  2. [486] 残り長さを1減らします。
  3. [487] 残り長さが0なら、
    1. [488] 状態を、「塊後」に設定します。

[125] 正常終了か中断を受信したら、

  1. [489] Set connection's response's incomplete message flag to true.
  2. [419] 要求について dataend を通知します。
  3. [415] Connection error connection with a new exit status (whose 失敗 is false).

「塊後」状態

[126] バイトを受信したら、

  1. [492] 0x0D なら、
    1. [493] Set 状態 to "after chunk CR".
  2. [494] 0x0A なら、
    1. [495] 状態を、「塊前」に設定します。
  3. [496] それ以外なら、
    1. [497] Set connection's response's incomplete message flag to true.
    2. [422] 要求について dataend を通知します。
    3. [418] Connection error connection with a new exit status (whose 失敗 is false).

[127] 正常終了か中断を受信したら、

  1. [500] Set connection's response's incomplete message flag to true.
  2. [425] 要求について dataend を通知します。
  3. [423] Connection error connection with a new exit status (whose 失敗 is false).

"after chunk CR" state

[1418] When byte is received:

  1. [1419] If byte is 0x0A:
    1. [1420] Set 状態 to "塊前".
  2. [1421] Otherwise:
    1. [1422] Set connection's response's incomplete message flag to true.
    2. [1425] 要求について dataend を通知します。
    3. [427] Connection error connection with a new exit status (whose 失敗 is false).

[1428] 正常終了か中断を受信したら、

  1. [1429] Set connection's response's incomplete message flag to true.
  2. [1432] 要求について dataend を通知します。
  3. [447] Connection error connection with a new exit status (whose 失敗 is false).

「trailer 前」状態

[128] バイトを受信したら、

  1. 一時バッファーの末尾に受信したバイトを追加します。
  2. 一時バッファーの末尾が 0x0A 0x0A または 0x0A 0x0D 0x0A なら、
    1. 応答Connection: ヘッダーがあって close (ASCII大文字・小文字不区別) 接続オプションが指定されていれば、
      1. [193] Set connection's to be closed flag to true.
    2. [503] 終了を、新しい終了に設定します。
    3. [504] 次の要求に進みます。
  3. それ以外で、 一時バッファーの長さが 218‐1 なら、
    1. [450] Connection error connection with a new exit status (whose 失敗 is false).

[129] 正常終了か中断を受信したら、

  1. [461] Connection error connection with a new exit status (whose 失敗 is false).

「WebSocket フレーム前」状態

[148] バイトを受信したら、

  1. 一時バッファーの末尾に、受信したバイトを追加します。
  2. 一時バッファーの長さが2未満なら、ここで停止します。
  3. フレームを、次のような新しいWebSocketフレームに設定します。
    FIN
    一時バッファーの第1バイトの最上位ビット
    RSV1
    一時バッファーの第1バイトの上位から第2ビット目
    RSV2
    一時バッファーの第1バイトの上位から第3ビット目
    RSV3
    一時バッファーの第1バイトの上位から第4ビット目
    opcode
    一時バッファーの第1バイトの下位4ビットを整数としたもの
    mask
    一時バッファーの第2バイトの最上位ビット
    長さ
    一時バッファーの第2バイトの下位7ビットを整数としたもの
  4. フレーム長さが126か127で、opcode が 8 以上なら、
    1. 失敗とします。ここで停止します。
  5. フレーム長さが126なら、
    1. 一時バッファーの長さが4以上でなければ、ここで停止します。
    2. フレーム長さを、一時バッファーの第3、第4バイトをネットワークバイト順16ビット符号無し整数とした値に設定します。
    3. フレーム長さが126未満なら、
      1. 失敗とします。ここで停止します。
  6. フレーム長さが127なら、
    1. 一時バッファーの長さが10以上でなければ、ここで停止します。
    2. 一時バッファーの第3バイトの最上位ビットが 1 なら、
      1. 失敗とします。ここで停止します。
    3. フレーム長さを、一時バッファーの第3-8バイトをネットワークバイト順64ビット符号無し整数とした値に設定します。
    4. フレーム長さが216未満なら、
      1. 失敗とします。ここで停止します。
  7. フレーム長さが実装の扱える範囲を超えていれば、
    1. 失敗とします。ここで停止します。
  8. フレームmaskが設定されていれば、
    1. 一時バッファーに次の4バイトがなければ、ここで停止します。
    2. フレームマスクキーを、一時バッファーのその4バイトに設定します。
  9. [150] If connection's endpoint type is server and フレームmask が 0 なら、
    1. [153] 理由 WebSocket Protocol Error で失敗とします。ここで停止します。
  10. [151] If connection's endpoint type is client and フレームmask が 1 なら、
    1. [152] 理由 Masked frame from server で失敗とします。ここで停止します。
  11. [154] フレームの FIN が 0 で opcode が 8, 9, 10 なら、
    1. [155] 失敗とします。ここで停止します。
  12. [156] フレームの RSV1, RSV2, RSV3 のいずれかでも 1 なら、
    1. [157] 理由 Invalid reserved bit で失敗とします。ここで停止します。
  13. [158] フレームopcode が 3-7, 11-15 なら、
    1. [159] 理由 Unknown opcode で失敗とします。ここで停止します。
  14. [170] If connection's WebSocket data type is null and フレームopcode が 0 なら、
    1. [171] 理由 Unexpected continuation で失敗とします。ここで停止します。
  15. [172] If connection's WebSocket data type is not null and フレームopcode が 1 か 2 なら、
    1. [173] 理由 Previous data frame unfinished で失敗とします。ここで停止します。
  16. [175] If フレーム's FIN is 0 and フレーム's opcode is 1:
    1. [176] Set connection's WebSocket data type to Text.
  17. [181] If フレーム's FIN is 0 and フレーム's opcode is 2:
    1. [183] Set connection's WebSocket data type to Binary.
  18. [195] 一時バッファーを、空に設定します。
  19. [160] フレームの長さが0なら、
    1. [190] Let result be result of processing a WebSocket frame.
    2. [1361] If result is false, abort these steps.
    3. [192] フレームを、 null に設定します。
    4. [191] 状態を、「WebSocket フレーム前」に設定します。
  20. [161] それ以外なら、
    1. [196] 状態を、「WebSocket データ」に設定します。

[149] 正常終了か中断を受信したら、

  1. [226] WebSocket接続の状態を、CLOSING に設定します。
  2. [227] Set connection's exit status to an exit status:
    Exit status
    失敗
    cleanly
    状態符号
    1006
    理由
    空文字列
  3. [330] 次の要求に進みます。

「WebSocket データ」状態

[163] バイトを受信したら、

  1. [164] 一時バッファーの末尾に、受信したバイトを追加します。
  2. [165] フレームmask が1なら、
    1. [166] フレームのマスクキーの先頭から第 ((一時バッファーの長さ - 1) mod 4) バイト (先頭が第0バイトとして数えた時。) を使って一時バッファーの末尾のバイトを XOR したものに置き換えます。
  3. [167] 一時バッファー長さフレーム長さと等しくなければ、 ここで停止します。
  4. [188] Let result be result of processing a WebSocket frame.
  5. [1362] If result is false, abort these steps.
  6. [184] フレームを、 null に設定します。
  7. [185] 状態を、「WebSocket フレーム前」に設定します。
  8. [186] 一時バッファーを、空に設定します。

permessage-deflate

[162] 正常終了か中断を受信したら、

  1. [212] WebSocket接続の状態を、CLOSING に設定します。
  2. [215] Set connection's exit status to an exit status:
    Exit status
    失敗
    cleanly
    状態符号
    1006
    理由
    空文字列
  3. [331] 次の要求に進みます。

「WebSocket 切断待ち」状態

[217] 「WebSocket フレーム前」状態、「WebSocket データ」状態で失敗するという時、 次のようにします。

  1. [229] WebSocket接続の状態を、CLOSING に設定します。
  2. [230] Let exit status be a new exit status:
    [440] Exit status
    失敗
    cleanly
    状態符号
    1002
    理由
    指定された理由。指定がなければ WebSocket Protocol Error
    API exposed status and reason
  3. [231] WebSocketフレームを作成します。
    FIN
    1
    RSV1
    0
    RSV2
    0
    RSV3
    0
    opcode
    8
    mask
    1
    長さ
    データのバイト数
    マスクキー
    無作為に決定した4バイトのバイト列
    データ
    exit status's 状態符号を表す16ビット符号無し整数 (ネットワークバイト順), followed by exit status's 理由 encoded in UTF-8
  4. [305] 作成した WebSocketフレームのデータの各バイトについて、 先頭から i バイト目 (先頭が0バイト) であれば、 マスクキーi mod 4 バイト目 (先頭が0バイト) と XOR した結果に差し替えます。
  5. [306] connection's transport で、作成したWebSocketフレームを送信することにします。
  6. [232] 状態を、「WebSocket切断待ち」に設定します。
  7. [233] Connection error connection with exit status.

[214] バイトを受信したら、

  1. [234] If connection's exit status's 失敗 is null:
    1. [235] Set connection's exit status to a new exit status whose 失敗 is true, 状態符号 is 1006, and 理由 is 空文字列.

[220] 正常終了か中断を受信したら、

  1. [239] If 中断 and connection's exit status's 失敗 is null:
    1. [89] Set connection's exit status to a new exit status whose 失敗 is true, 状態符号 is 1006, and 理由 is 空文字列.
  2. [332] 次の要求に進みます。

「トンネル」状態

[111] バイトを受信したら、

  1. [484] 要求について data を通知します。受信したバイトを引渡します。

[112] 正常終了か中断を受信したら、

  1. [371] 要求について dataend を通知します。
  2. [478] If 中断:
    1. [482] Connection error connection.
  3. [483] Otherwise:
    1. [324] Set connection's to be closed flag to true.
    2. [327] 次の要求に進みます。

「停止済み」状態

[318] To connection error connection with an optional exit status, run these steps:

  1. [436] If exit status is not specified:
    1. [439] Set exit status to a new exit status whose 失敗 is true.
  2. [131] Set connection's exit status to exit status.
  3. [435] Run the sent steps for connection with the close flag set to true.
  4. [338] 次の要求に進みます。

[372] The sent steps for connection with optional close flag (false if omitted) are these steps:

  1. [238] If close is true:
    1. [51] Set connection's to be closed flag to true.
    2. If connection's transport writable stream is not yet closed, close the writer.
  2. [340] Set connection's write mode to "sent".
  3. [279]
    要求について要求の送信完了を通知します。
  4. [499] Set connection's stream sent flag to true.
  5. [433] If connection's stream received flag is true:
    1. [432] Run the end of stream steps for connection.

[43] 次の要求に進むとは、次のようにします。

  1. [243] 状態が「停止済み」なら、ここで停止します。
  2. [336] 切断タイマーを停止させます。
  3. [379] If connection's write mode is not null and is not "sent":
    1. [380] 状態を、「要求送信中」に設定します。
  4. [501] Set connection's stream received flag to true.
  5. [381] If connection's stream sent flag is true:
    1. [325] Run the end of stream steps for connection.

[370] The end of stream steps for connection are these steps:

  1. [512] 要求が null ではなく:
    1. [513] 要求について完了を通知します。connection's exit status (which might be null) を引渡します。
  2. [333] 要求を、 null に設定します。
  3. [334] 応答を、 null に設定します。
  4. [514] Set connection's write mode to null.
  5. [515] 要求の処理完了が null でなければ、
    1. [516] 要求の処理完了解決します。
    2. [517] 要求の処理完了を null に設定します。
  6. [502] Set connection's stream received flag to false.
  7. [505] Set connection's stream sent flag to false.
  8. [506] Set connection's exit status to null.
  9. [518] If connection's to be closed flag is true:
    1. [339]
      If connection's underlying writable stream is not yet closed:
      1. [351] connection's transport の正常終了の送信を指示します。
      2. [350] これ以後 connection's transport の受信終了を指示して構いません。
    2. [352] 状態を、「停止済み」に設定します。
  10. [519] Otherwise:
    1. [353] 状態を、「要求待ち」に設定します。

[70] バイトを受信したら、何もしません。

[71] 正常終了や中断を受信したら、何もしません。

ヘッダー群として構文解析

[17] 入力を、 0x0D や 0x0A で区切られたに分割します。 には区切りの 0x0D, 0x0A は含めません。

[3] 最初の行を (あれば) 次のようにします。

  1. 先頭が / なら、
    1. その次がASCII数字列なら、これを十進整数として解釈します。 ただし先導0があるときは、 0 とみなします。
    2. その次が . なら、
      1. その次が ASCII数字列なら、これを十進整数として解釈します。
      2. [19] 最初の整数が2以上か、 最初の整数が1と等しく次の整数が1以上なら、
        1. 応答プロトコルの版を、 1.1 に設定します。
    3. 次が1個以上の SP であれば、すべて無視します。
    4. [21] 次にASCII数字列があれば、応答状態符号をその十進整数値に設定します。
    5. [9] 次の1個以上の SP があれば、
      1. [4] 応答理由句を、のそれより後の部分に設定します。
    6. [5] それ以外なら、
      1. [31] 応答理由句を、空文字列に設定します。
  2. 先頭が1個以上SP 列なら、
    1. [20] 次にASCII数字列があれば、応答状態符号をその十進整数値に設定します。
    2. [10] 次の1個以上の SP があれば、
      1. [22] 応答理由句を、のそれより後の部分に設定します。
    3. [29] それ以外なら、
      1. [30] 応答理由句を、空文字列に設定します。

[23] 更に、次のようにします。

  1. 最後のヘッダーを、 null に設定します。
  2. 残りの各行について順番に、
    1. 先頭の文字が 0x20 か 0x09 なら、
      1. 最後のヘッダーが null 以外なら、
        1. 行の先頭から 0x20 と 0x09 をすべて除去します。
        2. 最後のヘッダーの値の末尾に、 0x20 と行の内容を追加します。
    2. 先頭の文字が 0x3A でなく、 0x3A が含まれるなら、
      1. 最後のヘッダーを、 0x3A より前の部分を名前、 0x3A より後の部分を値とするヘッダーに設定します。
      2. 応答ヘッダーリストの末尾に、最後のヘッダーを追加します。
    3. それ以外なら、
      1. 最後のヘッダーを、 null に設定します。
  3. 応答ヘッダーリストの各ヘッダーについて、
    1. 名前の末尾から 0x20 と 0x09 をすべて除去します。
    2. 値の先頭から 0x20 と 0x09 をすべて除去します。
    3. 値の末尾から 0x20 と 0x09 をすべて除去します。

WebSocket frames

[189] To process a WebSocket frame, switch by connection's frame's opcode:

0, 1, or 2
  1. [194] If connection's frame's opcode is 1:
    1. [197] Set connection's WebSocket data type to Text.
    2. [179] 要求について、 datastart を通知 with Text.
    3. [168] Set connection's decoder to a TextDecoder with:
      [1363] TextDecoder
      encoding
      UTF-8
      error mode
      fatal
      ignore BOM flag
      true
  2. [198] Otherwise, if connection's frame's opcode is 2:
    1. [1364] Set connection's WebSocket data type to Binary.
    2. [178] 要求について、 datastart を通知 with Binary.
  3. [182] If connection's WebSocket data type is Text:
    1. [180] Let output be the result of invoking decoder's decode method with:
      input
      connection's 一時バッファー
      options
      [534] TextDecodeOptions
      stream
      If connection's frame's opcode is 0, true. Otherwise, false.
      If an exception is thrown, 理由 Invalid UTF-8 in text frame で失敗とし, return false, and abort these steps.
    2. [531] 要求について、 data を通知 with output.
  4. [169] Otherwise:
    1. [177] 要求について、 data を通知 with connection's 一時バッファー.
  5. [533] If connection's frame's FIN is 1:
    1. [532] 要求について、 dataend を通知します。
    2. [187] Set connection's WebSocket data type to null.
  6. [1369] Return true.
8
  1. [199] 一時バッファーの長さが1なら、
    1. [201] 理由空文字列で失敗とします。
    2. [1365] Return false and abort these steps.
  2. [202] 一時バッファーが空でないなら、
    1. [203] フレーム状態符号を、 一時バッファーの先頭2バイトをネットワークバイト順符号無し16ビット整数として解釈した値とします。
    2. [206] フレーム状態符号10051006 なら、
      1. [207] 理由空文字列で失敗とします。
      2. [1366] Return false and abort these steps.
    3. [208] フレーム理由を、一時バッファーから先頭2バイトを除いたものを入力として utf-8復号器をエラーモード致死的で実行した出力とします。
    4. [209] 失敗の場合は、
      1. [1368] 理由 Invalid UTF-8 in Close frame で失敗とします。
      2. [1367] Return false and abort these steps.
  3. [213] WebSocket接続の状態CLOSING でなければ、
    1. [210] WebSocket接続の状態を、 CLOSING に設定します。
    2. [211] 要求について、 wsclosing を通知します。
    3. [216] WebSocketフレームを作成します。
      FIN
      1
      RSV1
      0
      RSV2
      0
      RSV3
      0
      opcode
      8
      mask
      1
      長さ
      データのバイト数
      マスクキー
      無作為に決定した4バイトのバイト列
      データ
      フレーム状態符号がなければ空。そうでなければ、 フレーム状態符号を表す16ビット符号無し整数 (ネットワークバイト順) と、 それに続けて理由
    4. [307] 作成した WebSocketフレームのデータの各バイトについて、 先頭から i バイト目 (先頭が0バイト) であれば、 マスクキーi mod 4 バイト目 (先頭が0バイト) と XOR した結果に差し替えます。
    5. [308] connection's transport で、作成したWebSocketフレームを送信することにします
      after completion of any ongoing transmission of frames.
    6. [225] Run the sent steps for connection with close flag set to true.
  4. [218] 状態を、「WebSocket切断待ち」に設定します。
  5. [228] Set connection's exit status to an exit status:
    Exit status
    失敗
    cleanly
    状態符号
    フレーム状態符号 (なければ 1005)
    理由
    フレームの理由 (なければ空文字列)
  6. [219] connection's endpoint type is server:
    1. [311] 次の要求に進みます。
  7. [312] それ以外なら、
    1. [313] 切断タイマーで、 1s 後に次の要求に進むことにします。
  8. [1372] Return true.
9
  1. [222] 要求について、 ping を通知します。一時バッファーをデータとして引き渡します。
  2. [223] WebSocketフレームを作成します。
    FIN
    1
    RSV1
    0
    RSV2
    0
    RSV3
    0
    opcode
    10
    mask
    1
    長さ
    データのバイト数
    マスクキー
    無作為に決定した4バイトのバイト列
    データ
    一時バッファー
  3. [309] 作成した WebSocketフレームのデータの各バイトについて、 先頭から i バイト目 (先頭が0バイト) であれば、 マスクキーi mod 4 バイト目 (先頭が0バイト) と XOR した結果に差し替えます。
  4. [310] connection's transport で、作成したWebSocketフレームを送信することにします
    after completion of any ongoing transmission of frames.
  5. [1371] Return true.
10
  1. [221] 要求について、 ping を通知します。返答フラグを設定し、 一時バッファーをデータとして引き渡します。
  2. [1370] Return true.

HTTP/2

server push

FTP

FTP support is to be removed from the Web.

[639] An FTP connection has following states:

endpoint type
client
transport
A transport.
read buffer
A byte string. Initially, an empty byte string.
state
Initially, connected state.
username
A string.
password
A string.
established promise
A promise. Initially, an unresolved promise.
path
A byte string or null. Initially, null.
object type
Either unknown, file, or directory. Initially, unknown.
file length
Either an integer or null. Initially, null.
data length
An integer.
data transport
A transport or null. Initially, null.
data state
Either initial state, data state, or exit state.
data connected promise
A promise.
is unauthorized
A boolean. Initially, false.

[1227] An FTP connection has similar notification hooks as HTTP connection.

Control connections

[573] To initiate an FTP connection with a transport transport, a string username, and a string password, run these steps:

  1. [575] Let ftp be a FTP connection.
    FTP connection
    endpoint type
    client
    transport
    transport
    username
    username
    password
    password
  2. [1067] Let current code be null.
  3. [1066] Let current text be an empty byte string.
  4. [911] Configure transport to run these substeps whenever it notifies of バイトの受信 with byte and urgent data flag:
    1. [912] If urgent data flag is set, abort these substeps.
    2. [1062] Append byte to ftp's read buffer.
    3. [1094] Optionally, abort these substeps.
    4. [1063] If byte contains a 0x0A byte:
      1. [1064] Split ftp's read buffer into two substrings at the first 0x0A byte. Set line to the first substring and ftp's read buffer to the second substring, not including the 0x0A separator.
      2. [1065] Remove the 0x0D byte at the end of line, if any.
      3. [1075] If line has three 0x30-0x39 bytes followed by a 0x20 or 0x2D byte at the beginning:
        1. [1076] Let code be the first three bytes of line.
        2. [1069] Let continue be whether the fourth byte of line is 0x2D or not.
        3. [1077] Remove first four bytes from line.
        4. [1078] If current code is null:
          1. [1079] Set current code to code.
          2. [1081] Set current text to line followed by 0x0D 0x0A.
        5. [1082] Otherwise, current code is code:
          1. [1083] Append line followed by 0x0D 0x0A to current text.
        6. [1084] Otherwise:
          1. [1085] Set current code to an error.
        7. [1086] If current code is not an error:
          1. [1087] Let reply be an FTP reply:
            code
            A string obtained by replacing bytes in current code by code points with same values.
            text
            current text
          2. [1091] Run the FTP client state machine with ftp and reply.
      4. [1070] Otherwise:
        1. [1072] Set current code be null.
        2. [1071] Set current text be an empty byte string.
  5. [913] Configure transport to run these substeps whenever it notifies of 正常終了の受信 or 中断 with reset flag:
    1. [1060] Set is abort be whether the notification is about 中断 or not.
    2. [1090] Let exit be
    3. [1272] Run the FTP client state machine with ftp and null.
  6. [1088] Return ftp.

[1104] To send FTP command command with argument text over ftp, run these steps:

  1. [1105] If text is null:
    1. [1106] Send text followed by 0x0D 0x0A over ftp.
  2. [1107] Otherwise:
    1. [1108] Send text followed by text followed by 0x0D 0x0A over ftp.

[1244] To switch to passive mode with ftp, run these steps:

  1. [1137]
    If ftp's transport is IPv6:
    1. [1140] Set FTP state of ftp to PASV reply state.
    2. [1138] Send FTP command `EPSV` with null over ftp.
  2. [1139] Otherwise:
    1. [1132] Set FTP state of ftp to EPSV reply state.
    2. [1136] Send FTP command `PASV` with null over ftp.

[1068] An FTP reply has following states:

FTP reply
code
A string.
text
A byte string.

[1110] The FTP reply's first code is its code's first character.

[1061] To set FTP state of FTP connection ftp to state, run these steps:

  1. [1096] If ftp's read buffer is not empty:
    1. [1097] Abort FTP connection ftp.
  2. [1098] Otherwise:
    1. [1095] Set ftp's state to state.

[1092] The FTP client state machine of FTP connection ftp run these steps with FTP reply reply, switched by ftp's state:

Connected state
  1. [1099] If reply is not null:
    1. [1209] If reply's code is 421 or 521:
      1. [1253] Abort FTP connection ftp.
    2. [1254] Otherwise:
      1. [1100] Set FTP state of ftp to USER reply state.
      2. [1103] Send FTP command `USER` and UTF-8 encoded ftp's username over ftp.
  2. [1101] Otherwise:
    1. [1102] Abort FTP connection ftp.
USER reply state
  1. [1109] If reply is not null:
    1. [1111] If reply's first code is 2:
      1. [1157] Set FTP state of ftp to authenticated state.
      2. [1126] Resolve ftp's established promise.
    2. [1112] Otherwise, reply's first code is 3:
      1. [1118] Set FTP state of ftp to before PASS reply state.
      2. [1119] Send FTP command `PASS` with UTF-8 encoded ftp's password over ftp.
    3. [1113] Otherwise:
      1. [1116] Request FTP authentication for ftp.
  2. [1114] Otherwise:
    1. [1115] Request FTP authentication for ftp.
PASS reply state
  1. [1120] If reply is not null:
    1. [1121] If reply's first code is 2:
      1. [1127] Set FTP state of ftp to authenticated state.
      2. [1158] Resolve ftp's established promise.
    2. [1122] Otherwise:
      1. [1123] Request FTP authentication for ftp.
  2. [1124] Otherwise:
    1. [1125] Request FTP authentication for ftp.
TYPE reply state
  1. [1130] If reply is not null and reply's first code is 2:
    1. [1073] Switch to passive mode with ftp.
  2. [1134] Otherwise:
    1. [1135] Abort FTP connection ftp.
PASV reply state
  1. [1141] If reply is not null and reply's first code is 2 :
    1. [1131] If reply's text matches to the pattern 0x28 digits 0x2C digits 0x2C digits 0x2C digits 0x2C digits 0x2C digits 0x29, where digits represents one or more bytes in range [0x30, 0x39]:
      1. [1133] Let p1 and p2 be the first such match's last two digits substrings, respectively, interpreted as decimal integers encoded in UTF-8.
      2. [1143] Let port be p1 × 256 + p2.
      3. [1144] Establish an FTP data connection for ftp and and port.
    2. [1154] Otherwise:
      1. [1155] Abort FTP connection ftp.
  2. [1142] Otherwise:
    1. [1145] Abort FTP connection ftp.
EPSV reply state
  1. [1146] If reply is not null and reply's first code is 2 :
    1. [1147] If reply's text matches to the pattern 0x28 0x7C 0x7C 0x7C digits 0x7C 0x29, where digits represents one or more bytes in range [0x30, 0x39]:
      1. [1148] Let port be the first such match's digits substring, interpreted as a decimal integer encoded in UTF-8.
      2. [1149] Establish an FTP data connection for ftp and port.
    2. [1152] Otherwise:
      1. [1153] Abort FTP connection ftp.
  2. [1150] Otherwise:
    1. [1151] Abort FTP connection ftp.
Authenticated state
Abort FTP connection ftp.
TYPE reply state
  1. [1172] If reply is not null and reply's first code is 2:
    1. [1175] If ftp's object type is directory:
      1. [1214] Set FTP state of ftp to CWD reply state.
      2. [1215] Send FTP command `CWD` with ftp's path over ftp.
    2. [1176] Otherwise:
      1. [1177] Set FTP state of ftp to SIZE reply state.
      2. [1178] Send FTP command `SIZE` with ftp's path over ftp.
  2. [1173] Otherwise:
    1. [1174] Abort FTP connection ftp.
SIZE reply state
  1. [1170] If reply's first code is 2 and reply's text is one or more bytes in range [0x30, 0x39]:
    1. [1171] Set ftp's file length to reply's text, interpreted as a decimal integer encoded in UTF-8.
  2. [1179] Set FTP state of ftp to RETR reply state.
  3. [1206] If ftp's data connection is null or ftp's data state is not initial state:
    1. [1207] Abort FTP connection ftp.
  4. [1208] Otherwise:
    1. [1228] Schedule to run the data connected steps with ftp when ftp's data connected promise is resolved.
    2. [1180] Send FTP command `RETR` with ftp's path over ftp.
RETR reply state
  1. [1181] If reply's first code is not 1 or 2:
    1. [1246] If reply's code is 421, 425, or 426, or if ftp's object type is file:
      1. [1183] Abort FTP connection ftp.
    2. [1210] Otherwise:
      1. [1245] If ftp's data transport is not null:
        1. [1251] ftp's data transport's 中断の指示.
        2. [1252] Set ftp's data transport to null.
        3. [1248] Set ftp's object type to directory.
        4. [1247] Switch to passive mode with ftp.
      2. [1249] Otherwise:
        1. [1213] Set FTP state of ftp to CWD reply state.
        2. [1212] Send FTP command `CWD` with ftp's path over ftp.
CWD reply state
  1. [1216] If reply is not null and reply's first code is 2:
    1. [1257] Set ftp's file length to null.
    2. [1258] Set FTP state of ftp to LIST reply state.
    3. [1219] If ftp's data connection is null or ftp's data state is not initial state:
      1. [1259] Abort FTP connection ftp.
    4. [1260] Otherwise:
      1. [1261] Schedule to run the data connected steps with ftp when ftp's data connected promise is resolved.
      2. [1262] Send FTP command `LIST` with null.
  2. [1217] Otherwise:
    1. [1218] Abort FTP connection ftp.
RETR reply state
  1. [1225] If reply's first code is not 1 or 2:
    1. [1226] Abort FTP connection ftp.

[1074] To send an FTP request request over ftp, run these steps:

  1. [1288] If ftp's is unauthorized is true:
    1. Return a response and abort these steps:
      Response
      status
      401
      status text
      Unauthorized
      header list
      WWW-Authenticate
      Basic realm=""
  2. [1159] Assertion: ftp's state has to be authenticated state.
  3. [1165] Let type be `I`.
  4. [1160] Let path be concatenation of request's url's path's items, separated with /, in order. This can be the empty string.
  5. [1161] If path contains a ; character:
    1. [1162] Let param be the first ; character and the following characters in path. Remove them from path.
    2. [1163] Switch by param:
      ;type=a
      Set ftp's object type to file. Set type to `A`.
      ;type=i
      Set ftp's object type to file.
      ;type=d
      Set ftp's object type to directory.
  6. [1166] Set path be the result of applying UTF-8 encode to path.
  7. [1167] Set path be the result of applying percent decode to path.
  8. [1168] If the last byte of path, if any, is 0x2F:
    1. [1169] Set ftp's object type to directory.
  9. [1164] Set ftp's path to path.
  10. [1128] Set FTP state of ftp to TYPE reply state.
  11. [1129] Send FTP command `TYPE` with type over ftp.

Data connections

[910] To establish an FTP data connection for ftp and port, run these steps:

  1. [1243] Set ftp's data connected promise to an unresolved promise.
  2. [1188] If port is less than 1024, is greater than 65535, or is one of bad ports:
    1. [1189] Abort FTP connection ftp.
  3. [1184] Let host be ftp's transport's
    remote host.
  4. [1185] Let proxy be ftp's transport's proxy configuration.
  5. [1187] Let url be a URL record whose scheme is ftp, host is host, and port is port.
  6. [1186] Let transport be the result of creating a transport for proxy proxy with url.
  7. [1156] If transport is a failure:
    1. [1190] Abort FTP connection ftp.
  8. [1191] Set ftp's data transport to transport.
  9. [1201] Set ftp's data state to initial state.
  10. [1195] Configure transport to run these substeps whenever it notifies of バイトの受信 with byte and urgent data flag:
    1. [1196] If urgent data flag is set, abort these steps.
    2. [1200] If ftp's data state is initial state:
      1. [1255] Abort FTP connection ftp.
    3. [1256] Otherwise:
      1. [1222] Increment ftp's data length.
      2. [1233] ftp's data の通知 with byte.
      3. [1220] If ftp's file length is not null and ftp's file length is ftp's data length:
        1. [1223] Set data state to exit state.
        2. [1224] ftp's dataend の通知.
        3. [1269] ftp's data transport's 正常終了の送信の指示.
        4. [1270] Set ftp's data transport to null.
  11. [1197] Configure transport to run these substeps whenever it notifies of 正常終了の受信 or 中断 with is reset:
    1. [1198] Set is abort be whether the notification is about 中断 or not.
    2. [1199] Let exit be an exit status whose 失敗 is is abort and リセット is is reset.
    3. [1239] If ftp's data transport is transport or ftp's data state is exit state:
      1. [1202] If ftp's data state is initial state:
        1. [1203] Abort FTP connection ftp with exit.
      2. [1204] Otherwise:
        1. [1271] If ftp's data state is data state:
          1. [1234] ftp's dataend の通知.
          2. [1276] If ftp's file length is not null and ftp's file length is greater than ftp's data length:
            1. [1277] Set ftp's response's incomplete message flag.
          3. [1236] ftp's transport's 正常終了の送信の指示.
        2. [1235] ftp's 完了の通知 with ftp's response and exit.
        3. [1237] ftp's data transport's 正常終了の送信の指示.
    4. [1240] Otherwise:
      1. [1241] transport's 正常終了の送信の指示.
  12. [1242] Resolve ftp's data connected promise.

[1211] The data connected steps with ftp are these steps:

  1. [1229] ftp's 要求の送信完了の通知.
  2. [1232] Set ftp's response to a response.
    Response
    status
    200
    status text
    OK
    body
    stream
  3. If ?raw, plain text. Otherwise, FTP directory list.
  4. base is: ftp's path If path does not end with a 0x2F, append a 0x2F byte to path.
  5. [1230] ftp's 応答のヘッダー受信完了の通知 with ftp's response.
  6. [1221] Set ftp's data length to 0.
  7. [1231] ftp's datastart の通知.
  8. [1263] If ftp's file length is not null and ftp's file length is ftp's data length:
    1. [1264] Set data state to exit state.
    2. [1265] ftp's dataend の通知.
    3. [1267] ftp's data transport's 正常終了の送信の指示.
    4. [1268] Set ftp's data transport to null.
  9. [1266] Otherwise:
    1. [1205] Set ftp's data state to data state.

Termination

[1117] To request FTP authentication of ftp, run these steps:

  1. [574] Set ftp's is unauthorized to true.
  2. [1238] Abort FTP connection ftp.

[1093] To abort FTP connection ftp with optional exit, run these steps:

  1. [1297] If exit is not specified, set exit to an exit status whose 失敗 is true.
  2. [1194] ftp's transport's 中断の指示.
  3. [1192] If ftp's data transport is not null:
    1. [1193] ftp's data transport's 中断の指示.
  4. [1274] If ftp's path is not null:
    1. [1273] ftp's 完了の通知 with ftp's response and exit.
  5. [1275] Otherwise:
    1. [1089] Reject ftp's established promise with exit.

[1250] Timeout

Server-side API

XXX

[1378] To prepare metavariables for an request request, a transport transport, and a string or null scheme key name, run these steps:

  1. [1391] Let url be request's target url.
  2. [1409] Set request version to the appropriate value by request's version:
    0.9
    HTTP/0.9
    1.0
    HTTP/1.0
    1.1
    HTTP/1.1
    2.0
    HTTP/2.0
  3. [1379] Let vars be a map with following name/value pairs:
    CONTENT_LENGTH
    request's body length, serialized.
    PATH_INFO
    url's path, UTF-8 encoded and percent-decoded
    REQUEST_METHOD
    request's method
    SCRIPT_NAME
    The empty string
    SERVER_PROTOCOL
    request version
  4. [1411] If scheme key name is not null:
    1. [1412] Set vars' scheme key name to http.
  5. [1382] If transport's protocol is tls:
    1. [1383] Set transport to transport's transport.
    2. [1388] If url's scheme is https:
      1. [1386] Set vars' HTTPS to ON.
      2. [1413] If scheme key name is not null:
        1. [1414] Set vars' scheme key name to https.
  6. [1384] If transport's protocol is tcp:
    1. [1385] Set vars' REMOTE_ADDR to transport's remote host, serialized.
    2. [1407] Set vars' SERVER_NAME to transport's local host, serialized.
    3. [1408] Set vars' SERVER_PORT to transport's local port, serialized.
  7. [1404] Otherwise:
    1. [1405] Set vars's REMOTE_ADDR to 127.0.0.1.
    2. [1406] Set vars's SERVER_NAME to 127.0.0.1.
    3. [1395] Set vars's SERVER_PORT to 0.
  8. [1392] If url's query is not null:
    1. [1393] Set vars' QUERY_STRING to url's query, UTF-8 encoded.
  9. [1396] For each header name in vars' header list, without any duplicate:
    1. [1397] If header name is a string of one or more ASCII alphanumeric and/or - characters and not ASCII case-insensitively equal to Content-Length:
      1. [1398] Let key be header name, converted to ASCII uppercase.
      2. [1399] Replace any - in header name by _.
      3. [1400] If header name is not CONTENT_TYPE:
        1. [1394] Prepend HTTP_ to header name.
      4. [1401] Let value be the header values in vars's header list whose name is ASCII case-insensitively equal to header name, in order, combined.
      5. [1402] Set vars' key to value.
  10. [1410] Let host be vars' HTTP_HOST's value, if any, or null.
  11. [1387] If url's scheme is HTTP(S) scheme and url's hostport, UTF-8 encoded, is host:
    1. [1403] Set vars' REQUEST_URI to url, serialized and UTF-8 encoded.
  12. [1389] Otherwise:
    1. [1390] Set vars' REQUEST_URI to request's target url's pathquery and UTF-8 encoded.
  13. [1381] Return vars.

[1415] scheme key name is typically wsgi.url_scheme, psgi.url_scheme, or similar.

References

[242] This specification depends on the Infra Standard. The terms forgiving-base64 encode, ordered set, empty, contains, and pair are defined in the Infra Standard.

[1044] The terms encoding, UTF-8, UTF-8 encode, decode, TextDecoder, encoding, error mode, ignore BOM flag, decode, TextDecodeOptions, and stream are defined in the Encoding Standard.

[621] The terms C0 controls and space, serialize an integer, IPv4 address, IPv4 serializer, IPv6 address, domain, host, host parser, equals, host serializer, percent decode, scheme, network scheme, URL parser, URL serializer, URL record, scheme, host, port, and query are defined by URL Standard.

[981] The terms Public Suffix and ICANN DOMAINS is defined by Public Suffix List.

[1341] Status codes 101 and 200 and URL schemes http and https are defined by HTTP.

[1330] HTTP headers `Sec-WebSocket-Accept`, `Sec-WebSocket-Extensions`, `Sec-WebSocket-Key`, `Sec-WebSocket-Protocol`, `Sec-WebSocket-Version` URL schemes ws and wss, and the terms The WebSocket Connection is Established, Extensions In Use, Subprotocol In Use A WebSocket Message Has Been Received, The WebSocket Closing Handshake Is Started, The WebSocket Connection Is Closed, The WebSocket Connection Close Code, The WebSocket Connection Close Reason, and Fail The WebSocket Connection are defined by RFC 6455.

[354] The terms bad ports, append, combine request, url, current url, method, header list, body, client, skip-service-worker flag, synchronous flag, mode, credentials mode, cache mode, redirect mode, response, status, status message, body, header list, HTTPS state, network error, connection, obtain a connection, obtain a WebSocket connection, basic fetch, HTTP fetch, HTTP-network-or-cache fetch, HTTP-network fetch, process response, process response done, and establish a WebSocket connection are defined in the Fetch Standard.

[961] The terms converted to ASCII lowercase and converted to ASCII uppercase are defined in the DOM Standard.

[942] SNI is specified in RFC 6066.

[1007] WPAD is defined by the Internet Draft.

[1008] PAC is defined by https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Necko/Proxy_Auto-Configuration_(PAC)_file and https://bugzilla.mozilla.org/show_bug.cgi?id=78176.

[1298] The term Strip url for use as a referrer is defined in the Referrer Policy.

XXX

[65]
Trailers

Note

[610] This document does not support QUIC at this stage, which is supported by Chrome.

[1010] This document does not support VMS-style path syntax in FTP, which is supported by Firefox and Chrome.

[1323] This document does not support persistent FTP control connection, which is supported by Firefox and IE.

[914] Test data: