@@ -2157,6 +2157,17 @@ Unless stated otherwise, it is false.
21572157
21582158<p class=note> This flag is for exclusive use by HTML's render-blocking mechanism. [[!HTML]]
21592159
2160+ <p> A <a for=/>request</a> has an associated boolean <dfn export for=request>is HTTPS upgrade</dfn> .
2161+ Unless stated otherwise, it is false.
2162+
2163+ <p class=note> This is for exclusive use by HTTPS Upgrading algorithm.
2164+
2165+ <p> A <a for=/>request</a> has an associated
2166+ <dfn export for=request>HTTPS upgrade fallback URL</dfn> , which is null or a <a for=/>URL</a> .
2167+ Unless otherwise stated, it is null.
2168+
2169+ <p class=note> This is for exclusive use by HTTPS Upgrading algorithm.
2170+
21602171<hr>
21612172
21622173<p> A <a for=/>request</a> has an associated
@@ -3265,6 +3276,109 @@ through TLS using ALPN. The protocol cannot be spoofed through HTTP requests in
32653276</div>
32663277
32673278
3279+ <h3 id=https-upgrades>HTTPS upgrading</h3>
3280+
3281+ <p> User agents may optionally upgrade requests with URLs that are not
3282+ <a>potentially trustworthy URLs</a> to attempt to fetch them over
3283+ <a>potentially trustworthy URLs</a> . If an upgraded request fails with a network error, it is
3284+ retried over the original URL.
3285+
3286+ <p> The HTTPS upgrading algorithm consists of <a>upgrade an HTTP request</a> and
3287+ <a>HTTPS upgrade fallback</a> algorithms.
3288+
3289+ <h4 id=https-upgrades-upgrade>HTTPS upgrade algorithm</h4>
3290+ <div algorithm>
3291+
3292+ <p> To <dfn>upgrade an HTTP request</dfn> given a <a for=/>request</a> <var> request</var> :
3293+
3294+ <ol>
3295+ <li>
3296+ <p> If one or more of the following conditions are met, return:
3297+ <ul>
3298+ <li><p><var> request</var> 's <a for="request">destination</a> is not "<code> document</code> "
3299+
3300+ <li><p><var> request</var> 's <a for="request">method</a> is not "<code> GET</code> "
3301+
3302+ <li><p><var> request</var> 's <a for="request">URL</a>' s <a for="url">scheme</a> is not
3303+ "<code> http</code> "
3304+
3305+ <li><p><var> request</var> 's <a for="request">URL</a>' s <a for="url">host</a> is exempted from
3306+ upgrades in an <a>implementation-defined</a> way.
3307+ </ul>
3308+ </li>
3309+
3310+ <li>
3311+ <p> If <var> request</var> 's <a for=request>HTTPS upgrade fallback URL</a> is non-null, clear
3312+ <a for=request>is HTTPS upgrade</a> and <a for=request>HTTPS upgrade fallback URL</a> and return.
3313+
3314+ <p class=note> This is a fallback request that shouldn't be upgraded again.
3315+
3316+ <li>
3317+ <p> Otherwise, set the following fields:
3318+ <ul>
3319+ <li><p> Set <a for=request>HTTPS upgrade fallback URL</a> to <var> request</var> 's
3320+ <a for="request">URL</a> .
3321+
3322+ <li><p> Set <var> request</var> 's <a for="request">URL</a>' s <a for="url">scheme</a> to
3323+ "<code> https</code> ".
3324+
3325+ <li><p> Set <a for=request>is HTTPS upgrade</a> to true.
3326+ </ul>
3327+ </li>
3328+ </ol>
3329+ </div>
3330+
3331+ <h4 id=https-upgrades-fallback>Fallback algorithm</h4>
3332+ <div algorithm>
3333+
3334+ <p> To run <dfn>HTTPS upgrade fallback</dfn> given a <a for=/>request</a> <var> request</var> and
3335+ <a for=/>response</a> <var> response</var> :
3336+
3337+ <ol>
3338+ <li><p> If <var> request</var> 's <a for=request>is HTTPS upgrade</a> is not set, then return
3339+ <var> response</var> .
3340+
3341+ <li>
3342+ <p> If <var> response</var> is a <a>network error</a> :
3343+
3344+ <p class=note> This means that the upgrade failed and initiates a fallback load.
3345+
3346+ <ol>
3347+ <li><p> Let <var> serializedFallbackUrl</var> be the <a lt="URL serializer">serialization</a> of
3348+ <var> request</var> 's <a for=request>HTTPS upgrade fallback URL</a> .
3349+
3350+ <li><p> Let <var> fallbackResponse</var> be a new <a for=/>response</a> whose
3351+ <a for=response>header list</a> is «
3352+ (`<code> Location</code> `, <var> serializedFallbackUrl</var> )», and its
3353+ <a for="response">status</a> set to 307.
3354+
3355+ <li><p> Return <var> fallbackResponse</var> .
3356+ </ol>
3357+
3358+ <li>
3359+ <p> Return <var> response</var> .
3360+
3361+ <p class=note> This means the upgrade was successful.
3362+
3363+ </ol>
3364+
3365+ <p class=note> User agents can implement a fast-fallback path by canceling slow fetches on upgraded
3366+ requests, in order to quickly initiate a fallback http load.
3367+
3368+ </div>
3369+
3370+ <h4 id=http-upgrades-examples>Examples</h4>
3371+
3372+ <p id=example-https-upgrade-good-https class=example><code> a.com</code> serves both
3373+ <code> http://a.com</code> and <code> https://a.com</code> . An eligible request to
3374+ <code> http://a.com</code> will be upgraded to <code> https://a.com</code> .
3375+
3376+ <p id=example-https-upgrade-bad-https class=example><code> a.com</code> serves
3377+ <code> http://a.com</code> but refuses connections on <code> https://a.com</code> . An eligible
3378+ request to <code> http://a.com</code> will be upgraded to <code> https://a.com</code> , but the fetch
3379+ will fail. A fallback request will be initiated to <code> http://a.com</code> .
3380+
3381+
32683382
32693383<h2 id=http-extensions>HTTP extensions</h2>
32703384
@@ -4445,6 +4559,14 @@ steps:
44454559
44464560 <li><p> <a>Upgrade <var>request</var> to a potentially trustworthy URL, if appropriate</a> .
44474561
4562+ <li>
4563+ <p> Optionally, run <a>upgrade an HTTP request</a> algorithm on <var> request</var> .
4564+
4565+ <p class=note> HTTPS upgrading only applies to requests with <a>HTTP(S) scheme</a> s, but it's done
4566+ in <a>main fetch</a> instead of <a>HTTP fetch</a> to ensure that
4567+ <a>upgrade a mixed content <var>request</var> to a potentially trustworthy URL, if appropriate</a>
4568+ step runs next and applies to the upgraded request.
4569+
44484570 <li><p> <a>Upgrade a mixed content <var>request</var> to a potentially trustworthy URL, if appropriate</a> .
44494571
44504572 <li><p> If <a lt="block bad port">should <var>request</var> be blocked due to a bad port</a> ,
@@ -5157,8 +5279,6 @@ these steps:
51575279 <p> If one of the following is true
51585280
51595281 <ul class=brief>
5160- <li><p><var> response</var> 's <a for=response>type</a> is "<code> error</code> "
5161-
51625282 <li><p><var> request</var> 's <a for=request>mode</a> is "<code> same-origin</code> " and
51635283 <var> response</var> 's <a for=response>type</a> is "<code> cors</code> "
51645284
@@ -5246,6 +5366,10 @@ these steps:
52465366 <a>CORS check</a> , as <var> request</var> 's <a for=request>client</a> and the service worker can
52475367 have different embedder policies.
52485368
5369+ <li><p> If <var> request</var> 's <a for=request>is HTTPS upgrade</a> is set, set <var> response</var>
5370+ and <var> internalResponse</var> to the result of running <a>HTTPS upgrade fallback</a> given
5371+ <var> request</var> and <var> response</var> .
5372+
52495373 <li>
52505374 <p> If <var> internalResponse</var> 's <a for=response>status</a> is a <a>redirect status</a> :
52515375
@@ -8716,7 +8840,7 @@ resource — for non-<a>CORS requests</a> as well as <a>CORS
87168840requests</a> — and do not use `<code> Vary</code> `.
87178841
87188842
8719- <h3 class=no-num id=websocket-protocol oldids=websocket-connections,websocket-opening-handshake,fail-the-websocket-connection,the-websocket-connection-is-established>WebSockets</h2 >
8843+ <h3 class=no-num id=websocket-protocol oldids=websocket-connections,websocket-opening-handshake,fail-the-websocket-connection,the-websocket-connection-is-established>WebSockets</h3 >
87208844
87218845<p> As part of establishing a connection, the {{WebSocket}} object initiates a special kind of
87228846<a for=/>fetch</a> (using a <a for=/>request</a> whose <a for=request>mode</a> is
@@ -8980,6 +9104,7 @@ done only by navigations). The <a>fetch controller</a> is also used to
89809104<a for=request>redirect mode</a> set to "<code> manual</code> ".
89819105
89829106
9107+
89839108<h2 id=acknowledgments class=no-num>Acknowledgments</h2>
89849109
89859110<p> Thanks to
0 commit comments