<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><section><h1>Introduction</h1><p><em>This section is non-normative.</em></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="907" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[907]</anchor-end> This document is an implementation of Web transport protocols.</p></section><section><h1>Fetch and connections</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="908" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[908]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request</anchor>'s <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current server url</f><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current server url</title></dfn>
is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor>.  Once a value is set, the <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current server url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's server url</title></f>
is that value.  Otherwise, the <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current server url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current server url</title></f>
is same as its <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current url</title></f>.</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">This field can be used to implement a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">reverse proxy</anchor>.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1303" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1303]</anchor-end> In the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">basic fetch</anchor>, when <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current url</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>ftp<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ftp:</title></code>,
return the result of performing an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP fetch</anchor> using <var>request</var>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="896" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[896]</anchor-end> To modify <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f> per HTTP
in <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP-network-or-cache fetch</anchor>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="898" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[898]</anchor-end> Append <code>Accept-Encoding</code> header, if necessary.<ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">REQUIRED for Web compat <sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>docs.github.com</anchor> </sw-see></ed></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="897" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[897]</anchor-end> Append <code>DNT</code> header, if necessary.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="899" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[899]</anchor-end> Append <code>Upgrade-Insecure-Requests</code> header, if necessary.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1304" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1304]</anchor-end> In the steps to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">obtain a connection</anchor>, to choose a connection
for <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">origin</anchor> <var>origin</var> from the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connection pool</f>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1305" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1305]</anchor-end> If <var>origin</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>ftp<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ftp:</title></code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1306" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1306]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1307" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1307]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1308" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1308]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connection</anchor> whose
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>,
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態</f> is 「初期」 or 「要求待ち」, and
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket接続の状態</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> in the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connection pool</f>,
if any, or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1325" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1325]</anchor-end> In the steps to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">obtain a connection</anchor>, just before establishing an HTTP connection,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1326" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1326]</anchor-end> Wait until implementation dependent constraints on the number of relevant
connections in the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connection pool</f> is small enough.
If the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> detects an idle connection in its <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connection pool</f>,
it may choose to abort that connection.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="822" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[822]</anchor-end> In the steps to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">obtain a connection</anchor>, to establish an HTTP connection,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="808" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[808]</anchor-end> Let <var>transport</var> be the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a transport</title></anchor>.<figure class="list members"><dl><dt><var>request url</var></dt><dd>the request's <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current url</title></f></dd><dt><var>server url</var></dt><dd>the request's <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current server url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current server url</title></f></dd><dt><var>credentials</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></dd><dt><var><code>acceptSslCerts</code></var></dt><dd>the request's <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">acceptSslCerts</code></f> flag</dd><dt><var>user agent</var></dt><dd>the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor></dd><dt><var>skip DNS cache</var></dt><dd>whether the request's <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cache mode</f>
is either one of <code>no-cache</code>, <code>reload</code>, and <code>no-store</code>, or not</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="823" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[823]</anchor-end> If <var>transport</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="824" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[824]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1296" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1296]</anchor-end> Otherwise, if <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f>
is <code>http2</code>:<ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"></ed></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="932" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[932]</anchor-end> Otherwise, if <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f>
is <code>ftp</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="934" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[934]</anchor-end> If the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP-network-or-cache fetch</anchor> steps set credentials to the request:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="935" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[935]</anchor-end> Set <var>username</var> and <var>password</var> to the appropriate values.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1285" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1285]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1286" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1286]</anchor-end> Set <var>username</var> to <code>anonymous</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1287" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1287]</anchor-end> Set <var>password</var> to <code>User@</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="933" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[933]</anchor-end> Let <var>connection</var> be the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">initiating an FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">initiate an FTP connection</title></anchor>
with <var>transport</var>, <var>username</var>, and <var>password</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1291" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1291]</anchor-end> Wait until <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's established promise</title></f>
is resolved or rejected.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1292" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1292]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's established promise</title></f>
is resolved:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1293" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1293]</anchor-end> Return <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1294" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1294]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1295" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1295]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="825" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[825]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="826" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[826]</anchor-end> Return an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f></dt><dd><var>transport</var></dd></dl></figure></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="809" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[809]</anchor-end> To <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">obtain a WebSocket connection</anchor> for <var>url</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="821" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[821]</anchor-end> Let <var>transport</var> be the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a transport</title></anchor>.<figure class="list members"><dl><dt><var>request url</var></dt><dd><var>url</var></dd><dt><var>server url</var></dt><dd><var>url</var></dd><dt><var><code>acceptSslCerts</code></var></dt><dd>the request's <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">acceptSslCerts</code></f> flag</dd><dt><var>user agent</var></dt><dd>the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor></dd><dt><var>ws</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></dd><dt><var>skip DNS cache</var></dt><dd>whether the request's <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cache mode</f>
is either one of <code>no-cache</code>, <code>reload</code>, and <code>no-store</code>, or not</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="827" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[827]</anchor-end> If <var>transport</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="828" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[828]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="829" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[829]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="830" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[830]</anchor-end> Return an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f></dt><dd><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</f></dd></dl></figure></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="607" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[607]</anchor-end> To <dfn>wait for other connections</dfn> of <var>host</var>, <var>port</var>, and <var>ws</var>
in <var>user agent</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1324" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1324]</anchor-end> If <var>ws</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>, abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="831" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[831]</anchor-end> If <var>host</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="832" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[832]</anchor-end> Let <var>n</var> be an implementation dependent small number.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="833" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[833]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="834" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[834]</anchor-end> Let <var>n</var> be <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="835" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[835]</anchor-end> Wait while the number of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connections<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection</title></anchor> with the following 
conditions is <em>not</em> less than <var>n</var>:<figure class="list"><ul><li>It is in <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connection pool</f>.</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Its <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote host</title></f> is <var xmlns="http://www.w3.org/1999/xhtml">host</var>.</ed></li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Its <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote port</title></f> is <var xmlns="http://www.w3.org/1999/xhtml">port</var>.</ed></li><li>Its <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket接続の状態</f> is <code>CONNECTING</code>.</li></ul></figure></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1336" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1336]</anchor-end> To <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establish a WebSocket connection</anchor>, given a <var>url</var>, 
<var>protocols</var>, and <var>client</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1337" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1337]</anchor-end> Let <var>requestURL</var> be a copy of <var>url</var>, with its 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> set to &quot;<code>http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">http:</title></code>&quot;, if <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f>
is &quot;<code>ws<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ws:</title></code>&quot;, and to &quot;<code>https<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">https:</title></code>&quot; otherwise.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1338" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1338]</anchor-end> Let <var>request</var> be a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request</anchor>:<figure class="list members middle"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Request<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's url</title></f></dt><dd><var>url</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">client<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's client</title></f></dt><dd><var>client</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">skip-service-worker flag</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">synchronous flag</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f></dt><dd><code>websocket</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">credentials mode</f></dt><dd><code>include</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cache mode</f></dt><dd><code>no-store</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">redirect mode</f></dt><dd><code>error</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket subprotocols</f></dt><dd><var>protocols</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1339" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1339]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Fetch<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">fetch</title></anchor> <var>request</var> with <var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process response</anchor></var> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1348" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1348</anchor-internal>
and <var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process response done</anchor></var> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1342" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1342</anchor-internal>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1348" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1348]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process response</anchor> with <var>response</var> is as follows:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1340" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1340]</anchor-end> If <var>response</var> is not a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network error</anchor> and
<var>response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket connection established</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1346" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1346]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection is Established</anchor> with:<figure class="list members"><dl><dt><var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Extensions In Use</anchor></var></dt><dd>
<var>response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's header list</title></f>'s
`<code>Sec-WebSocket-Extensions</code>` header's value, if any, or <code>null</code></dd><dt><var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Subprotocol In Use</anchor></var></dt><dd>
<var>response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's header list</title></f>'s
`<code>Sec-WebSocket-Protocol</code>` header's value, if any, or <code>null</code></dd></dl></figure></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1342" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1342]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process response done</anchor> with <var>response</var> is as follows:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1345" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1345]</anchor-end> Let <var>exit status</var> be <var>response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's exit status</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1350" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1350]</anchor-end> If <var>exit status</var> is <code>null</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1351" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1351]</anchor-end> Set <var>exit status</var> to an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1343" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1343]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection Is Closed</anchor> with:<figure class="list members"><dl><dt><var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Fail The WebSocket Connection</anchor></var></dt><dd><var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f></dd><dt><var>cleanly</var></dt><dd><var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket cleanly</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></dd><dt><var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection Close Code</anchor></var></dt><dd><var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket状態符号</f></dd><dt><var><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection Close Reason</anchor></var></dt><dd><var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket理由文字列</f></dd></dl></figure></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="838" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[838]</anchor-end> To make an HTTP request over <var>connection</var> using <var>request</var>
in <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP-network fetch</anchor>, 
with <var>credentials</var> flag and optional <var>not retryable</var> flag,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1344" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1344]</anchor-end> Configure <var>connection</var> such that any notification is handled by <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="839" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;839</anchor-internal>,
which uses <var>websocket data type</var> and <var>websocket data</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="837" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[837]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f> is <code>http2</code>:<ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"></ed></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="930" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[930]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f> is <code>ftp</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1289" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1289]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send an FTP request<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send an FTP request</title></anchor> <var>request</var> over <var>connection</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="931" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[931]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="541" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[541]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request mode</f> is <em>HTTP proxy</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="845" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[845]</anchor-end> Let <var>target</var> be <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">originpathquery</f>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="843" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[843]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="844" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[844]</anchor-end> Let <var>target</var> be <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current url</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">pathquery</f>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="901" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[901]</anchor-end> Let <var>host header</var> be <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current url</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hostport</f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="900" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[900]</anchor-end> Append <code>Host</code>/<var>host header</var> to <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="905" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[905]</anchor-end> Append <code>Connection</code>/<code>keep-alive</code> to <var>request</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="840" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[840]</anchor-end> Send an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP request</anchor> over <var>connection</var>.<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP request</anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求メソッド</f></dt><dd><var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">method<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request method</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求対象</f></dt><dd><var>target</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーリスト</f></dt><dd><var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</f></dt><dd><var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request body</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f></dt><dd><var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f></dd></dl></figure></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="839" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[839]</anchor-end> Any notification <var>msg</var> from <var>connection</var> is processed as follows,
switched by <var>msg</var>'s type:<figure class="switch"><dl><dt>要求の本体の一部の送信の通知</dt><dd>Process <var>transmitted</var> as follows:<figure class="steps"><ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Increase <var xmlns="http://www.w3.org/1999/xhtml">request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request body</title></f> stream's transmitted bytes</ed></li></ol></figure></dd><dt>要求の送信完了の通知</dt><dd><figure class="steps"><ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Set <var xmlns="http://www.w3.org/1999/xhtml">request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request body</title></f> stream's done flag</ed></li></ol></figure></dd><dt>応答のヘッダー受信完了の通知</dt><dd>Process <var>http response</var> and
<var>WebSocket connection established</var> as follows:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="856" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[856]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request mode</f> is <em>not</em> <em>HTTP proxy</em> and
<var>http response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</f> is <code>407</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="857" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[857]</anchor-end> Set <var>response</var> to a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network error</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="858" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[858]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="841" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[841]</anchor-end> Set <var>response</var> to a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">status code</title></f></dt><dd><var>http response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status message</f></dt><dd><var>http response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's header list</title></f></dt><dd><var>http response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーリスト</f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS state</f></dt><dd><var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's HTTPS state</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket connection established</f></dt><dd><var>WebSocket connection established</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="892" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[892]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is 
<code>tls</code> and <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">has alert</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="893" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[893]</anchor-end> Process the HSTS header of <var>response</var>, if any.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="894" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[894]</anchor-end> Process the PKP headers of <var>response</var>, if any.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="842" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[842]</anchor-end> Now <em>headers are transmitted</em>.  Return <var>response</var>.</li></ol></figure></dd><dt><code>datastart</code> の通知</dt><dd>Process <var>data type</var> as follows:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="537" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[537]</anchor-end> If <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f> is <code>websocket</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1360" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1360]</anchor-end> Set <var>websocket data type</var> to <var>data type</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1349" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1349]</anchor-end> If <var>data type</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="538" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[538]</anchor-end> Set <var>websocket data</var> to the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1352" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1352]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1353" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1353]</anchor-end> Set <var>websocket data</var> to the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty byte string</anchor>.</li></ol></li></ol></li></ol></figure></dd><dt><code>data</code> の通知</dt><dd>Process <var>data</var> as follows:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1354" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1354]</anchor-end> If <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f> is <code>websocket</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1356" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1356]</anchor-end> Append <var>data</var> to <var>websocket data</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1355" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1355]</anchor-end> Otherwise:<ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Write <var xmlns="http://www.w3.org/1999/xhtml">data</var> to <var xmlns="http://www.w3.org/1999/xhtml">response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response body</title></f> stream</ed></li></ol></li></ol></figure></dd><dt><code>dataend</code> の通知</dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1357" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1357]</anchor-end> If <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f> is <code>websocket</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1359" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1359]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A WebSocket Message Has Been Received</anchor> with:<figure class="list members"><dl><dt><var>type</var></dt><dd><var>websocket data type</var></dd><dt><var>data</var></dt><dd><var>websocket data</var></dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1358" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1358]</anchor-end> Otherwise:<ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Set <var xmlns="http://www.w3.org/1999/xhtml">response</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response body</title></f> stream's done flag</ed></li></ol></li></ol></figure></dd><dt><code>wsclosing</code> の通知</dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Closing Handshake Is Started</anchor>.</dd><dt>完了の通知</dt><dd>Process <var>http response</var> and <var>exit status</var> as follows:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="851" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[851]</anchor-end> If <var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is true:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="852" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[852]</anchor-end> If <em>headers are transmitted</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="855" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[855]</anchor-end> Mutate <var>response</var> into a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network error</anchor> whose
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's exit status</title></f> is <var>exit status</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="257" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[257]</anchor-end> Otherwise, if <var>not retryable</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>,
<var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">can retry<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit's can retry</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>, and
the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> wants to retry the request:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="882" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[882]</anchor-end> Let <var>connection</var> be the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">obtaining a connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">obtain a connection</title></anchor>, given <var>request</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current url</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">origin</f> and <var>credentials</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="883" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[883]</anchor-end> If <var>connection</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>, return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network error</anchor>
and abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="884" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[884]</anchor-end> Return the result of recursively making an HTTP request
over <var>connection</var> using <var>request</var>,
with <var>credentials</var> flag, with <var>not retryable</var> flag set.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="854" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[854]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="853" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[853]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network error</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's exit status</title></f>
is <var>exit status</var>.</li></ol></li></ol></li></ol></figure></dd></dl></figure></p><note xmlns="urn:x-suika-fam-cx:markup:ietf:html:3:draft:00:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="247" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[247]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> might not want to retry the request because, e.g.,
there is a request body specified as a <code>ReadableStream</code>.</p></note><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TLS client certificate dialog</ed><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="357" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[357]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> <code xmlns="http://www.w3.org/1999/xhtml" class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CONNECT</anchor></code> プロキシからの応答の受信<ul xmlns="http://www.w3.org/1999/xhtml"><li><code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">407</anchor></code> なら、...</li><li>その他非 <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> なら、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークエラー</anchor></li></ul></ed><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="539" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[539]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> server steps</ed><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1375" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1375]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request</anchor> has following additional field:<figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">acceptSslCerts</code></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1347" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1347]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response</anchor> has following additional fields:<figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's exit status</title></f></dfn></dt><dd>
An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> or <code>null</code>.  Initially, <code>null</code>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f></dfn> flag</dt><dd>
A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket connection established</f></dfn> flag</dt><dd>
A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure></p></section><section><h1>Hosts and ports</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="323" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[323]</anchor-end> An <dfn>IP address</dfn> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 address</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv6 address</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="365" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[365]</anchor-end> A <dfn>port</dfn> is a 16-bit unsigned integer.</p><section><h1>Name resolution</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1278" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1278]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> has <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DNS cache</f></dfn>, which is a map from
a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor> to a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">pair</anchor> of (<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">address</f> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>),
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">expires</f> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">number</anchor>)).</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1328" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1328]</anchor-end> The <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DNS cache</f> has an associated <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">monotonic clock</f>,
which is an implementation dependent <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">monotonic clock</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1281" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1281]</anchor-end> The <dfn><var>DNS cache timeout</var></dfn> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">60</n> seconds.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="369" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[369]</anchor-end> The underlying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">platform</anchor> is expected to provide the way to
<dfn>resolve a name</dfn>, which receives a string <var>host string</var>
and a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor> <var>skip DNS cache</var> and returns a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.
If the platform does not support a feature equivalent to
<var>skip DNS cache</var>, it <MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MAY> be ignored.</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="509" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[509]</anchor-end> It asynchronously returns.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="615" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[615]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <var>user agent</var>'s <dfn>name resolution steps</dfn>
for <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor> <var>host</var> and optional <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor> <var>skip DNS cache</var> (whose
default is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>) are:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="616" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[616]</anchor-end> If <var>host</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1309" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1309]</anchor-end> If <var>skip DNS cache</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1283" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1283]</anchor-end> Let <var>cached</var> be <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DNS cache</f> [ <var>host</var> ].</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1310" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1310]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1311" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1311]</anchor-end> Let <var>cached</var> be <code>null</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1280" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1280]</anchor-end> Let <var>now</var> be the current value of <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DNS cache</f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">monotonic clock</f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1284" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1284]</anchor-end> If <var>cached</var> is <code>null</code> or <var>cached</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">expires</f> is a time after
<var>now</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="402" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[402]</anchor-end> Let <var>host string</var> be the result of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serializing<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">host serializer</title></anchor> <var>host</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="617" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[617]</anchor-end> Let <var>addr</var> be the result of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">resolving<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">resolve a name</title></anchor>
<var>host string</var> with <var>skip DNS cache</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1377" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1377]</anchor-end> If <var>addr</var> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 address</anchor> in the range <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0.0.0.0</anchor>/8</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1380" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1380]</anchor-end> Set <var>addr</var> to a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1279" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1279]</anchor-end> Set <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DNS cache</f> [ <var>host</var> ]
to (<var>addr</var>, <var>DNS cache timeout</var> after <var>now</var>).</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1282" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1282]</anchor-end> Return <var>addr</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1312" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1312]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1313" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1313]</anchor-end> Return <var>cached</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">address</f>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="618" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[618]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="619" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[619]</anchor-end> Return <var>host</var>.</li></ol></li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="508" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[508]</anchor-end> These steps asynchronously return an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</comment-p></section><section><h1>Verification of service identity</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="943" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[943]</anchor-end> The <dfn>service identity verification steps</dfn> for <var>host</var> and
<var>certificate</var> are these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="947" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[947]</anchor-end> Let <var>domains</var> be a list of the <code>dNSName</code> values in <var>certificate</var>'s 
<code>subjectAltName</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">extension<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TLS extension</title></anchor>, if any.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="948" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[948]</anchor-end> Let <var>addresses</var> be a list of the <code>iPAddress</code> values in <var>certificate</var>'s 
<code>subjectAltName</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">extension<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TLS extension</title></anchor>, if any.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="949" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[949]</anchor-end> If all of these conditions are <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="964" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[964]</anchor-end> <var>domains</var> is empty</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="965" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[965]</anchor-end> <var>addresses</var> is empty</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="966" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[966]</anchor-end> <var>certificate</var>'s <code>subject</code> field has any <code>CN</code> value</li></ul></figure><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="967" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[967]</anchor-end> Let <var>cn</var> be <var>certificate</var>'s <code>subject</code> field has 
the first <code>CN</code> value.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="968" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[968]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="969" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[969]</anchor-end> Let <var>cn</var> be <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="944" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[944]</anchor-end> If <var>host</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="958" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[958]</anchor-end> For each <var>domain</var> in <var>domains</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="957" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[957]</anchor-end> If <var>host</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate-domain-pattern matches<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">certificate-domain-pattern match</title></anchor> <var>domain</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="959" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[959]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="970" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[970]</anchor-end> If <var>cn</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>host</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate-domain-pattern matches<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">certificate-domain-pattern match</title></anchor> <var>cn</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="971" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[971]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="945" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[945]</anchor-end> Otherwise, if <var>host</var> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 address</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="954" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[954]</anchor-end> For each <var>address</var> in <var>addresses</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="955" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[955]</anchor-end> If <var>address</var> represents the same <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 address</anchor> as <var>host</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="956" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[956]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="963" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[963]</anchor-end> If <var>cn</var> is the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 serializer</anchor> to <var>host</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="972" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[972]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="946" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[946]</anchor-end> Otherwise, if <var>host</var> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv6 address</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="950" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[950]</anchor-end> For each <var>address</var> in <var>addresses</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="951" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[951]</anchor-end> If <var>address</var> represents the same <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv6 address</anchor> as <var>host</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="952" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[952]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="953" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[953]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="960" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[960]</anchor-end> Whether a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor> <var>domain</var> <dfn>certificate-domain-pattern matches<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">certificate-domain-pattern match</title></dfn>
a string <var>pattern</var> or not is the value returned by the following steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="962" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[962]</anchor-end> If the last character of <var>pattern</var>, if any, is a <code>.</code> character:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="973" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[973]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="975" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[975]</anchor-end> Let <var>canonicalized pattern</var> be <var>pattern</var>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">converted to ASCII lowercase</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="974" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[974]</anchor-end> If <var>domain</var> is <var>canonicalized pattern</var>, optionally followed by
a <code>.</code> character:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="976" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[976]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="977" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[977]</anchor-end> If the first two characters of <var>canonicalized pattern</var>, if any, is <code>*.</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="979" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[979]</anchor-end> Remove the first two characters from <var>canonicalized pattern</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="980" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[980]</anchor-end> If <var>canonicalized pattern</var> does not contain any <code>.</code> character,
or <var>canonicalized pattern</var> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ICANN public suffix</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="982" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[982]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="983" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[983]</anchor-end> If <var>domain</var> is one or more characters,
followed by <var>canonicalized pattern</var>, optionally followed by a <code>.</code> character:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="984" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[984]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="978" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[978]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1327" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1327]</anchor-end> A string <var>string</var> is an <dfn>ICANN public suffix</dfn> if
the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">public suffix</anchor> of <var>string</var> is <var>string</var>
when only <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ICANN domains</anchor> are taken into account.</p></section></section><section><h1>URLs</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1058" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1058]</anchor-end> The <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hostport</f></dfn> of a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> <var>url</var> is the concatenation of:<figure class="list"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1059" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1059]</anchor-end> <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="902" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[902]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="903" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[903]</anchor-end> <code>:</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="904" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[904]</anchor-end> <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</f>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">serialize an integer</title></anchor></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="622" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[622]</anchor-end> The <dfn>effective port</dfn> of <var>url</var> is the value returned by these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="623" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[623]</anchor-end> Let <var>port</var> be <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's port</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="624" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[624]</anchor-end> If <var>port</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="625" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[625]</anchor-end> Set <var>port</var> to the value determined by the <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f>:<figure class="switch"><dl><dt><code class="URI" xml:lang="en">ftp</code></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">21</anchor></dd><dt><code class="URI" xml:lang="en">http</code></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">80</anchor></dd><dt><code class="URI" xml:lang="en">https</code></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">443</anchor></dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="626" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[626]</anchor-end> Return <var>port</var>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1057" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1057]</anchor-end> The <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">pathquery</f></dfn> of a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> <var>url</var> is the concatenation of:<figure class="list"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="846" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[846]</anchor-end> <code>/</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="847" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[847]</anchor-end> The strings in <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path</f>, separated from each other by <code>/</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="848" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[848]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query</f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="849" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[849]</anchor-end> <code>?</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="850" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[850]</anchor-end> <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query</f></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1299" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1299]</anchor-end> The <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">originpathquery</f></dfn> of a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> <var>url</var> is the
value returned by these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1300" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1300]</anchor-end> Set <var>clone</var> be a copy of <var>url</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1301" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1301]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Strip <var xmlns="http://www.w3.org/1999/xhtml">clone</var> for use as a referrer<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Strip <var xmlns="http://www.w3.org/1999/xhtml">url</var> for use as a referrer</title></anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1302" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1302]</anchor-end> Return the result of applying the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL serializer</anchor> to <var>clone</var>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1056" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1056]</anchor-end> The <dfn>proxy environment variable parser</dfn> for string <var>value</var>
<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1028" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1028]</anchor-end> If <var>value</var> does not begin with a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme (syntax)</title></anchor>
followed by <code>://</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1316" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1316]</anchor-end> prepend <code>http://</code> to <var>value</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1029" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1029]</anchor-end> Return the result of applying the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL parser</anchor> to <var>value</var>.</li></ol></figure></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1318" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1318]</anchor-end> These steps can return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> or a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</comment-p></section><section><h1>Proxies</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1314" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1314]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <var>user agent</var> has <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">get proxies</f></dfn> steps,
which are invoked with <var>user agent</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> <var>url</var>.
The <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">get proxies</f> steps must return a list of zero or more <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor>
objects.</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1052" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1052]</anchor-end> <var xmlns="http://www.w3.org/1999/xhtml">url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> has to be a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network scheme</anchor>.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="612" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[612]</anchor-end> A <dfn>proxy configuration</dfn> has <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f></dfn>, which is one of:
<code>tcp</code>,
<code>unix</code>,
<code>http</code>,
<code>https</code>,
<code>socks4</code>, and
<code>socks5</code>.</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1017" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1017]</anchor-end> The value <code xmlns="http://www.w3.org/1999/xhtml">tcp</code> represents direct access (i.e. no proxy).</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="613" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[613]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f> is
<code>http</code>, <code>https</code>, <code>socks4</code>, or <code>socks5</code> has
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's host</title></f></dfn>, whose value is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor>, and
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's port</title></f></dfn>, whose value is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">integer</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.
The initial value of the <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's port</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="543" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[543]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f> is
<code>http</code> or <code>https</code> has <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">username<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's username</title></f></dfn>,
whose value is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor>,
and <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">password<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's password</title></f></dfn>, whose value is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.
The initial value of the <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">username<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's username</title></f> is the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor>.
The initial value of the <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">password</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="614" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[614]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f> is
<code>unix</code> has <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's path</title></f></dfn>, whose value is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1315" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1315]</anchor-end> The <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">get proxies</f> steps are implementation dependent.  Following
subsections include examples of such steps.</p><section><h1>Proxy configurations from environment variables</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1043" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1043]</anchor-end> This subsection applies to a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> that supports <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">environment variable</anchor>
based proxy configurations.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1317" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1317]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> has following states:<figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP proxy</f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS proxy</f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP proxy</f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">no proxy hosts</f></dfn></dt><dd>A list of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor>s.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="836" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[836]</anchor-end> Upon initialization, a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1021" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1021]</anchor-end> Set <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP proxy</f> to the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">parsing environment variable<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">parse an environment variable</title></anchor> <code>http_proxy</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1022" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1022]</anchor-end> Set <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS proxy</f> to the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">parsing environment variable<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">parse an environment variable</title></anchor> <code>https_proxy</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1023" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1023]</anchor-end> Set <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP proxy</f> to the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">parsing environment variable<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">parse an environment variable</title></anchor> <code>ftp_proxy</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1037" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1037]</anchor-end> Let <var>no_proxy</var> be the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">getting the environment variable<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">get an environment variable</title></anchor> <code>no_proxy</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1038" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1038]</anchor-end> If <var>no_proxy value</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and is not the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1039" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1039]</anchor-end> For each substring <var>value</var> obtained by splitting <var>no_proxy value</var>
by a <code>,</code> character:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1040" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1040]</anchor-end> Remove any leading and trailing <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">C0 controls and space</anchor> characters
from <var>value</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1041" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1041]</anchor-end> Let <var>host</var> be the result of applying the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host parser</anchor> to <var>value</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1042" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1042]</anchor-end> If <var>host</var> is not an error,
append <var>host</var> to <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">no proxy hosts</f>.</li></ol></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1024" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1024]</anchor-end> To <dfn>parse an environment variable</dfn> whose name is <var>name</var>,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1025" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1025]</anchor-end> Let <var>value</var> be the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">getting the environment variable<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">get an environment variable</title></anchor> <var>name</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1026" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1026]</anchor-end> If <var>value</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> or the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1027" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1027]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1055" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1055]</anchor-end> Let <var>url</var> be the result of applying the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy environment variable parser</anchor>
to <var>value</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1030" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1030]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">http:</title></code>
or <code>https<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">https:</title></code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1031" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1031]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor>.<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Proxy configuration<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy configuration</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's host</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's host</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's port</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's port</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">username<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's username</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">username<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's username</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">password<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's password</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">password<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's password</title></f></dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1032" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1032]</anchor-end> Otherwise, if <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>socks4<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">socks4:</title></code>
or <code>socks5<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">socks5:</title></code> and <code>url</code>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's host</title></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1033" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1033]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor>.<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Proxy configuration<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy configuration</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's host</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's host</title></f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's port</title></f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's port</title></f></dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1034" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1034]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1035" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1035]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MAY</MAY> report an error and <MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MAY</MAY>
terminate the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1036" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1036]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1045" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1045]</anchor-end> To <dfn>get an environment variable</dfn> with string <var>name</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1047" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1047]</anchor-end> Let <var>value</var> be the value of the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process</anchor>'s
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">environment variable</anchor> whose name is <var>name</var>, if any, or the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1290" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1290]</anchor-end> Let <var>uc name</var> be <var>name</var>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">converted to ASCII uppercase</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1373" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1373]</anchor-end> Let <var>uc value</var> be the value of the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process</anchor>'s
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">environment variable</anchor> whose name is <var>uc name</var>, if any, or the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1046" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1046]</anchor-end> If <var>value</var> is not the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor> and <var>value</var> is not <var>uc value</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1049" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1049]</anchor-end> Let <var>encoding</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding</anchor> of the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">platform</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1048" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1048]</anchor-end> Return the result of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">decoding<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">decode</title></anchor> <var>value</var> in <var>encoding</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1050" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1050]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1051" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1051]</anchor-end> Return <code>null</code>.</li></ol></li></ol></figure></p><figure class="important"><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1374" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1374]</anchor-end> For security, uppercase environment variable <code>HTTP_PROXY</code>
cannot be used.</p></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1000" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1000]</anchor-end> The <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">get proxies</f> steps for <var>url</var> are these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1018" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1018]</anchor-end> For each <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor> <var>host</var> in <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">no proxy hosts</f>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1019" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1019]</anchor-end> If <var>host</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">equals<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">host equivalence</title></anchor> <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1020" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1020]</anchor-end> Return a list whose only member is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor>
whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f> is <code>tcp</code> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="611" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[611]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">http:</title></code> and 
<var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP proxy</f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1012" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1012]</anchor-end> Return a list whose only member is <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP proxy</f>
and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1013" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1013]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>https<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">https:</title></code> and 
<var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS proxy</f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1014" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1014]</anchor-end> Return a list whose only member is <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS proxy</f>
and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1015" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1015]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>ftp<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ftp:</title></code> and 
<var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP proxy</f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1016" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1016]</anchor-end> Return a list whose only member is <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP proxy</f>
and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="546" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[546]</anchor-end> Return a list whose only member is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor>
whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f> is <code>tcp</code>.</li></ol></figure></p></section><section><h1>Proxy configurations from ProxyRules</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="609" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[609]</anchor-end> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://developer.chrome.com/extensions/proxy#type-ProxyRules">https://developer.chrome.com/extensions/proxy#type-ProxyRules</anchor-external></ed></section><section><h1>Proxy configurations from WebDriver</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"></ed></section><section><h1>Proxy configurations from PAC</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1319" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1319]</anchor-end> This subsection applies to a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> which is configured to
use a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PAC</anchor> script to choose appropriate proxies.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1320" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1320]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> has following states, whose values can be configured by
the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user</anchor>:<figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>PAC</anchor> <anchor>URL</anchor></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">use <anchor>WPAD</anchor> flag</f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1004" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1004]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> has a <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>PAC</anchor> script</f>, which is initially <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1001" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1001]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> send appropriate <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WPAD</anchor> request
if its <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">use <anchor>WPAD</anchor> flag</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1003" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1003]</anchor-end> If a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PAC</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor> is provided by <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WPAD</anchor> processing,
the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">fetch</anchor> the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PAC</anchor> file.
Otherwise, if <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>PAC</anchor> <anchor>URL</anchor></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>,
the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">fetch</anchor> the <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>PAC</anchor> <anchor>URL</anchor></f>.
When a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PAC</anchor> script file is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">fetch</anchor>ed, the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>PAC</anchor> script</f> <MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> be set to the file.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1321" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1321]</anchor-end> The <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">get proxies</f> steps for <var>url</var> are these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="544" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[544]</anchor-end> If <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>PAC</anchor> script</f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="545" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[545]</anchor-end> Process <var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>PAC</anchor> script</f> with <var>url</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1011" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1011]</anchor-end> Return the result of the previous step and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1322" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1322]</anchor-end> Return a list whose only member is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor>
whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's protocol</title></f> is <code>tcp</code>.</li></ol></figure></p></section></section><section><h1>Transports</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="640" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[640]</anchor-end> A <dfn>transport</dfn> has following states:</p><figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="408" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[408]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol</f><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></dfn></dt><dd>
One of 
<code>tcp</code>,
<code>unix</code>,
<code>http1connect</code>,
<code>http2connect</code>,
<code>tls</code>,
<code>socks4</code>, and
<code>socks5</code>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dfn></dt><dd>
Either <code>client</code> or <code>server</code>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f></dfn></dt><dd>
Either <code>http1</code>, <code>http2</code>, or <code>ftp</code>.
The default is <code>http1</code>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's proxy configuration</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration</anchor>.</dd><dt><var>送信閉じ済みフラグ</var></dt><dd>初期状態では未設定。</dd><dt><var>受信閉じ済みフラグ</var></dt><dd>初期状態では未設定。</dd><dt><var>送信待ちバッファー</var></dt><dd>初期状態では空のリスト。</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request mode</f></dfn></dt><dd>
The value is either <em>default</em> or <em>HTTP proxy</em>.
If the <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request mode</f> of a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> is <em>HTTP proxy</em>,
a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request</anchor> has to be sent over the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> as an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP request</anchor>
whose <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request target</anchor> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">absolute URL</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS state</f><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's HTTPS state</title></dfn></dt><dd>
An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS state</anchor> value.  Either <code>none</code>, <code>deprecated</code>, or <code>modern</code>.
The default is <code>none</code>.</dd></dl></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="819" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[819]</anchor-end> There are also <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> dependent 
additional states.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="38" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[38]</anchor-end> An <dfn>exit status</dfn> has following states:</p><figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="469" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[469]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit status</title></anchor></figcaption><dl><dt>リセット</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>か<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。既定値は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。</dd><dt>失敗</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>か<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> cleanly</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>か<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>か null。既定値は null。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>か null。既定値は null。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> 理由</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>か null。既定値は null。</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">can retry<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit's can retry</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  The default is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1054" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1054]</anchor-end> To <dfn>create a transport for a proxy configuration</dfn> <var>proxy</var>
with a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> <var>url</var> and optional <var>ws</var> and <var>skip DNS cache</var>
flags in <var>user agent</var>,
run rhese steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="549" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[549]</anchor-end> If <var>user agent</var> does not support <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol</f>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="550" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[550]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="551" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[551]</anchor-end> Switch by <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol</f>:<figure class="switch"><dl><dt><code>tcp</code></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="552" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[552]</anchor-end> Set <var>effective port</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">effective port</anchor> of <var>url</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="553" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[553]</anchor-end> Set <var>addr</var> to the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">name resolution steps</anchor> 
to <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's host</title></f> with <var>skip DNS cache</var> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="554" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[554]</anchor-end> If <var>addr</var> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">error</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="555" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[555]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="557" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[557]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Wait for other connections<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">wait for other connections</title></anchor> of
<var>addr</var>, <var>port</var>, and <var>ws</var> in <var>user agent</var> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="558" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[558]</anchor-end> Return the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a TCP transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a TCP transport</title></anchor>
to <var>addr</var> and <var>effective port</var>.</li></ol></figure></dd><dt><code>unix</code></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="559" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[559]</anchor-end> Return the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a UNIX socket domain transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a UNIX socket domain transport</title></anchor>
with <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">proxy's path</title></f>, <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's host</title></f>,
and <var>url</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">effective port</anchor>.</li></ol></figure></dd><dt><code>http</code> or <code>https</code></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="560" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[560]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Wait for other connections<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">wait for other connections</title></anchor> of
<var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL host</title></f>, <var>port</var>, and <var>ws</var> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="561" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[561]</anchor-end> Let <var>proxy port</var> be <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="562" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[562]</anchor-end> If <var>proxy port</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="563" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[563]</anchor-end> If <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol</f> is <code>http</code>, set <var>proxy port</var> to <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">80</n>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="564" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[564]</anchor-end> If <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol</f> is <code>https</code>, set <var>proxy port</var> to <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">443</n>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="565" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[565]</anchor-end> Let <var>proxy addr</var> be the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">name resolution steps</anchor> 
to <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="566" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[566]</anchor-end> If <var>proxy addr</var> is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">error</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="567" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[567]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="568" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[568]</anchor-end> Let <var>transport</var> be the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a TCP transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a TCP transport</title></anchor>
to <var>proxy addr</var> and <var>proxy port</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="570" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[570]</anchor-end> If <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol</f> is <code>https</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="571" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[571]</anchor-end> Set <var>transport</var> to the result of running the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS steps</anchor> for
<var>transport</var> and <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="556" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[556]</anchor-end> If <var>transport</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="569" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[569]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="572" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[572]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code class="URI" xml:lang="en">https</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="577" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[577]</anchor-end> Let <var>http</var> be an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f></dt><dd><var>transport</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="578" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[578]</anchor-end> Set <var>transport</var> to the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing an HTTP <code xmlns="http://www.w3.org/1999/xhtml" class="HTTP">CONNECT</code> transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish an HTTP <code xmlns="http://www.w3.org/1999/xhtml" class="HTTP" xml:lang="en">CONNECT</code> transport</title></anchor>
with <var>http</var> and <var>url</var>.<ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><var xmlns="http://www.w3.org/1999/xhtml">credentials</var> flag and proxy credentials</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="579" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[579]</anchor-end> If <var>transport</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> whose HTTP response's <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status</f> is
<code>407</code>:<ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Show proxy auth dialog</ed></li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="580" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[580]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="581" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[581]</anchor-end> Set <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request mode</f> to <em>HTTP proxy</em>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="548" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[548]</anchor-end> Return <var>transport</var>.</li></ol></figure></dd><dt><code>socks4</code></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="582" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[582]</anchor-end> Let <var>effective port</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">effective port</anchor> of <var>url</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="583" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[583]</anchor-end> Set <var>addr</var> to the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">name resolution steps</anchor> 
to <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f> with <var>skip DNS cache</var> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="584" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[584]</anchor-end> If <var>addr</var> is <em>not</em> an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 address</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="585" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[585]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="587" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[587]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Wait for other connections<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">wait for other connections</title></anchor> of
<var>addr</var>, <var>port</var>, and <var>ws</var> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="588" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[588]</anchor-end> Let <var>proxy port</var> be <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="589" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[589]</anchor-end> If <var>proxy port</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>, set <var>proxy port</var> to <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1080</n>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="590" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[590]</anchor-end> Let <var>proxy addr</var> be the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">name resolution steps</anchor> 
to <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="591" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[591]</anchor-end> Let <var>transport</var> be the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a TCP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a TCP connection</title></anchor>
to <var>proxy addr</var> and <var>proxy port</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="592" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[592]</anchor-end> Return the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a SOCKS4 connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a SOCKS4 connection</title></anchor>
with <var>transport</var>, <var>addr</var>, and <var>effective port</var>.</li></ol></figure></dd><dt><code>socks5</code></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="593" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[593]</anchor-end> Let <var>effective port</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">effective port</anchor> of <var>url</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="594" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[594]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Wait for other connections<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">wait for other connections</title></anchor> of
<var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL host</title></f>, <var>port</var>, and <var>ws</var> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="595" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[595]</anchor-end> Let <var>proxy port</var> be <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="597" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[597]</anchor-end> If <var>proxy port</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>, set <var>proxy port</var> to <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1080</n>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="596" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[596]</anchor-end> Let <var>proxy addr</var> be the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">name resolution steps</anchor> 
to <var>proxy</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="598" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[598]</anchor-end> Let <var>transport</var> be the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a TCP transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a TCP transport</title></anchor>
to <var>proxy addr</var> and <var>proxy port</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="599" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[599]</anchor-end> Return the result of
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establishing a SOCKS5 transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish a SOCKS5 transport</title></anchor>
with <var>transport</var>, <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f>, and <var>effective port</var>.</li></ol></figure></dd></dl></figure></li></ol></figure></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="634" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[634]</anchor-end> These steps asynchronously return.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="542" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[542]</anchor-end> To <dfn>establish a transport</dfn> for <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor>s <var>request url</var> and
<var>server url</var>
and a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> <var>user agent</var>, optionally with <var>credentials</var>, <var>ws</var>,
<var><code>acceptSslCerts</code></var>,
and <var>skip DNS cache</var> flags, run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="936" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[936]</anchor-end> Assert: <var>request url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network scheme</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="909" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[909]</anchor-end> Assert: Either <var>server url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">http:</title></code>
or <var>server url</var> is <var>request url</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1009" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1009]</anchor-end> Let <var>proxies</var> be the result of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">getting proxies<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">get proxies</title></anchor> for 
<var>server url</var> in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="547" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[547]</anchor-end> For each <var>proxy</var> in <var>proxies</var>, in order, run these substeps:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1053" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1053]</anchor-end> Set <var>transport</var> to the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">creating a transport for proxy<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">create a transport for a proxy configuration</title></anchor>
<var>proxy</var> with <var>server url</var>, <var>ws</var>, and <var>skip DNS cache</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="600" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[600]</anchor-end> If <var>transport</var> is not a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="601" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[601]</anchor-end> If <var>request url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code class="URI" xml:lang="en">https<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">https:</title></code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="602" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[602]</anchor-end> Set <var>transport</var> to the result of running the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS steps</anchor> for
<var>transport</var>, <var>request url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f>, <var>credentials</var> flag, <var>ws</var> flag,
and <var><code>acceptSslCerts</code></var> flag, in <var>user agent</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="603" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[603]</anchor-end> Otherwise, if <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request mode</f> is <strong>not</strong> <em>HTTP proxy</em> and
<var>request url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code class="URI" xml:lang="en">ftp<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ftp:</title></code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="929" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[929]</anchor-end> Set <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f> to <code>ftp</code>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="927" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[927]</anchor-end> If <var>transport</var> is not a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1182" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1182]</anchor-end> Set <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's proxy configuration</title></f>
to <var>proxy</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="605" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[605]</anchor-end> Return <var>transport</var> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="606" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[606]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="507" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[507]</anchor-end> These steps asynchronously return.</comment-p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="642" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[642]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> に次の指示を行えます。<figure class="list"><ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の送信の指示</li><li>正常終了の送信の指示</li><li>中断の指示</li><li>credentials の送信の指示</li></ul></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="643" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[643]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の送信の指示は、送信する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor> (0-255 のいずれかの値)と、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>か否かのフラグ (既定値は未設定。)
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数</anchor>とし、次のように処理します。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="644" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[644]</anchor-end> <var>送信閉じ済みフラグ</var>が設定されていれば、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を投げて停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="645" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[645]</anchor-end> <var>送信待ちバッファー</var>が満杯なら、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を投げて停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="646" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[646]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>フラグが設定されていて、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> の種類が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>に対応していないものなら、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を投げて停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="647" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[647]</anchor-end> <var>送信待ちバッファー</var>の末尾に、
引数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>、
引数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>か否かのフラグ、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>の組を追加します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="648" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[648]</anchor-end> 追加した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>を返します。</li></ol></figure></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="649" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[649]</anchor-end> 返された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>が送信された際に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解決</anchor>されます。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="650" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[650]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を送信するとは、当該<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>について先頭の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>から順に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の送信の指示を行い、最後の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>が返した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>を返す
(空バイト列なら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解決</anchor>済みの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>を返す) ことをいいます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="651" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[651]</anchor-end> 正常終了の送信の指示は、次のように処理します。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="652" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[652]</anchor-end> <var>送信閉じ済みフラグ</var>が設定されていれば、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を投げて停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="653" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[653]</anchor-end> <var>送信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="654" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[654]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>の種類に応じた処理を行います。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="655" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[655]</anchor-end> 中断の指示は、次のように処理します。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="656" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[656]</anchor-end> <var>送信閉じ済みフラグ</var>と<var>受信閉じ済みフラグ</var>の両方が設定されていれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を投げて停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="657" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[657]</anchor-end> <var>送信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="658" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[658]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="659" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[659]</anchor-end> <var>送信待ちバッファー</var>の先頭の項目から順に、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">拒絶</anchor>していきます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="660" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[660]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>の種類に応じた処理を行います。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="661" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[661]</anchor-end> 中断の通知を行います。リセットフラグを設定します。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="662" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[662]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">credentials</anchor> の送信の指示は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>の種類に応じた処理を実行します。そのようなものがなければ、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">例外</anchor>を投げます。
なお引数として、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>の種類に応じた <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">credentials</anchor> を受け取ります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="663" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[663]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>に対して次の通知を行います。<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="664" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[664]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の受信の通知<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor></dt><dd>受信した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>。 0-255 のいずれかの値。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>フラグ</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>か否か。既定値は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="665" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[665]</anchor-end> 正常終了の受信の通知</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="666" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[666]</anchor-end> 中断の通知<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リセット</anchor>フラグ</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP</anchor> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RST</anchor></code> 相当のものであるか否か。既定値は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="667" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[667]</anchor-end> 警告の通知</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="668" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[668]</anchor-end> challenge の受信の通知<figure class="list members"><dl><dt><var>transport</var></dt><dd>認証を行う <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">challenge</anchor></dt><dd>プロトコル依存の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">challenge</anchor> データ。</dd></dl></figure></li></ul></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="669" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[669]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>の種類に依存した方法で次の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を送信可能であると判断したら、
次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="670" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[670]</anchor-end> <var>送信待ちバッファー</var>が空なら、ここで停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="671" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[671]</anchor-end> <var>送信待ちバッファー</var>の先頭の項目を取得し、バッファーからは削除します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="672" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[672]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>の種類に依存した方法で取得した項目の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を送信します。
(あれば) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>フラグを引渡します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="673" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[673]</anchor-end> 取得した項目の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">約束</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解決</anchor>します。</li></ol></figure></p><section><h1>TCP</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1435" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1435]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is
<code>tcp</code> has following additional states:</p><figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>remote host</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote host</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>remote port</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote port</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>local host</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local host</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>local port</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local port</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>tcp connection</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's tcp connection</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP connection</anchor>.</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="742" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[742]</anchor-end> To <dfn>TCP connect</dfn> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor> <var>host</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>port</var>,
establish a connection to <var>host</var> and <var>port</var> as described in TCP
specifications and asynchronously returns a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP connection</anchor>
representing the connection if the connection is established,
or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> if the connection cannot be established.
A <dfn>TCP connection</dfn> has 
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>local address</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TCP connection's local address</title></f></dfn>, which is an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor>,
and <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>local port</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TCP connection's local port</title></f></dfn>, which is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1437" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1437]</anchor-end> To <dfn>set TCP options</dfn> of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP connection</anchor> <var>tcp</var>,
run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="420" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[420]</anchor-end> Disable the <code>SO_OOBINLINE</code> option of <var>tcp</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="424" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[424]</anchor-end> Enable the <code>SO_NODELAY</code> option of <var>tcp</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="437" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[437]</anchor-end> Run the implementation dependent steps for setting <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP keep alive</anchor> options, e.g.:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="635" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[635]</anchor-end> Enable the <code>SO_KEEPALIVE</code> option of <var>tcp</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="636" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[636]</anchor-end> Set <code>TCP_KEEPIDLE</code> option of <var>tcp</var> to <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">45</n> seconds.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="637" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[637]</anchor-end> Set <code>TCP_KEEPINTVL</code> option of <var>tcp</var> to <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">45</n> seconds.</li></ol></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="627" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[627]</anchor-end> To <dfn>establish a TCP transport</dfn> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> <var>addr</var> and 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>port</var>, run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1416" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1416]</anchor-end> If <var>addr</var> is <code>127.0.53.53</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1417" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1417]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="628" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[628]</anchor-end> Let <var>tcp</var> be the result of invoking
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP connect</anchor> with <var>addr</var> and <var>port</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="629" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[629]</anchor-end> If <var>tcp</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="782" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[782]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="674" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[674]</anchor-end> Let <var>transport</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="406" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[406]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>tcp</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote host</title></f></dt><dd><var>addr</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote port</title></f></dt><dd><var>port</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local host</title></f></dt><dd><var>tcp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local address</f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local port</title></f></dt><dd><var>tcp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local port</f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tcp connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's tcp connection</title></f></dt><dd><var>tcp</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="641" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[641]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set TCP options<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set TCP options</title></anchor> of <var>tcp</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="818" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[818]</anchor-end> Return <var>transport</var>.</li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="510" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[510]</anchor-end> These steps asynchronously return.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="411" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[411]</anchor-end> Whenever it accepts a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP connection</anchor> <var>tcp</var> from
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> <var>remote addr</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>remote port</var>,
a TCP server listening <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> <var>addr</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>port</var>
<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP after accept steps</anchor> with
<var>tcp</var>,
<var>addr</var>, <var>port</var>, <var>remote addr</var>, and <var>remote port</var>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="524" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[524]</anchor-end> The <dfn>TCP after accept steps</dfn> with 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP connection</anchor> <var>tcp</var>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> <var>addr</var>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>port</var>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IP address</anchor> <var>remote addr</var>, and
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>remote port</var> are:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="414" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[414]</anchor-end> Let <var>transport</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> representing the
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP connection</anchor>, with following states:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="417" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[417]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>tcp</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>server</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote host</title></f></dt><dd><var>remote addr</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote port</title></f></dt><dd><var>remote port</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local host</title></f></dt><dd><var>addr</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local port</title></f></dt><dd><var>port</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tcp connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's tcp connection</title></f></dt><dd><var>tcp</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1436" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1436]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set TCP options<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set TCP options</title></anchor> of <var>tcp</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="460" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[460]</anchor-end> Optionally, run implementation dependent steps (e.g. <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DoS</anchor> protection).</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="446" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[446]</anchor-end> Return <var>transport</var>.</li></ol></figure><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="676" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[676]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セグメント</anchor>を受信したら、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="677" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[677]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP</anchor> に従い処理し、不適切と判断すればここで停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="678" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[678]</anchor-end> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RST</anchor></code> フラグが設定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="679" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[679]</anchor-end> <var>送信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="680" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[680]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="681" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[681]</anchor-end> 中断を通知します。リセットフラグを設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="682" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[682]</anchor-end> データの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>について、順に、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="683" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[683]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の受信を通知します。当該<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の値を渡します。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急ポインター</anchor>が本<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を指していれば、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>フラグも設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="684" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[684]</anchor-end> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></code> フラグが設定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="685" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[685]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="686" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[686]</anchor-end> 正常終了の受信を通知します。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="687" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[687]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タイムアウト</anchor>その他の理由で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>が利用できないことを検知したら、
次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="688" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[688]</anchor-end> <var>送信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="689" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[689]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="690" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[690]</anchor-end> 中断を通知します。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="691" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[691]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を送信できるかどうかは、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フロー制御</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">輻輳制御</anchor>その他の状況により決定します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="692" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[692]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の送信は、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="693" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[693]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>フラグが設定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="694" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[694]</anchor-end> 指定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>をデータとして含み、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急ポインター</anchor>が当該<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を指す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セグメント</anchor>を送信することにします。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="695" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[695]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="696" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[696]</anchor-end> 指定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>をデータとして含む<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セグメント</anchor>を送信することにします。</li></ol></li></ol></figure></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="697" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[697]</anchor-end> 実際の送信時には、前後の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>とまとめた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セグメント</anchor>で送信されたり、
必要に応じて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">再送</anchor>されたりします。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="698" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[698]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>に対応しています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="699" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[699]</anchor-end> 正常終了の送信の指示があれば、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="700" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[700]</anchor-end> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></code> フラグが設定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セグメント</anchor>を送信することにします。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="701" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[701]</anchor-end> 中断の指示があれば、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="702" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[702]</anchor-end> 必要に応じて <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></code> フラグが設定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セグメント</anchor>を送信することにします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="703" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[703]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP</anchor> で受信したデータの処理を以後行わないことにします。</li></ol></figure></p></section><section><h1>HTTP <code class="HTTP" xml:lang="en">CONNECT</code></h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="633" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[633]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is
<code>http1connect</code> or <code>http2connect</code> has following additional states:</p><figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http</title></f></dfn></dt><dd>An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's established</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="739" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[739]</anchor-end> To <dfn>establish an HTTP <code class="HTTP" xml:lang="en">CONNECT</code> transport</dfn>
with <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor> <var>http</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> <var>url</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="740" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[740]</anchor-end> Let <var>transport</var> be a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="632" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[632]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd>
If <var>http</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's protocol</title></f> is <code>http2</code>, <code>http2connect</code>.
Otherwise, <code>http1connect</code>.</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http</title></f></dt><dd><var>http</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="766" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[766]</anchor-end> Send an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP request</anchor> over <var>http</var>:<figure class="list members"><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">method<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request method</title></f></dt><dd><code>CONNECT</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request target</f></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hostport</f></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list</f></dt><dd><figure class="list members"><dl><dt><code>Host</code></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hostport</f></dd><dt><code>Proxy-Connection</code></dt><dd><code>keep-alive</code></dd><dt><code>User-Agent</code></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">default `<code xmlns="http://www.w3.org/1999/xhtml">User-Agent</code>` value</anchor></dd></dl></figure></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="741" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[741]</anchor-end> If failed, return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="817" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[817]</anchor-end> Process notifications from <var>http</var> as follows:<figure class="switch"><dl><dt><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="744" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[744]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>のヘッダー受信完了の通知</dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="745" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[745]</anchor-end> 応答の状態符号が <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="746" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[746]</anchor-end> Set <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's established</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="747" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[747]</anchor-end> Return <var>transport</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="748" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[748]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="749" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[749]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</li></ol></li></ol></figure></dd><dt><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="750" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[750]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>の <code>data</code> の通知</dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="751" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[751]</anchor-end> If <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's established</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="752" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[752]</anchor-end> データの各バイトについて、順に、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="753" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[753]</anchor-end> バイトの受信を通知します。当該バイトの値を渡します。</li></ol></li></ol></li></ol></figure></dd><dt><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="754" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[754]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>の <code>dataend</code> の通知</dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="755" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[755]</anchor-end> If <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's established</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="756" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[756]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="757" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[757]</anchor-end> 正常終了の受信を通知します。</li></ol></li></ol></figure></dd><dt><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="758" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[758]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>の完了の通知</dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="759" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[759]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="760" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[760]</anchor-end> If <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's established</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="761" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[761]</anchor-end> <var>送信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="762" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[762]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="763" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[763]</anchor-end> 中断を通知します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="764" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[764]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="765" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[765]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>.</li></ol></li></ol></li></ol></figure></dd></dl></figure></li></ol></figure></p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="738" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[738]</anchor-end> XXX server accept steps</ed><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="767" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[767]</anchor-end> バイトは常に送信可能とします。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="768" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[768]</anchor-end> バイトの送信は、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="769" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[769]</anchor-end> <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http</title></f> でトンネルに指定されたバイトを送信します。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="770" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[770]</anchor-end> 正常終了の送信の指示があれば、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="771" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[771]</anchor-end> <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http</title></f> に接続の正常終了を指示します。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="772" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[772]</anchor-end> 中断の指示があれば、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="773" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[773]</anchor-end> <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http</title></f> に中断を指示します。</li></ol></figure></p><section><h1>HTTP/2</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"></ed></section></section><section><h1>SOCKS4</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="743" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[743]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is
<code>socks4</code> has following additional state:</p><figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">socks4 transport's transport</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>.</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="774" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[774]</anchor-end> To <dfn>establish a SOCKS4 transport</dfn>
to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 address</anchor> <var>address</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>port</var> over 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> <var>transport</var>, run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="776" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[776]</anchor-end> <var>transport</var>で 0x04 0x01 <var>p<sub>1</sub></var> <var>p<sub>2</sub></var> <var>a<sub>1</sub></var> <var>a<sub>2</sub></var>
<var>a<sub>3</sub></var> <var>a<sub>4</sub></var> 0x00 を送信します。<ul><li><var>p<sub>1</sub></var> <var>p<sub>2</sub></var> は<var>port</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16ビット符号無し整数</anchor>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>) としたものです。</li><li><var>a<sub>1</sub></var> <var>a<sub>2</sub></var> <var>a<sub>3</sub></var> <var>a<sub>4</sub></var>
は<var>address</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">32ビット符号無し整数</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>) としたものです。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="777" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[777]</anchor-end> <var>transport</var>から8バイト受信するのを最大30s待ちます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="778" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[778]</anchor-end> 受信した最初の2バイトが 0x00 0x5A でなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="779" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[779]</anchor-end> <var>transport</var>の中断を指示します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="780" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[780]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="781" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[781]</anchor-end> Return a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="630" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[630]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>socks4</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">socks4 transport's transport</title></f></dt><dd><var>transport</var></dd></dl></figure></li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="511" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[511]</anchor-end> These steps asynchronously return.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="783" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[783]</anchor-end> 接続確立後は、指示は<var>transport</var>への指示とし、
<var>transport</var>からの通知があればそれを通知します。</p></section><section><h1>SOCKS5</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="775" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[775]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is
<code>socks5</code> has following additional state:</p><figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">socks5 transport's transport</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>.</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="784" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[784]</anchor-end> To <dfn>establish a SOCKS5 transport</dfn>
to destination <var>host</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</anchor> <var>port</var> over <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> <var>transport</var>,
run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="785" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[785]</anchor-end> If <var>host</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor> whose length is greater than <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">255</n>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="803" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[803]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="786" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[786]</anchor-end> <var>transport</var>で 0x05 0x01 0x00 を送信します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="787" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[787]</anchor-end> <var>transport</var>から2バイト受信するのを最大30s待ちます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="788" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[788]</anchor-end> 受信したのが 0x05 0x00 でなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="789" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[789]</anchor-end> <var>transport</var>の中断を指示します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="790" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[790]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="791" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[791]</anchor-end> <var>transport</var>で 0x05 0x01 0x00 <var>A</var> <var>p<sub>1</sub></var> <var>p<sub>2</sub></var>
を送信します。<ul><li><var>A</var> は、<ol><li><var>host</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ドメイン名</anchor>の場合、<var>host</var>を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> に変換したものの前に
<var>host</var> を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> に変換したもののバイト数を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor>としたものを置いたものです。</li><li><var>host</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4アドレス</anchor>の場合、<var>host</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">32ビット符号無し整数</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>) としたものです。</li><li><var>host</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv6アドレス</anchor>の場合、<var>host</var>を16バイトのバイト列としたものです。</li></ol></li><li><var>p<sub>1</sub></var> <var>p<sub>2</sub></var> は<var>port</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16ビット符号無し整数</anchor>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>) としたものです。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="792" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[792]</anchor-end> <var>transport</var>から5バイト受信するのを最大30s待ちます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="793" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[793]</anchor-end> 受信した最初の3バイトが 0x05 0x00 0x00 でないか、
第4バイトが 0x01, 0x03, 0x04 のいずれでもないか、
5バイトに満たなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="794" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[794]</anchor-end> <var>transport</var>の中断を指示します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="795" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[795]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="796" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[796]</anchor-end> 第4バイトが 0x01 なら、<var>transport</var>から5バイト受信するのを最大30s待ちます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="797" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[797]</anchor-end> 第4バイトが 0x03 なら、第5バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号無し整数</anchor>として解釈し、
<var>transport</var>からそのバイト数 + 2 バイト分受信するのを最大30s待ちます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="798" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[798]</anchor-end> 第4バイトが 0x04 なら、<var>transport</var>から17バイト受信するのを最大30s待ちます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="799" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[799]</anchor-end> 得られたのが指定のバイト数に満たなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="800" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[800]</anchor-end> <var>transport</var>の中断を指示します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="801" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[801]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="802" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[802]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="576" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[576]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>socks5</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">socks5 transport's transport</title></f></dt><dd><var>transport</var></dd></dl></figure></li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="520" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[520]</anchor-end> These steps asynchronously return.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="804" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[804]</anchor-end> 接続確立後は、指示は<var>transport</var>への指示とし、
<var>transport</var>からの通知があればそれを通知します。</p></section><section><h1>Unix domain sockets</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="805" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[805]</anchor-end> To <dfn>establish a Unix domain socket connection</dfn> for <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor> <var>path</var>
with <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor> <var>host</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">integer</anchor> <var>port</var>, run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="807" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[807]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ソケットAPI</anchor>を使って新たに接続します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アドレス族</anchor></dt><dd><code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">AF_UNIX</anchor></code></dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">パス名</anchor></dt><dd><var>path</var></dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ソケット型</anchor></dt><dd><code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SOCK_STREAM</anchor></code></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="806" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[806]</anchor-end> If failed, return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="820" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[820]</anchor-end> Return a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> representing the socket,
with following states:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="631" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[631]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>unix</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>client</code></dd></dl></figure></li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="522" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[522]</anchor-end> These steps asynchronously return.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="604" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[604]</anchor-end> A Unix domain socket server, whenever it accepts a connection,
<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unix domain socket after accept steps</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="586" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[586]</anchor-end> The <dfn>Unix domain socket after accept steps</dfn> are:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="608" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[608]</anchor-end> Let <var>transport</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> representing the
Unix domain socket connection, with following states:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="620" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[620]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>unix</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>server</code></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="675" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[675]</anchor-end> Return <var>transport</var>.</li></ol></figure><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="810" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[810]</anchor-end> バイトが送信可能かどうかは、 <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">send</anchor></code> によりバイト列を送信できるかどうかとします。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="811" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[811]</anchor-end> バイトの送信は、 <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">send</anchor></code> によります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="812" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[812]</anchor-end> 正常終了の送信の指示があれば、 <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">shutdown</anchor></code> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SHUT_WR</anchor></code> を実行します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="813" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[813]</anchor-end> 中断の指示があれば、 <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">shutdown</anchor></code> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SHUT_RDWR</anchor></code> を実行します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="814" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[814]</anchor-end>  <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">recv</anchor></code> によりバイト列を受信したら、
各バイトを順に、バイトの受信を通知します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="815" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[815]</anchor-end> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">recv</anchor></code> で何も受信しなくなれば、
<var>送信閉じ済みフラグ</var>を設定し、正常終了の受信を通知します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="816" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[816]</anchor-end> <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">send</anchor></code> や <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">recv</anchor></code> でエラーが発生したら、
<var>送信閉じ済みフラグ</var>と<var>受信閉じ済みフラグ</var>を設定し、
中断を通知します。</p></section><section><h1>TLS</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="877" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[877]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is
<code>tls</code> has following additional states:<figure class="list members"><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">is ev</f></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.
The default is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote certificates</f></dt><dd>A list of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificates<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">certificate</title></anchor>.</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">has alert</f></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.
The default is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="638" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[638]</anchor-end> The <dfn>TLS steps</dfn> for <var>transport</var>, <var>url</var>, and <var>credentials</var>,
with optional <var>ws</var> and <var><code>acceptSslCerts</code></var> flags,
in <var>user agent</var> are as follows:<figure class="steps"><ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">credentials</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="878" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[878]</anchor-end> If <var>ws</var> is true:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="879" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[879]</anchor-end> Set <var>alpn protocols</var> to (<code>http/1.1</code>).</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="880" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[880]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="881" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[881]</anchor-end> Set <var>alpn protocols</var> to (<code>h2</code>, <code>http/1.1</code>).</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">If switched from HTTP/2 to HTTP/1.1</ed></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="356" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[356]</anchor-end> Initiate <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS handshake</anchor>.<figure class="list members"><dl><dt>Minimum TLS version</dt><dd><code>1.0</code></dd><dt>Underlying transport</dt><dd><var>transport</var></dd><dt>Compression</dt><dd>Disabled</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS session</anchor> cache</dt><dd><var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>TLS session</anchor> cache</f></dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SNI</anchor> host</dt><dd>
If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor>, <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f>.
Otherwise, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt>Use <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP stapling</anchor> request</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ALPN protocol names<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ALPN protocol name</title></anchor></dt><dd><var>alpn protocols</var></dd><dt>Certificate database</dt><dd><var>user agent</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate database</f></dd><dt>Additional verification for server certificate <var>cert</var></dt><dd>
Return the result of running the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">service identity verification steps</anchor> with
<var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f> and <var>cert</var>.</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="861" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[861]</anchor-end> If failed, return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="865" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[865]</anchor-end> Let <var>alpn</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ALPN protocol name</anchor> obtained by the TLS handshake.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="872" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[872]</anchor-end> Let <var>version</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> protocol version in use.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="873" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[873]</anchor-end> Let <var>cipher</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cipher suite</anchor> and parameters in use.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="866" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[866]</anchor-end> If <var>alpn</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> or <code>http/1.1</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="867" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[867]</anchor-end> Set <var>protocol</var> to <code>http1</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="868" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[868]</anchor-end> Otherwise, if <var>alpn</var> is <code>h2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="869" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[869]</anchor-end> Set <var>protocol</var> to <code>http2</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="885" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[885]</anchor-end> If one of the following conditions is met:<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="887" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[887]</anchor-end> <var>version</var> is <code>1.0</code> or <code>1.1</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="888" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[888]</anchor-end> <var>cipher</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cipher suite</anchor> is blacklisted by the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/2</anchor> specification</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="890" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[890]</anchor-end> <var>cipher</var>'s parameter is disallowed by the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/2</anchor> specification</li></ul></figure><ol><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error <code xmlns="http://www.w3.org/1999/xhtml">INADEQUATE_SECURITY</code></ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="886" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[886]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="870" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[870]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="871" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[871]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="874" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[874]</anchor-end> Let <var>certs</var> be the received <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificates<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">certificate</title></anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="876" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[876]</anchor-end> Let <var>ev</var> be whether <var>certs</var> contain a valid <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EV certificate</anchor> or not.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="985" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[985]</anchor-end> Let <var>ocsp</var> be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP stapling</anchor> response, if any, or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="993" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[993]</anchor-end> For each <var>cert</var> in <var>certs</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CA certificates<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">CA certificate</title></anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="994" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[994]</anchor-end> If the result of running the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate revocation verification steps</anchor>
with <var>certificate</var> set to <var>cert</var>, <var>certificate type</var> set to <em>CA certificate</em>,
and <var>ocsp</var> set to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>, is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>:</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="704" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[704]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="862" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[862]</anchor-end> If the result of running the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate revocation verification steps</anchor>
with <var>certificate</var> set to <var>certs</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">end entity certificate</anchor>,
<var>certificate type</var> set to <em>end entity</em>, and <var>ocsp</var>, is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="704" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[704]</anchor-end> Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="705" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[705]</anchor-end> Apply <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PKP</anchor> verification for <var>certs</var> and <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f>
in <var>user agent</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="860" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[860]</anchor-end> Let <var>tls transport</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> that represents the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS connection</anchor>,
with following states:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1423" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1423]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>tls</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f></dt><dd><var>protocol</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">is ev</f></dt><dd><var>ev</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote certificates</f></dt><dd><var>certs</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="859" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[859]</anchor-end> Set <var>tls transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's HTTPS state</title></f>
to <code>modern</code> or <code>deprecated</code>, as determined by an implementation dependent
algorithm whose inputs are <var>version</var>, <var>cipher</var>, <var>certs</var>,
and whether there are TLS warnings or not.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="906" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[906]</anchor-end> Return <var>tls transport</var>.</li></ol></figure></p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1376" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1376]</anchor-end> If <var xmlns="http://www.w3.org/1999/xhtml"><code>acceptSslCerts</code></var> flag is set, ignore verification errors.</ed><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="941" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[941]</anchor-end> When <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SNI</anchor> host is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>, the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> client is not expected to
send any <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SNI</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">extension<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TLS extension</title></anchor> in the handshake.</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="895" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[895]</anchor-end> The <dfn>certificate revocation verification steps</dfn> for
<var>certificate</var> (a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate</anchor>),
<var>certificate type</var> (<em>CA certificate</em> or <em>end entity certificate</em>), and
<var>ocsp</var> (an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP response</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>) are these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="864" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[864]</anchor-end> If the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate database</f> knows whether
<var>cert</var> has been revoked or not:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="875" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[875]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> if <var>cert</var> has been revoked,
or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> otherwise, and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="937" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[937]</anchor-end> If <var>ocsp</var> is a valid <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP</anchor> response:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="999" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[999]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> if <var>cert</var> has been revoked according to <var>ocsp</var>,
or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> otherwise, and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="989" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[989]</anchor-end> Otherwise, if <var>cert</var> has the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP must-staple</anchor> option enabled:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="940" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[940]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="990" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[990]</anchor-end> Let <var>duration</var> be <var>cert</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">notAfter</code></f> timestamp - 
<var>cert</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">notBefore</code></f> timestamp.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="991" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[991]</anchor-end> If <var>duration</var> is less than 10 days (i.e. <var>cert</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">short-lived certificate</anchor>):<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="992" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[992]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="863" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[863]</anchor-end> Let <var>ocsp url</var> be <var>cert</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="995" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[995]</anchor-end> If <var>ocsp url</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>,
the implementation <MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MAY</MAY> run these substeps:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="996" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[996]</anchor-end> Send an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP</anchor> request for <var>cert</var> to <var>ocsp url</var>.
Set <var>ocsp</var> to the result.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="997" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[997]</anchor-end> If <var>ocsp</var> is a valid <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OCSP</anchor> response:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="986" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[986]</anchor-end> Let <var>result</var> be <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor> if <var>cert</var> has been revoked according to <var>ocsp</var>,
or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> otherwise.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="998" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[998]</anchor-end> <MAY xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Optionally</MAY>, save <var>result</var> to the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate database</f> as the cached verification result for <var>cert</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="988" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[988]</anchor-end> Return <var>result</var> and abort these steps.</li></ol></li></ol></li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">unset EV flag (and set HTTPS state to deprecated?)</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="987" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[987]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></figure></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="523" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[523]</anchor-end> These steps asynchronously return.</comment-p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="938" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[938]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS state</anchor> steps</ed><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="939" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[939]</anchor-end> is EV flag</ed><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="384" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[384]</anchor-end> A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">user agent</anchor> has <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor>TLS session</anchor> cache</f> and
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificate database</f>.</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="923" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[923]</anchor-end> A TLS server, whenever its underlying transport accepts a connection,
<MUST xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUST</MUST> run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="928" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[928]</anchor-end> Assert: The underlying transport protocol is 
TCP or Unix domain socket.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="925" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[925]</anchor-end> Let <var>transport</var> be the result of running
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCP after accept steps</anchor>, if the underlying transport protocol is TCP, or
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unix domain socket after accept steps</anchor>, otherwise.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1424" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1424]</anchor-end> Start TLS over <var>transport</var>.<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="706" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[706]</anchor-end> Optionally, perform implementation dependent verification of the client certificates.</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">OCSP stapling</ed></li></ul></li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">If failed, ...</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1433" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1433]</anchor-end> Let <var>protocol</var> be <code>http/1.1</code>.</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ALPN: H2</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1431" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1431]</anchor-end> Let <var>certs</var> be the received <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">certificates<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">certificate</title></anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1426" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1426]</anchor-end> Let <var>tls transport</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> that represents the 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS connection</anchor>, with following states:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1430" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1430]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f></dt><dd><code>tls</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's endpoint type</title></f></dt><dd><code>server</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's http protocol</title></f></dt><dd><var>protocol</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote certificates</f></dt><dd><var>certs</var></dd></dl><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> の版</li><li>選択された <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cipher suite</anchor> と引数</li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SNI</anchor> ホスト名</li></ul></ed></figure></li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Verify TLS version and cipher suites.</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1434" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1434]</anchor-end> Return <var>transport</var>.</li></ol></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1427" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1427]</anchor-end> These steps asynchronously return.</comment-p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="707" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[707]</anchor-end> <var>transport</var>からバイトを受信したら、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>フラグを <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> に従い処理します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="708" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[708]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">closure alert</anchor> を受信したら、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="709" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[709]</anchor-end> 正常終了の受信を通知します。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="710" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[710]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">error alert</anchor> を受信したら、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="891" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[891]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">has alert</f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="711" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[711]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">alert level</anchor> が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">警告</anchor> and <var>user agent</var> does not have
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HSTS policy</anchor> or pin for <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="712" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[712]</anchor-end> 警告を通知します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="713" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[713]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="714" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[714]</anchor-end> <var>送信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="715" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[715]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="716" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[716]</anchor-end> 中断を通知します。リセットフラグを設定します。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="717" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[717]</anchor-end> <var>transport</var>から正常終了を受信したら、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="718" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[718]</anchor-end> <var>受信閉じ済みフラグ</var>が設定されていなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="719" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[719]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="720" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[720]</anchor-end> 正常終了の受信を通知します。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="721" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[721]</anchor-end> <var>transport</var>から中断を受信したら、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="722" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[722]</anchor-end> <var>受信閉じ済みフラグ</var>と<var>送信閉じ済みフラグ</var>のどちらかが未設定なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="723" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[723]</anchor-end> <var>送信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="724" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[724]</anchor-end> <var>受信閉じ済みフラグ</var>を設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="725" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[725]</anchor-end> 中断を通知します。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="726" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[726]</anchor-end> バイトの送信は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> に従い処理します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="727" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[727]</anchor-end> バイトを送信できるかどうかは、新たなバイトを入力として <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor>
で処理できるかどうかとします。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="728" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[728]</anchor-end> 正常終了の送信の指示があれば、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="729" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[729]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">closure alert</anchor> を送信します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="730" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[730]</anchor-end> <var>transport</var>に正常終了の送信を指示します。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="731" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[731]</anchor-end> 中断の指示があれば、<var>transport</var>に中断を指示します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="732" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[732]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> の処理によりバイト列を送信するべきときは、
<var>transport</var>で指定されたバイト列を送信します。</p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="889" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[889]</anchor-end> TLS renegotiation:
If protocol is http2 and after preface, connection error PROTOCOL_ERROR</ed><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="733" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[733]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> の最初の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">handshake</anchor> 
または<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">再折衝</anchor>により<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント証明書</anchor>を要求された時は、
次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="734" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[734]</anchor-end> challenge の受信を通知します。<figure class="list members"><dl><dt><var>transport</var></dt><dd><var>transport</var></dd><dt>challenge</dt><dd>(サーバーなら) <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ClientHello</anchor></code>
や (クライアントなら) <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CertificateRequest</anchor></code>
に含まれる情報のうち必要なもの。</dd></dl></figure></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="735" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[735]</anchor-end> credentials の送信は、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="736" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[736]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">credentials</anchor> を受け付ける状態でなければ、例外を投げて停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="737" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[737]</anchor-end> そうでなければ、与えられた <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">credentials</anchor> を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLS</anchor> の処理に引渡します。</li></ol></figure></p></section></section><section><h1>HTTP/1</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="355" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[355]</anchor-end> An <dfn>HTTP connection</dfn> has following states:<figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's endpoint type</title></f></dfn></dt><dd><code>client</code> or <code>server</code>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[34]</anchor-end> An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's protocol</title></f> is <code>http1</code>
has following additional states:</p><figure class="list members"><dl><dt><var>状態</var></dt><dd>後述の状態遷移における状態のいずれか。初期値は「初期」。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f></dt><dd>
One of <code>null</code>, &quot;raw&quot;, &quot;websocket&quot;, or &quot;sent&quot;.  Initially, <code>null</code>.</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f></dt><dd>
A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd><dt><var>要求</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>か null。初期値は null です。</dd><dt><var>応答</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>か null。初期値は null です。</dd><dt><var>一時バッファー</var></dt><dd>バイト列。初期値は空。</dd><dt><var>最後のヘッダー</var></dt><dd>ヘッダーか null</dd><dt><var>残り長さ</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>か null か「chunked」かエラー。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response received<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response received</title></f></dt><dd>
A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <strong><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></strong>.</dd><dt><var>要求の転送済</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>。初期値は 0。</dd><dt><var>要求の処理完了</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Promise</anchor> か null。初期値は null。</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket key</f></dfn></dt><dd>A byte string or <code>null</code>.  Initially, <code>null</code>.</dd><dt><var>WebSocket接続の状態</var></dt><dd><code>CONNECTING</code>、<code>OPEN</code>、
<code>CLOSING</code>、null のいずれか。初期値は null。</dd><dt><var>フレーム</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>または null。初期値は null。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Binary</anchor>, or <code>null</code>.
Initially, <code>null</code>.</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">decoder<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's decoder</title></f></dt><dd>A <code class="DOMi" xml:lang="en">TextDecoder</code> or <code>null</code>. 
Initially, <code>null</code>.</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f></dt><dd>An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.
Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><var>切断タイマー</var></dt><dd>タイマー。</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f></dfn></dt><dd>A byte string or <code>null</code>.  Initially, <code>null</code>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream WebSocket subprotocols</f></dfn></dt><dd>An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ordered set</anchor> of zero or more byte strings.
Initially, an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">list empty</title></anchor> set.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream received</f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream sent</f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="314" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[314]</anchor-end> タイマーは、初期状態では動作していません。時間と動作が設定されると、
指定時間経過後に指定の動作が実行されます。既に設定された動作は取り消され、実行されません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="62" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[62]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>は、次のようなデータ構造です。<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor></figcaption><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求メソッド</anchor></dt><dd>バイト列。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求対象</anchor></dt><dd>バイト列。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor></dt><dd><code>1.1</code>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーリスト</anchor></dt><dd>0個以上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>のリスト。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor></dt><dd>バイト列。初期値は空。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></anchor> value.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket subprotocols</f></dfn></dt><dd>An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ordered set</anchor> of zero or more byte strings.
Initially, an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">list empty</title></anchor> list.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="63" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[63]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>は、次のようなデータ構造です。<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor></figcaption><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor></dt><dd><code>0.9</code>, <code>1.0</code>, <code>1.1</code> のいずれか。初期値は <code>0.9</code>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>。初期値は <code>200</code>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</anchor></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。初期値は <code>OK</code>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーリスト</anchor></dt><dd>0個以上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>のリスト。初期値は空。</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f></dfn></dt><dd>
A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure></p><section><h1>アプリケーションからの指示</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="42" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[42]</anchor-end> 要求の送信は、次のようにします。この処理は、
<var>connection</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>である<var>送信する要求</var>を入力として受け取ります。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="90" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[90]</anchor-end> Assert: The following conditions have to be <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="93" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[93]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求メソッド</anchor>が空ではない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="94" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[94]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求メソッド</anchor>に 0x09, 0x0A, 0x0D, 0x20 が含まれない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="95" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[95]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求対象</anchor>が空ではない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="96" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[96]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求対象</anchor>に 0x0A, 0x0D が含まれない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="97" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[97]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求対象</anchor>の先頭と末尾が 0x09, 0x20 でない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="99" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[99]</anchor-end> <var>送信する要求</var>'s すべての<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>について、<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="100" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[100]</anchor-end> 名前に 0x3A が含まれない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="101" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[101]</anchor-end> 名前が空ではない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="103" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[103]</anchor-end> 名前に 0x0A, 0x0D が含まれない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="102" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[102]</anchor-end> 名前の先頭と末尾が 0x09, 0x20 でない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="104" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[104]</anchor-end> 値に 0x0A, 0x0D が含まれない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="105" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[105]</anchor-end> 値の先頭と末尾が 0x09, 0x20 でない。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="298" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[298]</anchor-end> <var>送信する要求</var>'s <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transfer-Encoding:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>がない。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="91" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[91]</anchor-end> If <var>送信する要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f> is <code>websocket</code>:<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="92" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[92]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor> is empty.</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1334" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1334]</anchor-end> For each <var>protocol</var> in <var>送信する要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket subprotocols</f>:<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1335" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1335]</anchor-end> <var>protocol</var> does not contain <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x09</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x0A</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x0D</n>, or <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x20</n>.</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="261" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[261]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor>が空の場合、<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="262" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[262]</anchor-end> <var>送信する要求</var>'s <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Length:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>がないか、値が <code>0</code> である。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="267" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[267]</anchor-end> <var>送信する要求</var>'s <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor>が空でない場合、<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="263" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[263]</anchor-end> <var>送信する要求</var>'s <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Length:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>があって、値が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">本体</anchor>のバイト数である。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="251" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[251]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type</f> is <code>client</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="74" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[74]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="58" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[58]</anchor-end> <var>状態</var>が「初期」か「要求待ち」.</li></ul></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="61" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[61]</anchor-end> <var>要求</var>を、<var>送信する要求</var>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="135" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[135]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f> to <var>送信する要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求メソッド</f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="64" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[64]</anchor-end> <var>応答</var>を、新しい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="60" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[60]</anchor-end> <var>一時バッファー</var>を、空バイト列に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="59" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[59]</anchor-end> <var>状態</var>を、「応答前」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="77" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[77]</anchor-end> <var>要求</var>に <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>があって
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">close</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続オプション</anchor>が指定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="78" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[78]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="98" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[98]</anchor-end> If <var>要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f> is <code>websocket</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="258" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[258]</anchor-end> Set <var>connection</var>'s <var>WebSocket接続の状態</var> to <code>CONNECTING</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1331" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1331]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket key</f> be a nonce consisting of a randomly selected 16-byte value that has been <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">forgiving-base64 encode</anchor>d.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="265" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[265]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Append<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">append (header list)</title></anchor> 
`<code>Sec-WebSocket-Key</code>`/<var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket key</f>
to <var>要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="266" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[266]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Append<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">append (header list)</title></anchor> `<code>Sec-WebSocket-Version</code>`/`<code>13</code>` 
to <var>要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1332" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1332]</anchor-end> For each <var>protocol</var> in <var>要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket subprotocols</f>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">combine<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">combine (header list)</title></anchor> `<code>Sec-WebSocket-Protocol</code>`/<var>protocol</var>
in <var>要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="264" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[264]</anchor-end> <ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Let <var xmlns="http://www.w3.org/1999/xhtml">permessageDeflate</var> be a user-agent defined &quot;<code xmlns="http://www.w3.org/1999/xhtml">permessage-deflate</code>&quot;
extension header value.</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1333" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1333]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Append<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">append (header list)</title></anchor> 
`<code>Sec-WebSocket-Extensions</code>`/<var>permessageDeflate</var> to 
<var>要求</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="57" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[57]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> to &quot;websocket&quot;.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="241" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[241]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream WebSocket subprotocols</f> to <var>要求</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket subprotocols</f>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="491" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[491]</anchor-end> Otherwise, if <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f> is <code>CONNECT</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="498" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[498]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> to &quot;before tunnel data&quot;.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="35" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[35]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="57" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[57]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> to &quot;raw&quot;.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="45" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[45]</anchor-end> <var>要求の処理完了</var>を、新しい <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Promise</anchor> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="48" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[48]</anchor-end> <var>要求の処理完了</var>を返します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="46" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[46]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">並列に</anchor>、<var>要求</var>のバイト列の送信を行います。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> ここで<var>要求</var>のバイト列の送信は、次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="47" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[47]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/1.1</anchor> に従い<var>要求</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー部</anchor> (空行の <code>CRLF</code> まで)
を表す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>の各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を順に、<ol><li><var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の送信を指示します。</li><li>エラーが返されたら、ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <var>要求</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メッセージ本体</anchor>が存在する場合、各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>を順に、<ol><li><var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の送信を指示します。</li><li>エラーが返されたら、ここで停止します。</li><li><var>要求の転送済</var>を、1だけ大きな値に設定します。</li><li><var>要求</var>について要求の本体の一部の送信を通知して構いません。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="75" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[75]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sent steps</anchor> for <var>connection</var>.</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="259" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[259]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> メッセージ送信は、次のようにします。
この処理は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>である<var>データ</var>と、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキスト</anchor>または<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイナリー</anchor>のいずれかの<var>種別</var>を引数として受け取ります。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="278" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[278]</anchor-end> 前提として、次の条件を満たす必要があります。<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="289" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[289]</anchor-end> <var>データ</var>の長さは 2<sup>63</sup> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>かつ実装の扱える範囲内である</li></ul></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="271" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[271]</anchor-end> <var>WebSocket接続の状態</var>が <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OPEN</anchor></code> でなければ、
エラーを返して停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="268" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[268]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を作成します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd><var>種別</var>がテキストなら 1、バイナリーなら 2</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor></dt><dd><var>データ</var>のバイト数</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor></dt><dd>無作為に決定した4バイトのバイト列</dd><dt>データ</dt><dd><var>データ</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="269" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[269]</anchor-end> 作成した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のデータの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>について、
先頭から <var>i</var> バイト目 (先頭が0バイト) であれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor>の <var>i</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mod</anchor> 4 バイト目 (先頭が0バイト)
と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor> した結果に差し替えます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="270" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[270]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のバイト列を送信することとします。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="260" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[260]</anchor-end> ping 送信は、次のようにします。
この処理は、バイト列である<var>データ</var>と、<var>応答</var>フラグを受け取ります。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="287" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[287]</anchor-end> 前提として、次の条件を満たす必要があります。<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="288" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[288]</anchor-end> <var>データ</var>の長さは 2<sup>63</sup> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>かつ実装の扱える範囲内である</li></ul></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="272" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[272]</anchor-end> <var>WebSocket接続の状態</var>が <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OPEN</anchor></code> でなければ、
エラーを返して停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="273" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[273]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を作成します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd><var>応答</var>フラグが設定されていれば 10、されていなければ 9</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor></dt><dd>データのバイト数</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor></dt><dd>無作為に決定した4バイトのバイト列</dd><dt>データ</dt><dd>指定されたバイト列</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="274" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[274]</anchor-end> 作成した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のデータの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>について、
先頭から <var>i</var> バイト目 (先頭が0バイト) であれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor>の <var>i</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mod</anchor> 4 バイト目 (先頭が0バイト)
と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor> した結果に差し替えます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="275" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[275]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のバイト列を送信することとします。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="107" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[107]</anchor-end> If a request whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">method</f> is <code>CONNECT</code> has been sent and
a response whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status</f> is <code>200</code> 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 <var>bytes</var> over <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tunnel</anchor> connection <var>connection</var>,
run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="335" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[335]</anchor-end> Assert:<ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">In CONNECT mode</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="109" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[109]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で
<var>bytes</var> の送信を指示します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="110" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[110]</anchor-end> エラーが返されたら、ここで停止します。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1443" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1443]</anchor-end> To close a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tunnel</anchor> connection <var>connection</var>, run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1444" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1444]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sent steps</anchor> for <var>connection</var> with <var>close</var> flag set to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="50" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[50]</anchor-end> WebSocket connection の正常終了は、次のようにします。引数として<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>または null
である<var>状態符号</var>と、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>である<var>理由</var>を受け取ります。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="286" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[286]</anchor-end> Assert:<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="321" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[321]</anchor-end> <var>WebSocket接続の状態</var>が <code>OPEN</code> or <code>CLOSING</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="285" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[285]</anchor-end> <var>状態符号</var>は2<sup>16</sup> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以下</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="283" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[283]</anchor-end> <var>理由</var>の長さは 2<sup>63</sup> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">未満</anchor>かつ実装の扱える範囲内である</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="276" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[276]</anchor-end> <var>状態符号</var>が null なら、<var>理由</var>は空である</li></ul></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="49" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[49]</anchor-end> If <var>WebSocket接続の状態</var> is <code>CLOSING</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="277" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[277]</anchor-end> Abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="281" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[281]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を作成します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd>8</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor></dt><dd>データのバイト数</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor></dt><dd>無作為に決定した4バイトのバイト列</dd><dt>データ</dt><dd><var>状態符号</var>が null なら空、
そうでなければ、<var>状態符号</var>を表す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16ビット符号無し整数</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>) と、
それに続けて<var>理由</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="282" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[282]</anchor-end> 作成した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のデータの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>について、
先頭から <var>i</var> バイト目 (先頭が0バイト) であれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor>の <var>i</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mod</anchor> 4 バイト目 (先頭が0バイト)
と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor> した結果に差し替えます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="297" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[297]</anchor-end> <var>WebSocket接続の状態</var>を、 <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CLOSING</anchor></code> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="174" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[174]</anchor-end> <var>要求</var>について、 <code>wsclosing</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="284" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[284]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で、作成した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のバイト列を送信することとします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="315" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[315]</anchor-end> <var>切断タイマー</var>により20s後に次の要求に進むことにします。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="73" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[73]</anchor-end> To close connection <var>connection</var>, run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="108" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[108]</anchor-end> Assert: <ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Not sending a body, CONNECT, or WS mode</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="72" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[72]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="66" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[66]</anchor-end> <var>状態</var>が「初期」か「要求待ち」なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="55" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[55]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で正常終了の送信を指示します。</li></ol></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="52" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[52]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続</anchor>の中断は、次のようにします。</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="39" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[39]</anchor-end> Set the <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f> to a new
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Abort the writable stream</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="44" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[44]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sent steps</anchor> for <var>connection</var> with <var>close</var> flag set to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Cancel the readable stream</ed></li></ol></figure></section><section><h1>アプリケーションへの通知</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態機械</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>について次の通知を行います。
それぞれ、次に示す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">引数</anchor> (あれば) 付きで通知されます。<figure class="list"><ul><li>要求の本体の一部の送信の通知<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転送済</anchor></dt><dd><var>要求の転送済</var>。</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="526" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[526]</anchor-end> 要求の送信完了の通知<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="527" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[527]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>全体の送信が完了したことの通知です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> や <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CONNECT</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>では、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求ヘッダー</anchor>後の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空行</anchor>まで送信した時点で発火されます。</li></ul></li><li>応答のヘッダー受信完了の通知<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor></dt><dd><var>応答</var>。</dd><dt><var>WebSocket connection established</var></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="377" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[377]</anchor-end> <code>datastart</code> の通知<figure class="list members"><dl><dt><var>data type</var></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Binary</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor>.</dd></dl></figure><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="535" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[535]</anchor-end> When a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response body</anchor> is started, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tunnel</anchor> has opened,
or a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket message</anchor> is started.</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="528" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[528]</anchor-end> <code>data</code> の通知<figure class="list members"><dl><dt><var>data</var></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor> or a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor>.</dd></dl></figure><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="529" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[529]</anchor-end> When a chunk of data is received as part of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response body</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tunnel</anchor>, or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket message</anchor>.</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="378" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[378]</anchor-end> <code>dataend</code> の通知<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="536" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[536]</anchor-end> When a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response body</anchor> is ended, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">tunnel</anchor> has closed,
or a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket message</anchor> is ended.</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="250" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[250]</anchor-end> ping の通知<figure class="list members"><dl><dt>返答</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>か<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。既定値は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。</dd><dt>データ</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>。既定値は空。</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="329" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[329]</anchor-end> <code>wsclosing</code> の通知<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="317" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[317]</anchor-end> When a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Close frame</anchor> is sent or received for the first time.</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="358" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[358]</anchor-end> 完了の通知<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor></dt><dd><var>応答</var>。</dd><dt><var>exit status</var></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>.</dd></dl></figure></li></ul></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> 各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要求</anchor>について、2種類の送信の通知と3種類の受信の通知をそれぞれこの順序で行うか、
その途中で失敗の通知で中断するかのいずれかです。
送信の通知と受信の通知はどちらもそれぞれ進行し、相互の順序は不定です。
送信の完了は通知されないことがあります (失敗の場合)。
<code>data</code> の通知は、0回以上の任意の回数行います。
<code>data</code> の通知のかわりに 0回以上の ping の通知がある場合があります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">トンネル</anchor>では最初に <code>datastart</code> の通知、最後に <code>dataend</code> の通知があります。
完了の通知の前に、 <code>wsclosing</code> の通知があるかもしれません。</p><figure class="flow"><dl><dt>initial</dt><dd>要求の送信</dd><dt>v</dt><dd></dd><dt>&gt;&gt;</dt><dd>3</dd><dt>-&gt;</dt><dd>reqbody</dd><dt>-&gt;</dt><dd>reqeof</dd><dt>-&gt;</dt><dd>headers</dd><dt>-&gt;</dt><dd>rerror</dd><dt>-&gt;</dt><dd>reset</dd></dl><dl><dt>reqbody</dt><dd>本体一部送信</dd><dt>-&gt;</dt><dd>reqbody</dd><dt>-&gt;</dt><dd>reqeof</dd><dt>v</dt><dd></dd><dt>&gt;&gt;</dt><dd>2</dd><dt>-&gt;</dt><dd>rerror</dd><dt>-&gt;</dt><dd>reset</dd></dl><dl><dt>reqeof</dt><dd>送信完了</dd><dt>v</dt><dd></dd><dt>&gt;&gt;</dt><dd>1</dd><dt>-&gt;</dt><dd>reset</dd></dl><dl><dt>headers</dt><dd>ヘッダー受信</dd><dt>v</dt><dd></dd><dt>&gt;&gt;</dt><dd>3</dd><dt>-&gt;</dt><dd>body</dd><dt>-&gt;</dt><dd>complete</dd><dt>-&gt;</dt><dd>reset</dd></dl><dl><dt>body</dt><dd>受信</dd><dt>v</dt><dd></dd><dt>&gt;&gt;</dt><dd>4</dd><dt>-&gt;</dt><dd>complete</dd><dt>-&gt;</dt><dd>body</dd><dt>-&gt;</dt><dd>reset</dd></dl><dl><dt>complete</dt><dd>完了 (成功)</dd><dt>v</dt><dd></dd><dt>&gt;&gt;</dt><dd>3</dd></dl><dl><dt>reset</dt><dd>完了 (失敗)</dd><dt>&gt;&gt;</dt><dd>5</dd></dl></figure><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="253" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[253]</anchor-end> 図の「受信」は、 <code xmlns="http://www.w3.org/1999/xhtml">data</code> 、ping の受信、 <code xmlns="http://www.w3.org/1999/xhtml">wsclosing</code>,
<code xmlns="http://www.w3.org/1999/xhtml">datastart</code>, <code xmlns="http://www.w3.org/1999/xhtml">dataend</code> を表します。</comment-p></section><section><h1>The state machine</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="68" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[68]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クライアント</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態機械</anchor>を持ちます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="53" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[53]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>受信の通知があると、次のようにします。
ただし、<var>状態</var>が「初期」なら、<var>状態</var>が変化するまで待ってから実行します。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緊急データ</anchor>フラグが設定されていなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="37" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[37]</anchor-end> <var>状態</var>により決まる処理を行います。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[40]</anchor-end> 正常終了の受信の通知があると、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="54" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[54]</anchor-end> <var>状態</var>により決まる正常終了処理を行います。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> 中断の通知があると、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="359" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[359]</anchor-end> リセットフラグが設定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="328" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[328]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リセット</f> and <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> are <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="41" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[41]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="525" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[525]</anchor-end> <var>状態</var>により決まる中断処理を行います。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[252]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>は、次のようなデータ構造です。<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor></figcaption><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd>0 か 1。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd>0 か 1。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd>0 か 1。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd>0 か 1。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd>0-15 の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd>0 か 1。</dd><dt>長さ</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非負整数</anchor>。</dd><dt>マスクキー</dt><dd>4バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>または null。</dd><dt>データ</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>または<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>。</dd></dl></figure></p><section><h1>「初期」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="69" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[69]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="366" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[366]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is 中断.</li></ol></figure></p></section><section><h1>「要求待ち」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> バイトを受信したら、何もせずに無視します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[33]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="326" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[326]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is 中断.</li></ol></figure></p></section><section><h1>「要求送信中」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="56" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[56]</anchor-end> バイトを受信したら、何もせずに無視します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="67" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[67]</anchor-end> 正常終了 or 中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="360" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[360]</anchor-end> If 失敗:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="76" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[76]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="361" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[361]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="368" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[368]</anchor-end> 次の要求に進みます。</li></ol></li></ol></figure></p></section><section><h1>「応答前」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="130" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[130]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response received<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response received</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> 受信したバイトを、<var>一時バッファー</var>の末尾に連結します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> <var>一時バッファー</var>の末尾4バイトが <code class="HTTP">HTTP</code>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) なら、<ol><li><var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor>を 1.0 に設定します。</li><li><var>状態</var>を、「応答ヘッダー」に設定します。</li><li><var>一時バッファー</var>を、空に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[28]</anchor-end> それ以外で、<var>一時バッファー</var>の長さが8バイトなら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="236" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[236]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f> is <code>PUT</code> or
<code>CONNECT</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="320" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[320]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="237" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[237]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="367" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[367]</anchor-end> <var>要求</var>について <code>datastart</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="922" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[922]</anchor-end> <var>要求</var>について <code>data</code> を通知します。<var>一時バッファー</var>を引渡します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="452" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[452]</anchor-end> <var>残り長さ</var>を、 null に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="485" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[485]</anchor-end> <var>状態</var>を、「応答本体」に設定します。</li></ol></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="132" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[132]</anchor-end> <var>一時バッファー</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="133" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[133]</anchor-end> Let <var>exit status</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="434" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[434]</anchor-end> If not 中断 and <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response received<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response received</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="915" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[915]</anchor-end> Set <var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">can retry<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit's can retry</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="136" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[136]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error</anchor> <var>connection</var> with <var>exit status</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="240" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[240]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f> is <code>PUT</code> or
<code>CONNECT</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="363" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[363]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="924" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[924]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="280" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[280]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">headers received steps</anchor> for <var>connection</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="920" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[920]</anchor-end> <var>要求</var>について <code>datastart</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="530" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[530]</anchor-end> <var>要求</var>について <code>data</code> を通知します。<var>一時バッファー</var>を引渡します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="918" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[918]</anchor-end> 中断なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="919" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[919]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="921" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[921]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="141" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[141]</anchor-end> If 中断:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="142" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[142]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="322" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[322]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="926" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[926]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="438" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[438]</anchor-end> 次の要求に進みます。</li></ol></li></ol></li></ol></figure></p></section><section><h1>「応答ヘッダー」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="36" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[36]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><var>一時バッファー</var>の末尾に受信したバイトを追加します。</li><li><var>一時バッファー</var>の末尾が 0x0A 0x0A または 0x0A 0x0D 0x0A なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[137]</anchor-end> ヘッダーの処理 (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;138</anchor-internal>) を行います。</li></ol></li><li>それ以外で、 <var>一時バッファー</var>の長さが 2<sup>18</sup>‐1 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="364" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[364]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="139" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[139]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with 
a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[138]</anchor-end> ヘッダーの処理は、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="140" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[140]</anchor-end> <var>一時バッファー</var>をヘッダー群として構文解析します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="113" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[113]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor>が <code>1.1</code> で、
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Transfer-Encoding:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>があって、
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">chunked</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転送符号化</anchor>として指定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="114" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[114]</anchor-end> <var>残り長さ</var>を、「chunked」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="115" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[115]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="32" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[32]</anchor-end> <var>残り長さ</var>を、<var>応答</var>の <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Length:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>の処理の結果とします。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="448" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[448]</anchor-end> <var>残り長さ</var>がエラーなら:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="449" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[449]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="540" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[540]</anchor-end> Otherwise, if <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f> is <code>CONNECT</code> and
<var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>が <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">200</anchor></code> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="290" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[290]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">headers received steps</anchor> for <var>connection</var>,
with <var>tunnel</var> flag set to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="374" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[374]</anchor-end> <var>要求</var>について <code>datastart</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="375" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[375]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="376" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[376]</anchor-end> <var>状態</var>を、「トンネル」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="362" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[362]</anchor-end> Set <var>残り長さ</var> to <code>null</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="143" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[143]</anchor-end> それ以外で、<var>WebSocket接続の状態</var>が <code>CONNECTING</code> で、
<var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>が <code class="HTTP">101</code> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="144" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[144]</anchor-end> If one of following conditions are true:<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="299" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[299]</anchor-end> <var>応答</var>に <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Upgrade:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>が無いか、 
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">websocket</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) が含まれていない</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="300" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[300]</anchor-end> <var>応答</var>に <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>が無いか、 
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Upgrade</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) が含まれていない</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="301" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[301]</anchor-end> <var>応答</var>に <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Sec-WebSocket-Accept:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>が無いか、 
値が<var>要求</var>の <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Sec-WebSocket-Key:</anchor></code> の値に 
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">258EAFA5-E914-47DA-95CA-C5AB0DC85B11</anchor></code> を連結した値の 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SHA-1</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">forgiving-base64 encode</anchor>d でない</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="302" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[302]</anchor-end> <var>応答</var>の <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Sec-WebSocket-Extensions:</anchor></code> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>が存在する</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="303" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[303]</anchor-end> 
<var>応答</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's header list</title></f> has a
`<code class="HTTP" xml:lang="en">Sec-WebSocket-Protocol</code>` header and
<var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream WebSocket subprotocols</f> does not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">contain<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">list contain</title></anchor>
<var>応答</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's header list</title></f> has a
`<code class="HTTP" xml:lang="en">Sec-WebSocket-Protocol</code>` header's value</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1329" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1329]</anchor-end> 
<var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream WebSocket subprotocols</f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">list empty</title></anchor> and
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">parsing<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">parse a header</title></anchor> `<code class="HTTP" xml:lang="en">Sec-WebSocket-Protocol</code>`
in <var>応答</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's header list</title></f> results in <code>null</code>, 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>, or the empty byte sequence</li></ul></figure>... then run these substeps:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="294" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[294]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">headers received steps</anchor> for <var>connection</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="248" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[248]</anchor-end> Let <var>exit status</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit status</title></anchor></figcaption><dl><dt>失敗</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>。</dd><dt>cleanly</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor>。</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor></dt><dd><code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1006</anchor></code>。</dd><dt>理由</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>。</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="245" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[245]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with <var>exit status</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="146" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[146]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="291" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[291]</anchor-end> <var>WebSocket接続の状態</var>を、 <code>OPEN</code> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="296" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[296]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">headers received steps</anchor> for <var>connection</var>,
with <var>WebSocket</var> flag set to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="292" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[292]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="293" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[293]</anchor-end> <var>状態</var>を、「WebSocketフレーム前」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="147" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[147]</anchor-end> <var>一時バッファー</var>を、空に設定します。</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="106" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[106]</anchor-end> それ以外で、 <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>が <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1xx</anchor></code> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="337" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[337]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f> is <code>CONNECT</code> or
<var>WebSocket接続の状態</var>が <code>CONNECTING</code> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="224" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[224]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="341" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[341]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="342" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[342]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーリスト</anchor>を初期値に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="382" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[382]</anchor-end> <var>状態</var>を、「応答前」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="383" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[383]</anchor-end> <var>一時バッファー</var>を、空バイト列に設定します。</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="344" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[344]</anchor-end> それ以外なら、<ol><li><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="316" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[316]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">headers received steps</anchor> for <var>connection</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="385" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[385]</anchor-end> <var>要求</var>について <code>datastart</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="346" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[346]</anchor-end> <figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="348" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[348]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>が <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">204</anchor></code>, <code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">205</anchor></code>,
<code class="HTTP"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">304</anchor></code> のいずれかの場合か、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="349" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[349]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream request method</f> is <code>HEAD</code></li></ul></figure>... のいずれかの場合、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="347" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[347]</anchor-end> <var>残り長さ</var>を、0に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="87" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[87]</anchor-end> <var>残り長さ</var>が 0 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="79" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[79]</anchor-end> <var>応答</var>に <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>があって
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">close</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続オプション</anchor>が指定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="80" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[80]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="81" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[81]</anchor-end> それ以外で、<var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor>が <code>1.0</code> で、
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">keep-alive</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続オプション</anchor>が指定された
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>がなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="82" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[82]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="343" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[343]</anchor-end> 次の要求に進みます。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[116]</anchor-end> それ以外で、 <var>残り長さ</var>が「chunked」なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="117" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[117]</anchor-end> <var>状態</var>を、「塊前」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="88" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[88]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <var>状態</var>を、「応答本体」に設定します。</li></ol></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="295" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[295]</anchor-end> The <dfn>headers received steps</dfn> for <var>connection</var>, with
optional <var>WebSocket</var> and <var>tunnel</var> flags (both defaulted to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>)
are these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="319" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[319]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> is &quot;before tunnel data&quot;:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="256" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[256]</anchor-end> If <var>tunnel</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="345" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[345]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> to &quot;raw&quot;.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="373" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[373]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="490" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[490]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sent steps</anchor> for <var>connection</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="145" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[145]</anchor-end> <var>要求</var>について<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>のヘッダー受信完了を通知,
with <var>WebSocket connection established</var> set to <var>WebSocket</var>.</li></ol></figure></section><section><h1>「応答本体」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="451" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[451]</anchor-end> <var>要求</var>について <code>data</code> を通知します。受信したバイトを引渡します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="453" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[453]</anchor-end> <var>残り長さ</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正</anchor>なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="454" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[454]</anchor-end> <var>残り長さ</var>を1減らします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="386" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[386]</anchor-end> <var>残り長さ</var>が0なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="387" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[387]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="83" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[83]</anchor-end> <var>応答</var>に <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>があって
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">close</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続オプション</anchor>が指定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="84" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[84]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="85" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[85]</anchor-end> それ以外で、<var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor>が <code>1.0</code> で、
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">keep-alive</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続オプション</anchor>が指定された
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>がなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="86" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[86]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="244" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[244]</anchor-end> 次の要求に進みます。</li></ol></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="388" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[388]</anchor-end> <var>残り長さ</var>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正</anchor>なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="389" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[389]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="395" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[395]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="455" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[455]</anchor-end> Let <var>exit status</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="391" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[391]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor>が <code>1.1</code> or 中断:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="392" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[392]</anchor-end> Set <var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="134" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[134]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with <var>exit status</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="390" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[390]</anchor-end> Otherwise, <var>残り長さ is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>:</var><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="441" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[441]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="442" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[442]</anchor-end> If 中断:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="444" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[444]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="445" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[445]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="470" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[470]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="477" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[477]</anchor-end> 次の要求に進みます。</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="400" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[400]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="396" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[396]</anchor-end> If 中断:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="916" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[916]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="401" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[401]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="397" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[397]</anchor-end> If 中断:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="398" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[398]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="399" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[399]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="403" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[403]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="404" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[404]</anchor-end> 次の要求に進みます。</li></ol></li></ol></li></ol></figure></p></section><section><h1>「塊前」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="118" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[118]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="394" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[394]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII十六進数字</anchor>なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="456" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[456]</anchor-end> <var>一時バッファー</var>を、指定されたバイトに設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="457" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[457]</anchor-end> <var>状態</var>を、「塊サイズ」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="458" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[458]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="917" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[917]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="405" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[405]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="246" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[246]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="119" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[119]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="459" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[459]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="407" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[407]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="254" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[254]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></figure></p></section><section><h1>「塊サイズ」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="120" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[120]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="462" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[462]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII十六進数字</anchor>なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="463" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[463]</anchor-end> <var>一時バッファー</var>に、指定されたバイトを追加します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="464" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[464]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="465" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[465]</anchor-end> <var>一時バッファー</var>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">十六進数</anchor>として解釈します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="466" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[466]</anchor-end> <var>残り長さ</var>を、得られた値に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="467" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[467]</anchor-end> <var>残り長さ</var>がエラー (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">桁溢れ</anchor>) なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="468" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[468]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="410" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[410]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="393" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[393]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="428" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[428]</anchor-end> それ以外で、<var>残り長さ</var>が 0 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="431" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[431]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="429" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[429]</anchor-end> <var>状態</var>を、「trailer 前」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="430" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[430]</anchor-end> <var>一時バッファー</var>を、空に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="471" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[471]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="472" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[472]</anchor-end> バイトが 0x0A なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="473" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[473]</anchor-end> <var>状態</var>を、「塊」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="474" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[474]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="475" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[475]</anchor-end> <var>状態</var>を、「塊拡張」に設定します。</li></ol></li></ol></li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="122" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[122]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="476" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[476]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="413" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[413]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="409" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[409]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></figure></p></section><section><h1>「塊拡張」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="121" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[121]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="479" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[479]</anchor-end> 0x0A なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="480" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[480]</anchor-end> <var>状態</var>を、「塊」に設定します。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="123" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[123]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="481" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[481]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="416" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[416]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="412" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[412]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></figure></p></section><section><h1>「塊」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="124" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[124]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="249" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[249]</anchor-end> <var>要求</var>について <code>data</code> を通知します。受信したバイトを引渡します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="486" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[486]</anchor-end> <var>残り長さ</var>を1減らします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="487" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[487]</anchor-end> <var>残り長さ</var>が0なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="488" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[488]</anchor-end> <var>状態</var>を、「塊後」に設定します。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="125" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[125]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="489" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[489]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="419" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[419]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="415" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[415]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></figure></p></section><section><h1>「塊後」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="126" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[126]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="492" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[492]</anchor-end> 0x0D なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="493" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[493]</anchor-end> Set <var>状態</var> to &quot;after chunk CR&quot;.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="494" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[494]</anchor-end> 0x0A なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="495" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[495]</anchor-end> <var>状態</var>を、「塊前」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="496" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[496]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="497" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[497]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="422" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[422]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="418" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[418]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="127" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[127]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="500" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[500]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="425" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[425]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="423" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[423]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></figure></p></section><section><h1>&quot;after chunk CR&quot; state</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1418" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1418]</anchor-end> When <var>byte</var> is received:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1419" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1419]</anchor-end> If <var>byte</var> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x0A</n>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1420" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1420]</anchor-end> Set <var>状態</var> to &quot;塊前&quot;.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1421" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1421]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1422" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1422]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1425" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1425]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="427" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[427]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1428" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1428]</anchor-end> 正常終了か中断を受信したら、</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1429" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1429]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1432" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1432]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="447" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[447]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></figure></section><section><h1>「trailer 前」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="128" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[128]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><var>一時バッファー</var>の末尾に受信したバイトを追加します。</li><li><var>一時バッファー</var>の末尾が 0x0A 0x0A または 0x0A 0x0D 0x0A なら、<ol><li><var>応答</var>に <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection:</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>があって
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">close</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII大文字・小文字不区別</anchor>) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">接続オプション</anchor>が指定されていれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="193" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[193]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="503" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[503]</anchor-end> <var>終了</var>を、新しい終了に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="504" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[504]</anchor-end> 次の要求に進みます。</li></ol></li><li>それ以外で、 <var>一時バッファー</var>の長さが 2<sup>18</sup>‐1 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="450" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[450]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="129" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[129]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="461" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[461]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
(whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>).</li></ol></figure></p></section><section><h1>「WebSocket フレーム前」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="148" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[148]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><var>一時バッファー</var>の末尾に、受信したバイトを追加します。</li><li><var>一時バッファー</var>の長さが2未満なら、ここで停止します。</li><li><var>フレーム</var>を、次のような新しい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>に設定します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd><var>一時バッファー</var>の第1バイトの最上位ビット</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd><var>一時バッファー</var>の第1バイトの上位から第2ビット目</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd><var>一時バッファー</var>の第1バイトの上位から第3ビット目</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd><var>一時バッファー</var>の第1バイトの上位から第4ビット目</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd><var>一時バッファー</var>の第1バイトの下位4ビットを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>としたもの</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd><var>一時バッファー</var>の第2バイトの最上位ビット</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor></dt><dd><var>一時バッファー</var>の第2バイトの下位7ビットを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>としたもの</dd></dl></figure></li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>が126か127で、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor> が 8 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>なら、<ol><li>失敗とします。ここで停止します。</li></ol></li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>が126なら、<ol><li><var>一時バッファー</var>の長さが4以上でなければ、ここで停止します。</li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>を、<var>一時バッファー</var>の第3、第4バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16ビット符号無し整数</anchor>とした値に設定します。</li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>が126未満なら、<ol><li>失敗とします。ここで停止します。</li></ol></li></ol></li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>が127なら、<ol><li><var>一時バッファー</var>の長さが10以上でなければ、ここで停止します。</li><li><var>一時バッファー</var>の第3バイトの最上位ビットが 1 なら、<ol><li>失敗とします。ここで停止します。</li></ol></li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>を、<var>一時バッファー</var>の第3-8バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">64ビット符号無し整数</anchor>とした値に設定します。</li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>が2<sup>16</sup>未満なら、<ol><li>失敗とします。ここで停止します。</li></ol></li></ol></li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>が実装の扱える範囲を超えていれば、<ol><li>失敗とします。ここで停止します。</li></ol></li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor>が設定されていれば、<ol><li><var>一時バッファー</var>に次の4バイトがなければ、ここで停止します。</li><li><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor>を、<var>一時バッファー</var>のその4バイトに設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="150" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[150]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's endpoint type</title></f> is <code>server</code>
and <var>フレーム</var>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor> が 0 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="153" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[153]</anchor-end> 理由 <code>WebSocket Protocol Error</code> で失敗とします。ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="151" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[151]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's endpoint type</title></f> is <code>client</code>
and <var>フレーム</var>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor> が 1 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="152" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[152]</anchor-end> 理由 <code>Masked frame from server</code> で失敗とします。ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="154" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[154]</anchor-end> <var>フレーム</var>の FIN が 0 で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor> が 8, 9, 10 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="155" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[155]</anchor-end> 失敗とします。ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="156" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[156]</anchor-end> <var>フレーム</var>の RSV1, RSV2, RSV3 のいずれかでも 1 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="157" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[157]</anchor-end> 理由 <code>Invalid reserved bit</code> で失敗とします。ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="158" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[158]</anchor-end> <var>フレーム</var>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor> が 3-7, 11-15 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="159" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[159]</anchor-end> 理由 <code>Unknown opcode</code> で失敗とします。ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="170" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[170]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> is <code>null</code> and 
<var>フレーム</var>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor> が 0 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="171" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[171]</anchor-end> 理由 <code>Unexpected continuation</code> で失敗とします。ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="172" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[172]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> is not <code>null</code> and
<var>フレーム</var>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor> が 1 か 2 なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="173" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[173]</anchor-end> 理由 <code>Previous data frame unfinished</code> で失敗とします。ここで停止します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="175" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[175]</anchor-end> If <var>フレーム</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> and <var>フレーム</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="176" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[176]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="181" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[181]</anchor-end> If <var>フレーム</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n> and <var>フレーム</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2</n>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="183" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[183]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Binary</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="195" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[195]</anchor-end> <var>一時バッファー</var>を、空に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[160]</anchor-end> <var>フレーム</var>の長さが0なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="190" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[190]</anchor-end> Let <var>result</var> be result of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">processing a WebSocket frame<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">process a WebSocket frame</title></anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1361" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1361]</anchor-end> If <var>result</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>, abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="192" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[192]</anchor-end> <var>フレーム</var>を、 null に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="191" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[191]</anchor-end> <var>状態</var>を、「WebSocket フレーム前」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="161" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[161]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="196" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[196]</anchor-end> <var>状態</var>を、「WebSocket データ」に設定します。</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="149" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[149]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="226" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[226]</anchor-end> <var>WebSocket接続の状態</var>を、<code>CLOSING</code> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="227" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[227]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f> to an
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit status</title></anchor></figcaption><dl><dt>失敗</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor></dd><dt>cleanly</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor></dd><dt>状態符号</dt><dd><code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1006</anchor></code></dd><dt>理由</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="330" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[330]</anchor-end> 次の要求に進みます。</li></ol></figure></p></section><section><h1>「WebSocket データ」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="163" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[163]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="164" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[164]</anchor-end> <var>一時バッファー</var>の末尾に、受信したバイトを追加します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="165" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[165]</anchor-end> <var>フレーム</var>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor> が1なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="166" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[166]</anchor-end> <var>フレーム</var>のマスクキーの先頭から第
((<var>一時バッファー</var>の長さ - 1) mod 4) バイト (先頭が第0バイトとして数えた時。)
を使って<var>一時バッファー</var>の末尾のバイトを <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor> したものに置き換えます。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="167" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[167]</anchor-end> <var>一時バッファー</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>が<var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor>と等しくなければ、
ここで停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="188" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[188]</anchor-end> Let <var>result</var> be result of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">processing a WebSocket frame<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">process a WebSocket frame</title></anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1362" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1362]</anchor-end> If <var>result</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>, abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="184" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[184]</anchor-end> <var>フレーム</var>を、 null に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="185" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[185]</anchor-end> <var>状態</var>を、「WebSocket フレーム前」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="186" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[186]</anchor-end> <var>一時バッファー</var>を、空に設定します。</li></ol></figure></p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">permessage-deflate</ed><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="162" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[162]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="212" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[212]</anchor-end> <var>WebSocket接続の状態</var>を、<code>CLOSING</code> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="215" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[215]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f> to an
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit status</title></anchor></figcaption><dl><dt>失敗</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor></dd><dt>cleanly</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor></dd><dt>状態符号</dt><dd><code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1006</anchor></code></dd><dt>理由</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="331" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[331]</anchor-end> 次の要求に進みます。</li></ol></figure></p></section><section><h1>「WebSocket 切断待ち」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="217" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[217]</anchor-end> 「WebSocket フレーム前」状態、「WebSocket データ」状態で失敗するという時、
次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="229" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[229]</anchor-end> <var>WebSocket接続の状態</var>を、<code>CLOSING</code> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="230" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[230]</anchor-end> Let <var>exit status</var> be a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>:<figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="440" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[440]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit status</title></anchor></figcaption><dl><dt>失敗</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor></dd><dt>cleanly</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor></dd><dt>状態符号</dt><dd><code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1002</anchor></code></dd><dt>理由</dt><dd>指定された理由。指定がなければ <code>WebSocket Protocol Error</code>。</dd></dl><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">API exposed status and reason</ed></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="231" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[231]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を作成します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd>8</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor></dt><dd>データのバイト数</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor></dt><dd>無作為に決定した4バイトのバイト列</dd><dt>データ</dt><dd>
<var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</f>を表す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16ビット符号無し整数</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>),
followed by <var>exit status</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由</f> encoded in UTF-8</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="305" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[305]</anchor-end> 作成した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のデータの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>について、
先頭から <var>i</var> バイト目 (先頭が0バイト) であれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor>の <var>i</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mod</anchor> 4 バイト目 (先頭が0バイト)
と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor> した結果に差し替えます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="306" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[306]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で、作成した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を送信することにします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="232" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[232]</anchor-end> <var>状態</var>を、「WebSocket切断待ち」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="233" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[233]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var> with <var>exit status</var>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="214" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[214]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="234" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[234]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is
<code>null</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="235" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[235]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f> to a new
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor> is <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1006</anchor></code>, and
理由 is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="220" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[220]</anchor-end> 正常終了か中断を受信したら、</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="239" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[239]</anchor-end> If 中断 and <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f>'s
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</anchor> is <code>null</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="89" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[89]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f> to a new
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor> is <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1006</anchor></code>, and
理由 is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="332" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[332]</anchor-end> 次の要求に進みます。</li></ol></figure></section><section><h1>「トンネル」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="111" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[111]</anchor-end> バイトを受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="484" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[484]</anchor-end> <var>要求</var>について <code>data</code> を通知します。受信したバイトを引渡します。</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="112" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[112]</anchor-end> 正常終了か中断を受信したら、<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="371" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[371]</anchor-end> <var>要求</var>について <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="478" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[478]</anchor-end> If 中断:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="482" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[482]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Connection error<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection error</title></anchor> <var>connection</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="483" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[483]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="324" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[324]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="327" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[327]</anchor-end> 次の要求に進みます。</li></ol></li></ol></figure></p></section><section><h1>「停止済み」状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="318" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[318]</anchor-end> To <dfn>connection error</dfn> <var>connection</var> with an optional <var>exit status</var>,
run these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="436" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[436]</anchor-end> If <var>exit status</var> is not specified:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="439" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[439]</anchor-end> Set <var>exit status</var> to a new <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="131" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[131]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f> to <var>exit status</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="435" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[435]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sent steps</anchor> for <var>connection</var> with the <var>close</var> flag set to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="338" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[338]</anchor-end> 次の要求に進みます。</li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="372" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[372]</anchor-end> The <dfn>sent steps</dfn> for <var>connection</var> with optional <var>close</var>
flag (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> if omitted) are these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="238" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[238]</anchor-end> If <var>close</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="51" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[51]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">If <var xmlns="http://www.w3.org/1999/xhtml">connection</var>'s transport writable stream is not yet closed,
close the writer.</ed></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="340" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[340]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> to &quot;sent&quot;.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="279" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[279]</anchor-end> <ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><var xmlns="http://www.w3.org/1999/xhtml">要求</var>について要求の送信完了を通知します。</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="499" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[499]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream sent</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="433" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[433]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream received</f> flag is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="432" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[432]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">end of stream steps</anchor> for <var>connection</var>.</li></ol></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="43" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[43]</anchor-end> 次の要求に進むとは、次のようにします。<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="243" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[243]</anchor-end> <var>状態</var>が「停止済み」なら、ここで停止します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="336" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[336]</anchor-end> <var>切断タイマー</var>を停止させます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="379" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[379]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> is not <code>null</code> and is not &quot;sent&quot;:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="380" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[380]</anchor-end> <var>状態</var>を、「要求送信中」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="501" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[501]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream received</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="381" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[381]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream sent</f> flag is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="325" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[325]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">end of stream steps</anchor> for <var>connection</var>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="370" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[370]</anchor-end> The <dfn>end of stream steps</dfn> for <var>connection</var> are these steps:</p><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="512" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[512]</anchor-end> <var>要求</var>が null ではなく:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="513" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[513]</anchor-end> <var>要求</var>について完了を通知します。<var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f>
(which might be <code>null</code>)
を引渡します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="333" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[333]</anchor-end> <var>要求</var>を、 null に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="334" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[334]</anchor-end> <var>応答</var>を、 null に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="514" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[514]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">write mode</f> to <code>null</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="515" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[515]</anchor-end> <var>要求の処理完了</var>が null でなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="516" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[516]</anchor-end> <var>要求の処理完了</var>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解決</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="517" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[517]</anchor-end> <var>要求の処理完了</var>を null に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="502" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[502]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream received</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="505" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[505]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">stream sent</f> flag to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="506" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[506]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</f> to <code>null</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="518" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[518]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">to be closed</f> flag is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="339" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[339]</anchor-end><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">If <var xmlns="http://www.w3.org/1999/xhtml">connection</var>'s underlying writable stream is not yet closed:<ol xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="351" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[351]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> の正常終了の送信を指示します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="350" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[350]</anchor-end> これ以後 <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> の受信終了を指示して構いません。</li></ol></ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="352" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[352]</anchor-end> <var>状態</var>を、「停止済み」に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="519" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[519]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="353" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[353]</anchor-end> <var>状態</var>を、「要求待ち」に設定します。</li></ol></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="70" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[70]</anchor-end> バイトを受信したら、何もしません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="71" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[71]</anchor-end> 正常終了や中断を受信したら、何もしません。</p></section></section><section><h1>ヘッダー群として構文解析</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 入力を、 0x0D や 0x0A で区切られた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">行</anchor>に分割します。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">行</anchor>には区切りの 0x0D, 0x0A は含めません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> 最初の行を (あれば) 次のようにします。</p><figure class="steps"><ol><li>先頭が <code>/</code> なら、<ol><li>その次が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII数字</anchor>列なら、これを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">十進整数</anchor>として解釈します。
ただし<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">先導0</anchor>があるときは、 0 とみなします。</li><li>その次が <code>.</code> なら、<ol><li>その次が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII数字</anchor>列なら、これを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">十進整数</anchor>として解釈します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> 最初の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>が2<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>か、
最初の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>が1と等しく次の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>が1<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>なら、<ol><li><var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコルの版</anchor>を、 1.1 に設定します。</li></ol></li></ol></li><li>次が1個以上の <code class="charname" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SP</anchor></code> であれば、すべて無視します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> 次に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII数字</anchor>列があれば、<var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>をその<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">十進整数</anchor>値に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> 次の1個以上の <code class="charname" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SP</anchor></code> があれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</anchor>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">行</anchor>のそれより後の部分に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</anchor>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>に設定します。</li></ol></li></ol></li><li>先頭が1個<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>の <code class="charname" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SP</anchor></code> 列なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> 次に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII数字</anchor>列があれば、<var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>をその<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">十進整数</anchor>値に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> 次の1個以上の <code class="charname" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SP</anchor></code> があれば、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</anchor>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">行</anchor>のそれより後の部分に設定します。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> <var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由句</anchor>を、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>に設定します。</li></ol></li></ol></li></ol></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> 更に、次のようにします。<figure class="steps"><ol><li><var>最後のヘッダー</var>を、 null に設定します。</li><li>残りの各行について順番に、<ol><li>先頭の文字が 0x20 か 0x09 なら、<ol><li><var>最後のヘッダー</var>が null 以外なら、<ol><li>行の先頭から 0x20 と 0x09 をすべて除去します。</li><li><var>最後のヘッダー</var>の値の末尾に、 0x20 と行の内容を追加します。</li></ol></li></ol></li><li>先頭の文字が 0x3A でなく、 0x3A が含まれるなら、<ol><li><var>最後のヘッダー</var>を、 0x3A より前の部分を名前、 0x3A より後の部分を値とするヘッダーに設定します。</li><li><var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーリスト</anchor>の末尾に、<var>最後のヘッダー</var>を追加します。</li></ol></li><li>それ以外なら、<ol><li><var>最後のヘッダー</var>を、 null に設定します。</li></ol></li></ol></li><li><var>応答</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダーリスト</anchor>の各ヘッダーについて、<ol><li>名前の末尾から 0x20 と 0x09 をすべて除去します。</li><li>値の先頭から 0x20 と 0x09 をすべて除去します。</li><li>値の末尾から 0x20 と 0x09 をすべて除去します。</li></ol></li></ol></figure></p></section><section><h1>WebSocket frames</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="189" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[189]</anchor-end> To <dfn>process a WebSocket frame</dfn>, switch by <var>connection</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">frame<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's frame</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</f>:</p><figure class="switch"><dl><dt><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>, or <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2</n></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="194" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[194]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">frame<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's frame</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="197" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[197]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="179" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[179]</anchor-end> <var>要求</var>について、 <code>datastart</code> を通知 with <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="168" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[168]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">decoder<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's decoder</title></f> to a 
<code class="DOMi" xml:lang="en">TextDecoder</code> with:<figure class="list members middle"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1363" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1363]</anchor-end> <code class="DOMi" xml:lang="en">TextDecoder</code></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's encoding</title></f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">error mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's error mode</title></f></dt><dd><code>fatal</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ignore BOM flag<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's ignore BOM flag</title></f></dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor></dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="198" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[198]</anchor-end> Otherwise, if <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">frame<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's frame</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2</n>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1364" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1364]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Binary</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="178" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[178]</anchor-end> <var>要求</var>について、 <code>datastart</code> を通知 with <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Binary</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="182" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[182]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Text</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="180" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[180]</anchor-end> Let <var>output</var> be the result of invoking
<var>decoder</var>'s <code class="DOMm" xml:lang="en">decode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's decode</title></code> method with:<figure class="list members"><dl><dt><var>input</var></dt><dd><var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一時バッファー</f></dd><dt><var>options</var></dt><dd><figure class="list members"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="534" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[534]</anchor-end> <code class="DOMi" xml:lang="en">TextDecodeOptions</code></figcaption><dl><dt><code class="DOMa" xml:lang="en">stream</code></dt><dd>
If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">frame<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's frame</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.
Otherwise, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure></dd></dl></figure>If an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exception</anchor> is thrown,
理由 <code>Invalid UTF-8 in text frame</code> で失敗とし,
return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>, and abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="531" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[531]</anchor-end> <var>要求</var>について、 <code>data</code> を通知 with <var>output</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="169" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[169]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[177]</anchor-end> <var>要求</var>について、 <code>data</code> を通知 with <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一時バッファー</f>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="533" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[533]</anchor-end> If <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">frame<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's frame</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</f> is <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="532" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[532]</anchor-end> <var>要求</var>について、 <code>dataend</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="187" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[187]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocket data type</f> to <code>null</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1369" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1369]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></figure></dd><dt><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8</n></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="199" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[199]</anchor-end> <var>一時バッファー</var>の長さが1なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="201" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[201]</anchor-end> 理由<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>で失敗とします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1365" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1365]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="202" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[202]</anchor-end> <var>一時バッファー</var>が空でないなら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="203" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[203]</anchor-end> <var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を、
<var>一時バッファー</var>の先頭2バイトを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号無し16ビット整数</anchor>として解釈した値とします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="206" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[206]</anchor-end> <var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>が <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1005</anchor></code> か <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1006</anchor></code> なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="207" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[207]</anchor-end> 理由<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>で失敗とします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1366" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1366]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> and abort these steps.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="208" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[208]</anchor-end> <var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">理由</anchor>を、<var>一時バッファー</var>から先頭2バイトを除いたものを入力として
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">utf-8復号器</anchor>をエラーモード致死的で実行した出力とします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="209" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[209]</anchor-end> 失敗の場合は、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1368" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1368]</anchor-end> 理由 <code>Invalid UTF-8 in Close frame</code> で失敗とします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1367" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1367]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor> and abort these steps.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="213" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[213]</anchor-end> <var>WebSocket接続の状態</var>が <code>CLOSING</code> でなければ、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="210" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[210]</anchor-end> <var>WebSocket接続の状態</var>を、 <code>CLOSING</code> に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="211" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[211]</anchor-end> <var>要求</var>について、 <code>wsclosing</code> を通知します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="216" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[216]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を作成します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd>8</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor></dt><dd>データのバイト数</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor></dt><dd>無作為に決定した4バイトのバイト列</dd><dt>データ</dt><dd><var>フレーム</var>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>がなければ空。そうでなければ、
<var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を表す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">16ビット符号無し整数</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワークバイト順</anchor>) と、
それに続けて理由</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="307" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[307]</anchor-end> 作成した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のデータの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>について、
先頭から <var>i</var> バイト目 (先頭が0バイト) であれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor>の <var>i</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mod</anchor> 4 バイト目 (先頭が0バイト)
と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor> した結果に差し替えます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="308" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[308]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で、作成した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を送信することにします<ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">after completion of any ongoing transmission of frames.</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="225" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[225]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sent steps</anchor> for <var>connection</var> with <var>close</var> flag set to
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="218" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[218]</anchor-end> <var>状態</var>を、「WebSocket切断待ち」に設定します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="228" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[228]</anchor-end> Set <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's exit status</title></f> to an
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Exit status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">exit status</title></anchor></figcaption><dl><dt>失敗</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">偽</anchor></dd><dt>cleanly</dt><dd><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor></dd><dt>状態符号</dt><dd><var>フレーム</var>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor> (なければ <code>1005</code>)</dd><dt>理由</dt><dd><var>フレーム</var>の理由 (なければ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>)</dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="219" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[219]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's endpoint type</title></f> is <code>server</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="311" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[311]</anchor-end> 次の要求に進みます。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="312" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[312]</anchor-end> それ以外なら、<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="313" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[313]</anchor-end> <var>切断タイマー</var>で、 1s 後に次の要求に進むことにします。</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1372" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1372]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></figure></dd><dt><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">9</n></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="222" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[222]</anchor-end> <var>要求</var>について、 ping を通知します。<var>一時バッファー</var>をデータとして引き渡します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="223" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[223]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を作成します。<figure class="list members"><dl><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FIN</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV1</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV2</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RSV3</anchor></dt><dd>0</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">opcode</anchor></dt><dd>10</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mask</anchor></dt><dd>1</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">長さ</anchor></dt><dd>データのバイト数</dd><dt><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor></dt><dd>無作為に決定した4バイトのバイト列</dd><dt>データ</dt><dd><var>一時バッファー</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="309" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[309]</anchor-end> 作成した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>のデータの各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>について、
先頭から <var>i</var> バイト目 (先頭が0バイト) であれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マスクキー</anchor>の <var>i</var> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mod</anchor> 4 バイト目 (先頭が0バイト)
と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XOR</anchor> した結果に差し替えます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="310" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[310]</anchor-end> <var>connection</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">connection's transport</title></f> で、作成した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebSocketフレーム</anchor>を送信することにします<ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">after completion of any ongoing transmission of frames.</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1371" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1371]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></figure></dd><dt><n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">10</n></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="221" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[221]</anchor-end> <var>要求</var>について、 ping を通知します。返答フラグを設定し、
<var>一時バッファー</var>をデータとして引き渡します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1370" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1370]</anchor-end> Return <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li></ol></figure></dd></dl></figure></section></section><section><h1>HTTP/2</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"></ed><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">server push</ed></section><section><h1>FTP</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP support is to be removed from the Web.</ed><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="639" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[639]</anchor-end> An <dfn>FTP connection</dfn> has following states:<figure class="list members"><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's endpoint type</title></f></dfn></dt><dd><code>client</code></dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's transport</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">read buffer<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's read buffer</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor>.
Initially, an empty <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's state</title></f></dfn></dt><dd>Initially, <em>connected state</em>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">username<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's username</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">password<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's password</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's established promise</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">promise</anchor>.
Initially, an unresolved <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">promise</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.
Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f></dfn></dt><dd>Either <em>unknown</em>,
<em>file</em>, or <em>directory</em>.  Initially, <em>unknown</em>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f></dfn></dt><dd>Either an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">integer</anchor> or
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.  Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data length</title></f></dfn></dt><dd>An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">integer</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> or <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.
Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f></dfn></dt><dd>
Either <em>initial state</em>, <em>data state</em>, or <em>exit state</em>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data connected promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data connected promise</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">promise</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">is unauthorized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's is unauthorized</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">boolean</anchor>.
Initially, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">false</anchor>.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1227" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1227]</anchor-end> An <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP connection</anchor> has similar notification hooks as <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP connection</anchor>.</p><section><h1>Control connections</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="573" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[573]</anchor-end> To <dfn>initiate an FTP connection</dfn> with
a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> <var>transport</var>,
a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor> <var>username</var>, and a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor> <var>password</var>,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="575" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[575]</anchor-end> Let <var>ftp</var> be a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP connection</anchor>.<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP connection</anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">endpoint type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's endpoint type</title></f></dt><dd><code>client</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's transport</title></f></dt><dd><var>transport</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">username<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's username</title></f></dt><dd><var>username</var></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">password<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's password</title></f></dt><dd><var>password</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1067" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1067]</anchor-end> Let <var>current code</var> be <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1066" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1066]</anchor-end> Let <var>current text</var> be an empty <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="911" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[911]</anchor-end> Configure <var>transport</var> to run these substeps whenever
it notifies of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の受信 with <var>byte</var> and <var>urgent data flag</var>:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="912" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[912]</anchor-end> If <var>urgent data flag</var> is set, abort these substeps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1062" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1062]</anchor-end> Append <var>byte</var> to <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">read buffer<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's read buffer</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1094" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1094]</anchor-end> Optionally, abort these substeps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1063" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1063]</anchor-end> If <var>byte</var> contains a <code>0x0A</code> byte:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1064" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1064]</anchor-end> Split <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">read buffer<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's read buffer</title></f>
into two substrings at the first <code>0x0A</code> byte.
Set <var>line</var> to the first substring and <var>ftp</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">read buffer<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's read buffer</title></f> to the second substring,
not including the <code>0x0A</code> separator.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1065" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1065]</anchor-end> Remove the <code>0x0D</code> byte at the end of <var>line</var>, if any.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1075" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1075]</anchor-end> If <var>line</var> has three <code>0x30</code>-<code>0x39</code> bytes followed by
a <code>0x20</code> or <code>0x2D</code> byte at the beginning:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1076" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1076]</anchor-end> Let <var>code</var> be the first three bytes of <var>line</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1069" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1069]</anchor-end> Let <var>continue</var> be whether the fourth byte of <var>line</var> is <code>0x2D</code> or not.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1077" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1077]</anchor-end> Remove first four bytes from <var>line</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1078" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1078]</anchor-end> If <var>current code</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1079" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1079]</anchor-end> Set <var>current code</var> to <var>code</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1081" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1081]</anchor-end> Set <var>current text</var> to <var>line</var> followed by <code>0x0D</code> <code>0x0A</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1082" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1082]</anchor-end> Otherwise, <var>current code</var> is <var>code</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1083" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1083]</anchor-end> Append <var>line</var> followed by <code>0x0D</code> <code>0x0A</code> to <var>current text</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1084" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1084]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1085" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1085]</anchor-end> Set <var>current code</var> to an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">error</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1086" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1086]</anchor-end> If <var>current code</var> is not an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">error</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1087" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1087]</anchor-end> Let <var>reply</var> be an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP reply</anchor>:<figure class="list members"><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">code<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's code</title></f></dt><dd>A string obtained by replacing bytes
in <var>current code</var> by <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">code point</anchor>s with same values.</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's text</title></f></dt><dd><var>current text</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1091" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1091]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP client state machine</anchor> with <var>ftp</var> and <var>reply</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1070" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1070]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1072" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1072]</anchor-end> Set <var>current code</var> be <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1071" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1071]</anchor-end> Set <var>current text</var> be an empty <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor>.</li></ol></li></ol></li></ol></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="913" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[913]</anchor-end> Configure <var>transport</var> to run these substeps whenever
it notifies of 正常終了の受信 or 中断 with <var>reset flag</var>:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1060" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1060]</anchor-end> Set <var>is abort</var> be whether the notification is about 中断 or not.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1090" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1090]</anchor-end> Let <var>exit</var> be<ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"></ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1272" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1272]</anchor-end> Run the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP client state machine</anchor> with <var>ftp</var> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1088" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1088]</anchor-end> Return <var>ftp</var>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1104" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1104]</anchor-end> To <dfn>send FTP command</dfn> <var>command</var> with argument <var>text</var> over <var>ftp</var>,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1105" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1105]</anchor-end> If <var>text</var> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1106" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1106]</anchor-end> Send <var>text</var> followed by <code>0x0D</code> <code>0x0A</code> over <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1107" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1107]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1108" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1108]</anchor-end> Send <var>text</var> followed by <var>text</var> followed by <code>0x0D</code> <code>0x0A</code>
over <var>ftp</var>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1244" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1244]</anchor-end> To <dfn>switch to passive mode</dfn> with <var>ftp</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1137]</anchor-end> <ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">If <var xmlns="http://www.w3.org/1999/xhtml">ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's transport</title></f>
is IPv6:<ol xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1140" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1140]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>PASV</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1138]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>EPSV</code>` with <code>null</code>
over <var>ftp</var>.</li></ol></ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1139" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1139]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1132" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1132]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>EPSV</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1136" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1136]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>PASV</code>` with <code>null</code>
over <var>ftp</var>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1068" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1068]</anchor-end> An <dfn>FTP reply</dfn> has following states:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP reply</anchor></figcaption><dl><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">code<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's code</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor>.</dd><dt><dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's text</title></f></dfn></dt><dd>A <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">byte string</anchor>.</dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1110" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1110]</anchor-end> The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP reply</anchor>'s <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f></dfn> is its <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">code<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's code</title></f>'s
first character.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1061" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1061]</anchor-end> To <dfn>set FTP state</dfn> of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP connection</anchor> <var>ftp</var> to <var>state</var>,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1096" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1096]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">read buffer<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's read buffer</title></f> is not empty:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1097" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1097]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1098" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1098]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1095" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1095]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's state</title></f> to <var>state</var>.</li></ol></li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1092" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1092]</anchor-end> The <dfn>FTP client state machine</dfn> of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP connection</anchor> <var>ftp</var>
run these steps with <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP reply</anchor> <var>reply</var>,
switched by <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's state</title></f>:<figure class="switch"><dl><dt><em>Connected state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1099" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1099]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1209" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1209]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">code<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's code</title></f> is <code>421</code> or <code>521</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1253" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1253]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1254" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1254]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1100" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1100]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>USER</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1103" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1103]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>USER</code>` and
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">UTF-8 encode</title></anchor> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">username<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's username</title></f>
over <var>ftp</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1101" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1101]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1102" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1102]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>USER</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1109" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1109]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1111" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1111]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1157" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1157]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em>authenticated state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1126" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1126]</anchor-end> Resolve <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's established promise</title></f>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1112" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1112]</anchor-end> Otherwise, <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>3</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1118" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1118]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em>before <code>PASS</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1119" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1119]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>PASS</code>` with
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">UTF-8 encode</title></anchor> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">password<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's password</title></f>
over <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1113" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1113]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1116]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Request FTP authentication<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request FTP authentication</title></anchor> for <var>ftp</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1114" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1114]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1115" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1115]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Request FTP authentication<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request FTP authentication</title></anchor> for <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>PASS</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1120" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1120]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1121" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1121]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1127" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1127]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em>authenticated state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1158" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1158]</anchor-end> Resolve <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's established promise</title></f>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1122" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1122]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1123" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1123]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Request FTP authentication<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request FTP authentication</title></anchor> for <var>ftp</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1124" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1124]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1125" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1125]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Request FTP authentication<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request FTP authentication</title></anchor> for <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>TYPE</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1130" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1130]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1073" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1073]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Switch to passive mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">switch to passive mode</title></anchor> with <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1134" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1134]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1135" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1135]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>PASV</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1141" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1141]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code> :<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1131" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1131]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text</f> matches to the pattern
<code>0x28 <var>digits</var> 0x2C <var>digits</var> 0x2C <var>digits</var> 0x2C <var>digits</var> 0x2C <var>digits</var> 0x2C <var>digits</var> 0x29</code>,
where <var>digits</var> represents one or more bytes in range [0x30, 0x39]:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1133" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1133]</anchor-end> Let <var>p1</var> and <var>p2</var> be the first such match's last two
<var>digits</var> substrings, respectively, interpreted as decimal integers encoded in <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1143" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1143]</anchor-end> Let <var>port</var> be <var>p1</var> × 256 + <var>p2</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1144" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1144]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Establish an FTP data connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish an FTP data connection</title></anchor> for <var>ftp</var> and
and <var>port</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1154" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1154]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1155" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1155]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1142" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1142]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1145" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1145]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>EPSV</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1146" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1146]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code> :<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1147" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1147]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text</f> matches to the pattern
<code>0x28 0x7C 0x7C 0x7C <var>digits</var> 0x7C 0x29</code>,
where <var>digits</var> represents one or more bytes in range [0x30, 0x39]:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1148" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1148]</anchor-end> Let <var>port</var> be the first such match's <var>digits</var> substring,
interpreted as a decimal integer encoded in <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1149" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1149]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Establish an FTP data connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">establish an FTP data connection</title></anchor> for
<var>ftp</var> and <var>port</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1152" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1152]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1153" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1153]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1150" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1150]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1151" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1151]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em>Authenticated state</em></dt><dd>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</dd><dt><em><code>TYPE</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1172" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1172]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1175" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1175]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f> is <em>directory</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1214" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1214]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>CWD</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1215" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1215]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>CWD</code>` with <var>ftp</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f> over <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1176" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1176]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1177]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>SIZE</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1178" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1178]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>SIZE</code>` with <var>ftp</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f> over <var>ftp</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1173" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1173]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1174" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1174]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>SIZE</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1170" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1170]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code> and
<var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's text</title></f> is one or more bytes in range [0x30, 0x39]:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1171" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1171]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> to 
<var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">text<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's text</title></f>, interpreted as a decimal integer
encoded in <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1179" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1179]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>RETR</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1206" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1206]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data connection</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> or
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> is not <em>initial state</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1207" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1207]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1208" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1208]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1228" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1228]</anchor-end> Schedule to run the <var>data connected steps</var> with <var>ftp</var> when <var>ftp</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data connected promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data connected promise</title></f> is resolved.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1180" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1180]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>RETR</code>` with <var>ftp</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f> over <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>RETR</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1181" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1181]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is not <code>1</code> or <code>2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1246" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1246]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">code<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP reply's code</title></f> is <code>421</code>, <code>425</code>,
or <code>426</code>,
or if <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f> is <em>file</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1183" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1183]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1210" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1210]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1245" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1245]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1251" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1251]</anchor-end> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f>'s 中断の指示.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1252]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1248" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1248]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f> to <em>directory</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1247" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1247]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Switch to passive mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">switch to passive mode</title></anchor> with <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1249" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1249]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1213" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1213]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>CWD</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1212" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1212]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>CWD</code>` with <var>ftp</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f> over <var>ftp</var>.</li></ol></li></ol></li></ol></li></ol></figure></dd><dt><em><code>CWD</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1216" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1216]</anchor-end> If <var>reply</var> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is <code>2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1257" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1257]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1258" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1258]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>LIST</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1219" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1219]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data connection</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> or
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> is not <em>initial state</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1259" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1259]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1260" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1260]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1261" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1261]</anchor-end> Schedule to run the <var>data connected steps</var> with <var>ftp</var> when <var>ftp</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data connected promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data connected promise</title></f> is resolved.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1262" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1262]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>LIST</code>` with <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1217" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1217]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1218" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1218]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></figure></dd><dt><em><code>RETR</code> reply state</em></dt><dd><figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1225" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1225]</anchor-end> If <var>reply</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">first code</f> is not <code>1</code> or <code>2</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1226" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1226]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li></ol></figure></dd></dl></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1074" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1074]</anchor-end> To <dfn>send an FTP request</dfn> <var>request</var> over <var>ftp</var>,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1288" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1288]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">is unauthorized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's is unauthorized</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>:<ol><li>Return a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response</anchor> and abort these steps:<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">status code</title></f></dt><dd><code>401</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status text<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">reason phrase</title></f></dt><dd><code>Unauthorized</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list</f></dt><dd><figure class="list members"><dl><dt><code>WWW-Authenticate</code></dt><dd><code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Basic</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">realm</anchor>=&quot;&quot;</code></dd></dl></figure></dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1159" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1159]</anchor-end> Assertion: <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's state</title></f> has to be
<em>authenticated state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1165" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1165]</anchor-end> Let <var>type</var> be `<code>I</code>`.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1160]</anchor-end> Let <var>path</var> be concatenation of <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's url</title></f>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path</f>'s items, separated with <code>/</code>, in order.  This can be the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1161" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1161]</anchor-end> If <var>path</var> contains a <code>;</code> character:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1162" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1162]</anchor-end> Let <var>param</var> be the first <code>;</code> character and the following characters
in <var>path</var>.  Remove them from <var>path</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1163" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1163]</anchor-end> Switch by <var>param</var>:<figure class="switch"><dl><dt><code>;type=a</code></dt><dd>
Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f> to <em>file</em>.
Set <var>type</var> to `<code>A</code>`.</dd><dt><code>;type=i</code></dt><dd>
Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f> to <em>file</em>.</dd><dt><code>;type=d</code></dt><dd>
Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f> to <em>directory</em>.</dd></dl></figure></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1166" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1166]</anchor-end> Set <var>path</var> be the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encode</anchor> to <var>path</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1167" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1167]</anchor-end> Set <var>path</var> be the result of applying <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">percent decode</anchor> to <var>path</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1168" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1168]</anchor-end> If the last byte of <var>path</var>, if any, is 0x2F:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1169" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1169]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">object type<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's object type</title></f> to <em>directory</em>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1164" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1164]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f> to <var>path</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1128" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1128]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set FTP state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">set FTP state</title></anchor> of <var>ftp</var> to <em><code>TYPE</code> reply state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1129" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1129]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Send FTP command<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">send FTP command</title></anchor> `<code>TYPE</code>` with <var>type</var> over 
<var>ftp</var>.</li></ol></figure></p></section><section><h1>Data connections</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="910" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[910]</anchor-end> To <dfn>establish an FTP data connection</dfn> for <var>ftp</var> and <var>port</var>,
run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1243" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1243]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data connected promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data connected promise</title></f>
to an unresolved <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">promise</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1188" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1188]</anchor-end> If <var>port</var> is less than <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1024</n>, is greater than <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">65535</n>,
or is one of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">bad ports</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1189" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1189]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1184" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1184]</anchor-end> Let <var>host</var> be <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's transport</title></f>'s<ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">remote host.</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1185" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1185]</anchor-end> Let <var>proxy</var> be <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's transport</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy configuration<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's proxy configuration</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1187" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1187]</anchor-end> Let <var>url</var> be a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code>ftp<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ftp:</title></code>,
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's host</title></f> is <var>host</var>, and <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's port</title></f> is <var>port</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1186" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1186]</anchor-end> Let <var>transport</var> be the result of 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">creating a transport for proxy<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">create a transport for a proxy configuration</title></anchor>
<var>proxy</var> with <var>url</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1156" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1156]</anchor-end> If <var>transport</var> is a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">failure</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1190" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1190]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1191" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1191]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f> to
<var>transport</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1201" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1201]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> to <em>initial state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1195" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1195]</anchor-end> Configure <var>transport</var> to run these substeps whenever
it notifies of <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>の受信 with <var>byte</var> and <var>urgent data flag</var>:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1196" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1196]</anchor-end> If <var>urgent data flag</var> is set, abort these steps.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1200" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1200]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> is <em>initial state</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1255" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1255]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1256" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1256]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1222" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1222]</anchor-end> Increment <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data length</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1233" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1233]</anchor-end> <var>ftp</var>'s <code>data</code> の通知 with <var>byte</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1220" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1220]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> is
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data length</title></f>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1223" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1223]</anchor-end> Set <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> to <em>exit state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1224" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1224]</anchor-end> <var>ftp</var>'s <code>dataend</code> の通知.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1269" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1269]</anchor-end> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f>'s
正常終了の送信の指示.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1270" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1270]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></li></ol></li></ol></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1197" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1197]</anchor-end> Configure <var>transport</var> to run these substeps whenever
it notifies of 正常終了の受信 or 中断 with <var>is reset</var>:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1198" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1198]</anchor-end> Set <var>is abort</var> be whether the notification is about 中断 or not.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1199" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1199]</anchor-end> Let <var>exit</var> be an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor> whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <var>is abort</var>
and <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リセット</f> is <var>is reset</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1239" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1239]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport</f> is <var>transport</var> or
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> is <em>exit state</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1202" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1202]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> is
<em>initial state</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1203" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1203]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var> with <var>exit</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1204" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1204]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1271" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1271]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> is 
<em>data state</em>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1234" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1234]</anchor-end> <var>ftp</var>'s <code>dataend</code> の通知.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1276" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1276]</anchor-end> If
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> is greater than
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data length</title></f>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1277" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1277]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's response</title></f>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">incomplete message<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's incomplete message</title></f> flag.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1236" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1236]</anchor-end> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's transport</title></f>'s 正常終了の送信の指示.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1235" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1235]</anchor-end> <var>ftp</var>'s 完了の通知 with <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's response</title></f>
and <var>exit</var>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1237" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1237]</anchor-end> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f>'s
正常終了の送信の指示.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1240" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1240]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1241" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1241]</anchor-end> <var>transport</var>'s 正常終了の送信の指示.</li></ol></li></ol></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1242" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1242]</anchor-end> Resolve <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data connected promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data connected promise</title></f>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1211" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1211]</anchor-end> The <dfn>data connected steps</dfn> with <var>ftp</var> are these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1229" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1229]</anchor-end> <var>ftp</var>'s 要求の送信完了の通知.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1232" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1232]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's response</title></f> to a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response</anchor>.<figure class="list members"><figcaption><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response</title></anchor></figcaption><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">status code</title></f></dt><dd><code>200</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status text<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">reason phrase</title></f></dt><dd><code>OK</code></dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response body</title></f></dt><dd><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">stream</ed></dd></dl></figure></li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
If ?raw, plain text.  Otherwise, FTP directory list.</ed></li><li><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
base is: <var xmlns="http://www.w3.org/1999/xhtml">ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f>
If path does not end with a 0x2F, append a 0x2F byte to path.</ed></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1230" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1230]</anchor-end> <var>ftp</var>'s 応答のヘッダー受信完了の通知 with <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's response</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1221" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1221]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data length</title></f> to <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1231" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1231]</anchor-end> <var>ftp</var>'s <code>datastart</code> の通知.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1263" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1263]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor> and
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">file length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's file length</title></f> is
<var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data length</title></f>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1264" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1264]</anchor-end> Set <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> to <em>exit state</em>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1265" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1265]</anchor-end> <var>ftp</var>'s <code>dataend</code> の通知.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1267" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1267]</anchor-end> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f>'s
正常終了の送信の指示.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1268" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1268]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1266" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1266]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1205" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1205]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data state<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data state</title></f> to <em>data state</em>.</li></ol></li></ol></figure></p></section><section><h1>Termination</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1117" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1117]</anchor-end> To <dfn>request FTP authentication</dfn> of <var>ftp</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="574" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[574]</anchor-end> Set <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">is unauthorized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's is unauthorized</title></f> to <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1238" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1238]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Abort FTP connection<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">abort FTP connection</title></anchor> <var>ftp</var>.</li></ol></figure></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1093" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1093]</anchor-end> To <dfn>abort FTP connection</dfn> <var>ftp</var> with optional <var>exit</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1297" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1297]</anchor-end> If <var>exit</var> is not specified, set <var>exit</var> to an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">exit status</anchor>
whose <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">失敗</f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">true</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1194" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1194]</anchor-end> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's transport</title></f>'s 中断の指示.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1192" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1192]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1193" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1193]</anchor-end> <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">data transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's data transport</title></f>'s 中断の指示.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1274" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1274]</anchor-end> If <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's path</title></f> is not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">null</anchor>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1273" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1273]</anchor-end> <var>ftp</var>'s 完了の通知 with <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's response</title></f>
and <var>exit</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1275" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1275]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1089" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1089]</anchor-end> Reject <var>ftp</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">established promise<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">FTP connection's established promise</title></f>
with <var>exit</var>.</li></ol></li></ol></figure></p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1250" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1250]</anchor-end> Timeout</ed></section></section><section><h1>Server-side API</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">XXX</ed><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1378" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1378]</anchor-end> To <dfn>prepare metavariables</dfn> for an <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request</anchor> <var>request</var>,
a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport</anchor> <var>transport</var>, and
a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">string</anchor> or <code>null</code> <var>scheme key name</var>, run these steps:<figure class="steps"><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1391" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1391]</anchor-end> Let <var>url</var> be <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">target url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's target url</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1409" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1409]</anchor-end> Set <var>request version</var> to the appropriate value
by <var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">version<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's version</title></f>:<figure class="switch"><dl><dt><code>0.9</code></dt><dd><code>HTTP/0.9</code></dd><dt><code>1.0</code></dt><dd><code>HTTP/1.0</code></dd><dt><code>1.1</code></dt><dd><code>HTTP/1.1</code></dd><dt><code>2.0</code></dt><dd><code>HTTP/2.0</code></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1379" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1379]</anchor-end> Let <var>vars</var> be a <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">map</anchor> with following name/value pairs:<figure class="list members"><dl><dt><code class="CGI" xml:lang="en">CONTENT_LENGTH</code></dt><dd><var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's body length</title></f>, 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">serialize an integer</title></anchor>.</dd><dt><code>PATH_INFO</code></dt><dd><var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">path<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL path</title></f>, 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">UTF-8 encode</title></anchor> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">percent-decoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">percent-decode</title></anchor></dd><dt><code>REQUEST_METHOD</code></dt><dd><var>request</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">method<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's method</title></f></dd><dt><code>SCRIPT_NAME</code></dt><dd>The <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty string</anchor></dd><dt><code>SERVER_PROTOCOL</code></dt><dd><var>request version</var></dd></dl></figure></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1411" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1411]</anchor-end> If <var>scheme key name</var> is not <code>null</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1412" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1412]</anchor-end> Set <var>vars</var>' <var>scheme key name</var> to <code>http</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1382" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1382]</anchor-end> If <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is <code>tls</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1383" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1383]</anchor-end> Set <var>transport</var> to <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">transport<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's transport</title></f>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1388" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1388]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <code class="URI" xml:lang="en">https<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">https:</title></code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1386" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1386]</anchor-end> Set <var>vars</var>' <code>HTTPS</code> to <code>ON</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1413" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1413]</anchor-end> If <var>scheme key name</var> is not <code>null</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1414" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1414]</anchor-end> Set <var>vars</var>' <var>scheme key name</var> to <code>https</code>.</li></ol></li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1384" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1384]</anchor-end> If <var>transport</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">protocol<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's protocol</title></f> is <code>tcp</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1385" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1385]</anchor-end> Set <var>vars</var>' <code>REMOTE_ADDR</code> to <var>transport</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">remote host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's remote host</title></f>, 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">host serializer</title></anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1407" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1407]</anchor-end> Set <var>vars</var>' <code>SERVER_NAME</code> to <var>transport</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local host<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local host</title></f>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">host serializer</title></anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1408" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1408]</anchor-end> Set <var>vars</var>' <code>SERVER_PORT</code> to <var>transport</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">local port<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">transport's local port</title></f>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">serialize an integer</title></anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1404" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1404]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1405" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1405]</anchor-end> Set <var>vars</var>'s <code>REMOTE_ADDR</code> to <code>127.0.0.1</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1406" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1406]</anchor-end> Set <var>vars</var>'s <code>SERVER_NAME</code> to <code>127.0.0.1</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1395" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1395]</anchor-end> Set <var>vars</var>'s <code>SERVER_PORT</code> to <code>0</code>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1392" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1392]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL query</title></f> is not <code>null</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1393" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1393]</anchor-end> Set <var>vars</var>' <code>QUERY_STRING</code> to <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL query</title></f>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">UTF-8 encode</title></anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1396" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1396]</anchor-end> For each <var>header name</var> in <var>vars</var>' <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f>,
without any duplicate:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1397" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1397]</anchor-end> If <var>header name</var> is a string of one or more <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII alphanumeric</anchor> and/or
<code>-</code> characters and not <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII case-insensitively<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ASCII case-insensitive</title></anchor>
equal to <code>Content-Length</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1398" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1398]</anchor-end> Let <var>key</var> be <var>header name</var>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">converted to ASCII uppercase</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1399" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1399]</anchor-end> Replace any <code>-</code> in <var>header name</var> by <code>_</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1400" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1400]</anchor-end> If <var>header name</var> is not <code>CONTENT_TYPE</code>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1394" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1394]</anchor-end> Prepend <code>HTTP_</code> to <var>header name</var>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1401" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1401]</anchor-end> Let <var>value</var> be the header values in <var>vars</var>'s 
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f> whose name is 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII case-insensitively<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ASCII case-insensitive</title></anchor> equal to <var>header name</var>, in order,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">combined</anchor>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1402" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1402]</anchor-end> Set <var>vars</var>' <var>key</var> to <var>value</var>.</li></ol></li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1410" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1410]</anchor-end> Let <var>host</var> be <var>vars</var>' <code>HTTP_HOST</code>'s value, if any, or <code>null</code>.</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1387" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1387]</anchor-end> If <var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f> is <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP(S) scheme</anchor> and
<var>url</var>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hostport</f>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">UTF-8 encode</title></anchor>, is <var>host</var>:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1403" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1403]</anchor-end> Set <var>vars</var>' <code>REQUEST_URI</code> to <var>url</var>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialized<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL serializer</title></anchor> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">UTF-8 encode</title></anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1389" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1389]</anchor-end> Otherwise:<ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1390" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1390]</anchor-end> Set <var>vars</var>' <code>REQUEST_URI</code> to <var>request</var>'s
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">target url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's target url</title></f>'s <f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">pathquery</f> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encoded<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">UTF-8 encode</title></anchor>.</li></ol></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1381" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1381]</anchor-end> Return <var>vars</var>.</li></ol></figure></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1415" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1415]</anchor-end> <var xmlns="http://www.w3.org/1999/xhtml">scheme key name</var> is typically <code xmlns="http://www.w3.org/1999/xhtml">wsgi.url_scheme</code>,
<code xmlns="http://www.w3.org/1999/xhtml">psgi.url_scheme</code>, or similar.</comment-p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII alphanumeric</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">converted to ASCII uppercase</anchor>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">combined</anchor>
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">target url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's target url</title></f>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL serializer</anchor>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">percent-decode</anchor>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialize an integer</anchor>
<f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body length<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's body length</title></f></ed></section><section><h1>References</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="242" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[242]</anchor-end> This specification depends on the <cite>Infra Standard</cite>.
The terms
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">forgiving-base64 encode</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ordered set</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">empty<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">list empty</title></anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">contains<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">list contain</title></anchor>,
and
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">pair</anchor>
are defined in the <cite>Infra Standard</cite>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1044" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1044]</anchor-end> The terms
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8 encode</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">decode</anchor></dfn>,
<dfn><code class="DOMi" xml:lang="en">TextDecoder</code></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's encoding</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">error mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's error mode</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ignore BOM flag<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's ignore BOM flag</title></f></dfn>,
<dfn><code class="DOMm" xml:lang="en">decode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">TextDecoder's decode</title></code></dfn>,
<dfn><code class="DOMi" xml:lang="en">TextDecodeOptions</code></dfn>, and
<dfn><code class="DOMa" xml:lang="en">stream</code></dfn> 
are defined in the <cite>Encoding Standard</cite>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="621" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[621]</anchor-end> The terms 
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">C0 controls and space</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">serialize an integer</anchor></dfn>, 
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 address</anchor></dfn>, 
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv4 serializer</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPv6 address</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">domain</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host parser</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">equals<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">host equivalence</title></anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host serializer</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">percent decode</anchor></dfn>,
<dfn>scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme (syntax)</title></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">network scheme</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL parser</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL serializer</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL record</anchor></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">scheme<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL scheme</title></f></dfn>, <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">host</f><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's host</title></dfn>, <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">port</f><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL's port</title></dfn>, and
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">URL query</title></f></dfn>
are defined by <cite>URL Standard</cite>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="981" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[981]</anchor-end> The terms <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Public Suffix<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">public suffix</title></anchor></dfn> and
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ICANN DOMAINS<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ICANN domains</title></anchor></dfn> is defined by <cite>Public Suffix List</cite>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1341" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1341]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Status codes<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">status code</title></anchor> <code>101</code> and <code>200</code> and
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL scheme</anchor>s <code class="URI" xml:lang="en">http<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">http:</title></code> and <code class="URI" xml:lang="en">https<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">https:</title></code>
are defined by <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1330" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1330]</anchor-end> HTTP headers
`<dfn><code>Sec-WebSocket-Accept</code></dfn>`,
`<dfn><code>Sec-WebSocket-Extensions</code></dfn>`,
`<dfn><code>Sec-WebSocket-Key</code></dfn>`,
`<dfn><code>Sec-WebSocket-Protocol</code></dfn>`,
`<dfn><code>Sec-WebSocket-Version</code></dfn>`
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL scheme</anchor>s <code class="URI" xml:lang="en">ws<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ws:</title></code> and <code class="URI" xml:lang="en">wss<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">wss:</title></code>, and
the terms
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection is Established</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Extensions In Use</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Subprotocol In Use</anchor></dfn>
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">A WebSocket Message Has Been Received</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Closing Handshake Is Started</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection Is Closed</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection Close Code</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">The WebSocket Connection Close Reason</anchor></dfn>, and
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Fail The WebSocket Connection</anchor></dfn>
are defined by <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 6455</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="354" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[354]</anchor-end> The terms
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">bad ports</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">append<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">append (header list)</title></anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">combine<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">combine (header list)</title></anchor></dfn>
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">request</anchor></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's url</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">current url<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's current url</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">method<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request method</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's header list</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request body</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">client<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request's client</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">skip-service-worker flag</f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">synchronous flag</f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">mode<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">request mode</title></f></dfn>, <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">credentials mode</f></dfn>, <dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">cache mode</f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">redirect mode</f></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">response</anchor></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">status code</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status message</f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">body<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response body</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">header list<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">response's header list</title></f></dfn>,
<dfn><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTPS state</f></dfn>,
<dfn>network error</dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">connection</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">obtain a connection</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">obtain a WebSocket connection</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">basic fetch</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP fetch</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP-network-or-cache fetch</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP-network fetch</anchor></dfn>,
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process response</anchor></dfn>, <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">process response done</anchor></dfn>, and
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">establish a WebSocket connection</anchor></dfn>
are defined in the <cite>Fetch Standard</cite>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="961" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[961]</anchor-end> The terms
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">converted to ASCII lowercase</anchor></dfn> and
<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">converted to ASCII uppercase</anchor></dfn>
are defined in the <cite>DOM Standard</cite>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="942" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[942]</anchor-end> <dfn><abbr xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SNI</anchor><title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Server Name Indication</title></abbr></dfn> is specified in <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 6066</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1007" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1007]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WPAD</anchor> is defined by the <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Internet Draft</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1008" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1008]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PAC</anchor> is defined by <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Necko/Proxy_Auto-Configuration_(PAC)_file">https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Necko/Proxy_Auto-Configuration_(PAC)_file</anchor-external>
and <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://bugzilla.mozilla.org/show_bug.cgi?id=78176">https://bugzilla.mozilla.org/show_bug.cgi?id=78176</anchor-external>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1298" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1298]</anchor-end> The term <dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Strip <var xmlns="http://www.w3.org/1999/xhtml">url</var> for use as a referrer</anchor></dfn>
is defined in the <cite>Referrer Policy</cite>.</p></section><section><h1>XXX</h1><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="65" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[65]</anchor-end> <ul xmlns="http://www.w3.org/1999/xhtml"><li>reset vs abort</li><li><code>451</code></li><li><code>acceptSslCerts</code> vs origin</li></ul></ed><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">Trailers</ed></section><section><h1>Note</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="610" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[610]</anchor-end> This document does not support <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">QUIC</anchor> at this stage, which is supported by <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Chrome</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1010" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1010]</anchor-end> This document does not support <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">VMS</anchor>-style path syntax in <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP</anchor>,
which is supported by <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Firefox</anchor> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Chrome</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1323" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1323]</anchor-end> This document does not support persistent FTP control connection,
which is supported by <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Firefox</anchor> and <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IE</anchor>.</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="914" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[914]</anchor-end> Test data:</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1438" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1438]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">proxy environment variable parser</anchor>
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/wakaba/tests-web/tree/master/url/proxyenv">https://github.com/wakaba/tests-web/tree/master/url/proxyenv</anchor-external></li></ul></refs></section></body></html>