@@ -2157,6 +2157,17 @@ Unless stated otherwise, it is false.
2157
2157
2158
2158
<p class=note> This flag is for exclusive use by HTML's render-blocking mechanism. [[!HTML]]
2159
2159
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
+
2160
2171
<hr>
2161
2172
2162
2173
<p> A <a for=/>request</a> has an associated
@@ -3265,6 +3276,112 @@ through TLS using ALPN. The protocol cannot be spoofed through HTTP requests in
3265
3276
</div>
3266
3277
3267
3278
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>
3306
+ <p><var> request</var> 's <a for="request">URL</a>' s <a for="url">host</a> is exempted from
3307
+ upgrades in an <a>implementation-defined</a> way.
3308
+
3309
+ <p class=example id="example-https-upgrades-exempted-hosts"> If <a for=url>host</a> is a
3310
+ non-registrable or non-assignable domain name such as .local or an IP address that falls in a
3311
+ range reserved for non-publicly routable networks, the implementation might return without
3312
+ modifying <var> request</var> .
3313
+ </ul>
3314
+ </li>
3315
+
3316
+ <li>
3317
+ <p> If <var> request</var> 's <a for=request>HTTPS upgrade fallback URL</a> is non-null, clear
3318
+ <a for=request>is HTTPS upgrade</a> and <a for=request>HTTPS upgrade fallback URL</a> and return.
3319
+
3320
+ <p class=note> This is a fallback request that shouldn't be upgraded again.
3321
+
3322
+ <li>
3323
+ <p> Otherwise, set the following fields:
3324
+ <ul>
3325
+ <li><p> Set <a for=request>HTTPS upgrade fallback URL</a> to <var> request</var> 's
3326
+ <a for="request">URL</a> .
3327
+
3328
+ <li><p> Set <var> request</var> 's <a for="request">URL</a>' s <a for="url">scheme</a> to
3329
+ "<code> https</code> ".
3330
+
3331
+ <li><p> Set <a for=request>is HTTPS upgrade</a> to true.
3332
+ </ul>
3333
+ </li>
3334
+ </ol>
3335
+ </div>
3336
+
3337
+ <h4 id=https-upgrades-fallback>Fallback algorithm</h4>
3338
+ <div algorithm>
3339
+
3340
+ <p> To run <dfn>HTTPS upgrade fallback</dfn> given a <a for=/>request</a> <var> request</var> and
3341
+ <a for=/>response</a> <var> response</var> :
3342
+
3343
+ <ol>
3344
+ <li><p> If <var> request</var> 's <a for=request>is HTTPS upgrade</a> is not set, then return
3345
+ <var> response</var> .
3346
+
3347
+ <li>
3348
+ <p> If <var> response</var> is a <a>network error</a> :
3349
+
3350
+ <p class=note> This means that the upgrade failed and initiates a fallback load.
3351
+
3352
+ <ol>
3353
+ <li><p> Let <var> fallbackResponse</var> be a new <a for=/>response</a> whose
3354
+ <a for=response>header list</a> is « », and its <code> Location</code> header is set to
3355
+ <var> request</var> 's <a for=request>HTTPS upgrade fallback URL</a> , and its
3356
+ <a for="response">status</a> set to 307.
3357
+
3358
+ <li><p> Return <var> fallbackResponse</var> .
3359
+ </ol>
3360
+
3361
+ <li>
3362
+ <p> Return <var> response</var> .
3363
+
3364
+ <p class=note> This means the upgrade was successful.
3365
+
3366
+ </ol>
3367
+
3368
+ <p class=note> User agents can implement a fast-fallback path by canceling slow fetches on upgraded
3369
+ requests, in order to quickly initiate a fallback http load.
3370
+
3371
+ </div>
3372
+
3373
+ <h4 id=http-upgrades-examples>Examples</h4>
3374
+
3375
+ <p id=example-https-upgrade-good-https class=example><code> a.com</code> serves both
3376
+ <code> http://a.com</code> and <code> https://a.com</code> . An eligible request to
3377
+ <code> http://a.com</code> will be upgraded to <code> https://a.com</code> .
3378
+
3379
+ <p id=example-https-upgrade-bad-https class=example><code> a.com</code> serves
3380
+ <code> http://a.com</code> but refuses connections on <code> https://a.com</code> . An eligible
3381
+ request to <code> http://a.com</code> will be upgraded to <code> https://a.com</code> , but the fetch
3382
+ will fail. A fallback request will be initiated to <code> http://a.com</code> .
3383
+
3384
+
3268
3385
3269
3386
<h2 id=http-extensions>HTTP extensions</h2>
3270
3387
@@ -4445,6 +4562,14 @@ steps:
4445
4562
4446
4563
<li><p> <a>Upgrade <var>request</var> to a potentially trustworthy URL, if appropriate</a> .
4447
4564
4565
+ <li>
4566
+ <p> Optionally, run <a>upgrade an HTTP request</a> algorithm on <var> request</var> .
4567
+
4568
+ <p class=note> HTTPS upgrading only applies to requests with <a>HTTP(S) scheme</a> s, but it's done
4569
+ in <a>main fetch</a> instead of <a>HTTP fetch</a> to ensure that
4570
+ <a>upgrade a mixed content <var>request</var> to a potentially trustworthy URL, if appropriate</a>
4571
+ step runs next and applies to the upgraded request.
4572
+
4448
4573
<li><p> <a>Upgrade a mixed content <var>request</var> to a potentially trustworthy URL, if appropriate</a> .
4449
4574
4450
4575
<li><p> If <a lt="block bad port">should <var>request</var> be blocked due to a bad port</a> ,
@@ -5153,12 +5278,14 @@ these steps:
5153
5278
<a>filtered response</a> ; otherwise to <var> response</var> 's
5154
5279
<a for="filtered response">internal response</a> .
5155
5280
5281
+ <li><p> If <var> response</var> 's <a for=response>type</a> is "<code> error</code> ", then
5282
+ return the result of running <a>HTTPS upgrade fallback</a> given <var> request</var>
5283
+ and a <a>network error</a> .
5284
+
5156
5285
<li>
5157
5286
<p> If one of the following is true
5158
5287
5159
5288
<ul class=brief>
5160
- <li><p><var> response</var> 's <a for=response>type</a> is "<code> error</code> "
5161
-
5162
5289
<li><p><var> request</var> 's <a for=request>mode</a> is "<code> same-origin</code> " and
5163
5290
<var> response</var> 's <a for=response>type</a> is "<code> cors</code> "
5164
5291
@@ -5246,6 +5373,10 @@ these steps:
5246
5373
<a>CORS check</a> , as <var> request</var> 's <a for=request>client</a> and the service worker can
5247
5374
have different embedder policies.
5248
5375
5376
+ <li><p> If <var> request</var> 's <a for=request>is HTTPS upgrade</a> is set, set <var> response</var>
5377
+ and <var> internalResponse</var> to the result of running <a>HTTPS upgrade fallback</a> given
5378
+ <var> request</var> and <var> response</var> .
5379
+
5249
5380
<li>
5250
5381
<p> If <var> internalResponse</var> 's <a for=response>status</a> is a <a>redirect status</a> :
5251
5382
@@ -8716,7 +8847,7 @@ resource — for non-<a>CORS requests</a> as well as <a>CORS
8716
8847
requests</a> — and do not use `<code> Vary</code> `.
8717
8848
8718
8849
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 >
8850
+ <h3 class=no-num id=websocket-protocol oldids=websocket-connections,websocket-opening-handshake,fail-the-websocket-connection,the-websocket-connection-is-established>WebSockets</h3 >
8720
8851
8721
8852
<p> As part of establishing a connection, the {{WebSocket}} object initiates a special kind of
8722
8853
<a for=/>fetch</a> (using a <a for=/>request</a> whose <a for=request>mode</a> is
@@ -8980,6 +9111,7 @@ done only by navigations). The <a>fetch controller</a> is also used to
8980
9111
<a for=request>redirect mode</a> set to "<code> manual</code> ".
8981
9112
8982
9113
9114
+
8983
9115
<h2 id=acknowledgments class=no-num>Acknowledgments</h2>
8984
9116
8985
9117
<p> Thanks to
0 commit comments