[67] [[CSP指令]] [DFN[[CODE(HTTP)@en[[[upgrade-insecure-requests]]]]]]
は、そのページに関する [[fetch]] で [CODE(URI)@en[[[http:]]]] を
[CODE(URI)@en[[[https:]]]] に書き換えること ([DFN[[RUBYB[格上げ]@en[upgrade]]]])
を指示するものです。

[68] [[HTTP要求]]の [DFN[[CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]]]]
[[ヘッダー]]は、[[クライアント]]が本 [[CSP指令]]に対応していることを示すものです。

* 仕様書

[69] 本機能は [[W3C]] [[WebAppSec WG]] で [[Mike West]] らにより開発された仕様書
[DFN[[CITE[[[Upgrade Insecure Requests]]]]]] (非保安要求の格上げ、
[DFN[UIR]]) で規定されています。

[REFS[
- [23] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/>
-- [22] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/#key-concepts>
-- [26] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/#insecure-requests-policy>
-- [31] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-insecure-requests>
-- [42] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/#preference>
-- [65] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/#should-upgrade-for-client>
]REFS]

* 意味

[71] [[CSP指令]] [CODE(HTTP)@en[[[upgrade-insecure-requests]]]]
は、本来 [CODE(URI)@en[[[http:]]]] [[URL]] で指定され[[素のHTTP]]
で [[fetch]] するべきところを [CODE(URI)@en[[[https:]]]]
に書き換え [[HTTPS]] で [[fetch]] するよう、 [[Webブラウザー]]に指示するものです。

[72] 10年代半ば、[[インターネット]]の[[プロトコル]]が[[平文]]から [[TLS]]
ベースへと移行することを迫られる中、既存の [CODE(URI)@en[[[http:]]]]
前提の [[Webサイト]]の [[HTTPS]] への移行のために [[Webサイト]]中の [CODE(URI)@en[[[http:]]]]
[[URL]] をすべて書き換えなければ [[Mixed Content]] 制約に抵触することが問題となりました。
例えば [CODE(HTMLe)@en[[[script]]]] [[要素]]で [CODE(URI)@en[[[http:]]]]
の[[絶対URL]]が指定されていると、
そのままでは [[HTTPS]] 化できません。そのため、あまりメンテナンスされなくなった
[[Webページ]]や本文を編集したくない歴史的な文書などの [[Webサイト]]は
[[HTTPS]] に移行するのが困難でした。

[73] そこで導入された本機能を使うと、[[Webページ]]の[[文書]]自体は編集せずとも
[[HTTPヘッダー]]を追加するだけで、 [[Mixed Content]] 制約の検査の前に
[CODE(URI)@en[[[http:]]]] [[URL]] を[[Webブラウザー]]に読み替えさせることができます。

[74] ただし [[Mixed Content]] 制約を実装して本機能を実装しない旧来の
[[Webブラウザー]]に対して [[HTTPS]] で[[Webサイト]]を提供すると、
[[CSP指令]]は単に無視されますから、 [[URL]] の書き換えが行われず、
[[Webサイト]]は壊れてしまいます。そこで本機能に対応した [[Webブラウザー]]は
[[HTTP要求]]に [CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]] 1]]
[[ヘッダー]]を追加することになっています。[[サーバー]]はこの[[ヘッダー]]がある時だけ
[[HTTPS]] で本機能を利用し、そうでない時は従来通り[[素のHTTP]]
で [[Webサイト]]を提供できます。

;; [75] この [[HTTPヘッダー]]による[[サーバー]]側での分岐は、すべての
[[Webブラウザー]]が本 [[CSP指令]]に対応さえすれば、不要になると思われます。
[[Webブラウザー]]は多くの[[要求]]で [CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]] 1]]
[[ヘッダー]]分の余計な転送が必要となりますが、いずれはそれも要らなくなるかもしれません。
(現状でもできるだけ削減するために [[HSTS]] の情報が使われています。)
一方で [[CSP指令]]は [[HTTPS]] に移行した [[Webサイト]]が今後も意図通り動作し続けるために、
[[Webブラウザー]]が恒久的に対応し続ける必要があります。

[76] [[CSP指令]] [CODE(HTTP)@en[[[upgrade-insecure-requests]]]]
は、その[[文書]]内の[[画像]]、[[スクリプト]]、[[ワーカー]]、
[[XHR]] アクセスなどで [CODE(URI)@en[[[http:]]]] を [CODE(URI)@en[[[https:]]]]
に読み替えさせます。 [[WebSocket]] アクセスでは [CODE(URI)@en[[[ws:]]]]
を [CODE(URI)@en[[[wss:]]]] に読み替えさせます。

[78] [[CSP指令]] [CODE(HTTP)@en[[[upgrade-insecure-requests]]]]
は、その[[文書]]からの [[navigate]] ([[ハイパーリンク]]や[[フレーム]]など)
のうち、同じ[[起源]]へのものや、[[フォーム提出]]について [CODE(URI)@en[[[http:]]]] を 
[CODE(URI)@en[[[https:]]]] に読み替えさせます。

[79] この[[CSP指令]]の効果は[[フレーム]]内にも及びます。
[[フレーム]]内でこれを解除することはできません。

* 用語

[25] 本[[仕様書]]では次の用語が定義されています。
[FIG(short list)[
- [[格上げ]]
- [[安全に格上げ可能な要求]]
- [[HSTS安全起源]]
- [[条件付きHSTS安全起源]]
- [[preloadable HSTS host]]
]FIG]

* プロトコル

[59] 本[[仕様書]]では次の[[プロトコル要素]]が定義されています。

[FIG(list)[
- [CODE(HTTP)@en[[[upgrade-insecure-requests]]]] ([[CSP指令]])
- [CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]] ([[HTTPヘッダー]])
]FIG]

* 格上げ

[24] [[URL scheme]] を [CODE(URI)@en[[[https]]]] や [CODE(URI)@en[[[wss]]]]
に書き換えた時、[[要求]]を[DFN[[RUBYB[[[格上げ]]]@en[upgrade]]]]したといいます [SRC[>>22]]。

[FIG(list short)[
- [[安全に格上げ可能]]
]FIG]

[39] [[格上げ]]は、 [[Mixed Content]] や [[CSP]] の検査よりも前に行われます。

;; [[fetch]] 参照。

* 非保安要求ポリシー

[27] [[環境設定群オブジェクト]]と[[閲覧文脈]]は、
[DFN[[RUBYB[非保安要求ポリシー]@en[insecure requests policy]]]]を持ちます [SRC[>>26]]。

[28] その値は、
「[RUBYB[格上げする]@en[Upgrade]]」、
「[RUBYB[格上げしない]@en[Do Not Upgrade]]」のいずれかです [SRC[>>26]]。
既定値は「格上げしない」です [SRC[>>26]]。

[41] この値は、 [CODE(HTTP)@en[[[Content-Security-Policy:]] [[upgrade-insecure-requests]]]]
で設定されます。

[29] この値は、 [[navigate]] 以外の[[要求]]や[[フォームの提出]]において、
[CODE(URI)@en[[[http:]]]] → [CODE(URI)@en[[[https:]]]]
の書き換えを行うかどうかの判断に使われます。

;; [30] [[navigate]] では[[非保安navigate格上げ集合]]が参照されます。

[61] この値は[[閲覧文脈の作成]]や[[新しい文書オブジェクトの作成]]で設定されることがあります。
すなわち、[[フレーム]]外の[[文書]]の指定は、[[フレーム]]内の[[文書]]にも適用されます。

[62] [[ワーカー]]の作成時には、作成元の値が引き継がれます。

[64] [DFN[[RUBYB[[VAR[クライアント]]について非保安要求を格上げするべきか]@en[Should insecure requests be upgraded for [VAR[client]]?]]]]は、
次のように決まります [SRC[>>65]]。
[FIG(steps)[
= [137] [VAR[クライアント]]が[[有責文書]]を持つなら、
== [138] [VAR[クライアント]]の[[有責文書]]の[[非保安要求ポリシー]]を返します。
= [139] それ以外で、[VAR[クライアント]]が[[有責閲覧文脈]]を持つなら、
== [140] [VAR[クライアント]]の[[有責閲覧文脈]]の[[非保安要求ポリシー]]を返します。
= [141] それ以外なら、
== [142] 「格上げしない」を返します。
]FIG]

;; [66] これは [[main fetch]] [DEL[や [[WebSocket接続の確立]]]]で参照されます。

* [CODE(HTTP)@en[Content-Security-Policy: upgrade-insecure-requests]]

[32] [[CSP]] の[[指令]] [DFN[[CODE(HTTP)@en[[[upgrade-insecure-requests]]]]]]
は、[[被保護資源]]の非保安要求を格上げするべきことを示します [SRC[>>31]]。

[33] 値は、空です [SRC[>>31]]。

[34] [CODE(HTTP)@en[[[Content-Security-Policy:]]]] [[ヘッダー]]で使うことができます
[SRC[>>31]]。 [CODE(HTML)@en[[[<meta http-equiv=Content-Security-Policy>]]]]
での利用も禁止されていません。 [CODE(HTTP)@en[[[Content-Security-Policy-Report-Only:]]]]
[[ヘッダー]]でも禁止はされていませんが意味はありません [SRC[>>31]]。

[77] [CODE(URI)@en[[[http:]]]] での利用も禁止されておらず、
処理も [CODE(URI)@en[[[https:]]]] の場合と変わらないようです。

[35] [[enforce]] は、次のようにします [SRC[>>31]]。
[FIG(steps)[
= [36] [[被保護資源]]の[[現職設定群オブジェクト]]の[[非保安要求ポリシー]]を、
「格上げ」に設定します。
= [37] [[被保護資源]]の[[現職設定群オブジェクト]]の[[非保安navigate格上げ集合]]に、
[[被保護資源]]の [[URL]] の[[ホスト]]と[[ポート]]の[[組]]を挿入します。
]FIG]

[38] [[monitor]] は、何もしません [SRC[>>31]]。

[40] [CODE(HTTP)@en[[[upgrade-insecure-requests]]]] と
[CODE(HTTP)@en[[[block-all-mixed-content]]]] を併用するべきではありません [SRC[>>31]]。
両方が適用される場合、前者が優先されます。

* [CODE(HTTP)@en[Upgrade-Insecure-Requests:]] ヘッダー

[43] [DFN[[CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]]]]
[[ヘッダー]]は、
[[クライアント]]が[[サーバー]]に対して暗号化されて認証された[[応答]]を望んでいること、
[[CSP]] [CODE(HTTP)@en[[[upgrade-insecure-requests]]]] [[指令]]を処理できることを示すものです
[SRC[>>42]]。

[80] 本[[ヘッダー]]は [[fingerprinting vector]] です。

** 構文

[44] この[[ヘッダー]]の値は、 [CODE[[[1]]]] です [SRC[>>42]]。
[CODE(HTTP)@en[[[upgrade-insecure-requests]]]] に対応していることを示します。

[FIG(railroad)[
= [CODE(HTTP)[[[1]]]]
]FIG]

[45] 未対応の時は、この[[ヘッダー]]自体を指定しません。

** 文脈

[49] [[利用者エージェント]]は、 [[a priori insecure URL]] への[[要求]]で
[CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]] [[ヘッダー]]を送信しなければ[['''なりません''']]
[SRC[>>42]]。

[51] [[利用者エージェント]]は、 [[potentially secure URL]] でその[[ホスト]]が
[[preloadable HSTS host]] でなければ、[[要求]]で
[CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]] [[ヘッダー]]を送信しなければ[['''なりません''']]
[SRC[>>42]]。

[53] [[利用者エージェント]]は、 [[potentially secure URL]] でその[[ホスト]]が
[[preloadable HSTS host]] なら、[[要求]]で定期的に
[CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]] [[ヘッダー]]を送信する[['''べきです''']]
[SRC[>>42]]。

[EG[
[54] 例えば、 [CODE(HTTP)@en[[[max-age]]]] で示された期限間近の時だけ送信することもできますし、
少ない割合でのみ送信することもできます。 [SRC[>>42]]
]EG]

;; [56] [[prelodable HSTS host]] は [[HSTS安全]]だとわかっているので[[格下げ]] (>>55)
は不要ですが、 [CODE(HTTP)@en[[[max-age]]]] の[[満期]]前に [[HSTS]] 状態を更新する必要があり、
[[サーバー]]は [CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]]
をその合図として使うことができます。 [SRC[>>42]]

;; [63] [[main fetch]>>126] 参照。

[58] それ以外の場面 ([[応答]]など) での利用は禁止こそされていませんが、意味はありません。

** 処理

[55] [[サーバー]]は、素の [[HTTP]] の[[要求]]で [CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]]
[[ヘッダー]]があれば、[[要求]]された[[資源]]の [[potentially secure representation]]
に[[リダイレクト]]する[['''べきです''']] [SRC[>>42]]。

;; [50] [[サーバー]]は、 [[a priori insecure URL]] への[[要求]]で
[CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]]
[[ヘッダー]]があれば、 [CODE(HTTP)@en[[[upgrade-insecure-requests]]]]
が必要なページへの [[HTTP]] の[[要求]]を [[HTTPS]] への[[要求]]へと[[格上げ]]できます [SRC[>>42]]。

[57] [[サーバー]]は、[[HTTPS]] の[[要求]]で [CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]]
[[ヘッダー]]があれば、[[要求]]の[[ホスト]]が [[HSTS安全]]か[[条件付きHSTS安全]]の場合、
[[応答]]に [CODE(HTTP)@en[[[Strict-Transport-Security:]]]] [[ヘッダー]]を含める[['''べきです''']]
[SRC[>>42]]。

;; [52] [[サーバー]]は、[[potentially secure URL]] への[[要求]]で
[CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]]
[[ヘッダー]]があれば、 [[HTTPS]] への[[要求]]を [[HTTP]] への[[要求]]へと[[格下げ]]できます
[SRC[>>42]]。

[60] [[サーバー]]は、[[HTTPキャッシュ]]を考慮して
[CODE(HTTP)@en[[[Vary:]]]] [[ヘッダー]]に
[CODE(HTTP)@en[[[Upgrade-Insecure-Requests]]]] を追加する必要があるかもしれません。

* 関連

[70] [[HTTPヘッダー]] [CODE(HTTP)@en[[[Upgrade:]]]] とは無関係です。

* 歴史

- [9] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-05-17 18:30:14 +09:00]] 版) <https://w3c.github.io/webappsec/specs/upgrade/>

[46] [CODE(HTTP)@en[[[Upgrade-Insecure-Requests:]]]] [[ヘッダー]]は、
当初 [CODE(HTTP)@en[[[Prefer:]]]] [[ヘッダー]]の値として導入することが検討されていましたが、
[[HTTPキャッシュ]]の効率に悪影響を及ぼす虞があるとして、
断念されました [SRC[>>42]]。

[47] 次に [DFN[[CODE(HTTP)@en[[[HTTPS:]]]]]] [[ヘッダー]]とすることが提案され、
実際に [[Chrome]] に実装されましたが、 (驚くべきことに)
[[HTTPS]] か素の [[HTTP]] かの判断に影響を及ぼすサーバーが少なからず見つかったため、
[[ヘッダー名]]が改められました。

;; [48] そんな[[サーバー]]はきっと何か恐ろしい脆弱性があるに違いありませんが...

[1] [CITE@en[UPGRADE: Describe a 'return=secure-representation' preference. · e524850 · w3c/webappsec]]
([TIME[2015-02-14 18:48:13 +09:00]] 版)
<https://github.com/w3c/webappsec/commit/e524850dd6d8862712b18b43b9754ce951960cbf>

[2] [CITE@en[Re: UPGRADE: Feature detection?]]
([[Mike West]] 著, [TIME[2015-02-13 22:11:51 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webappsec/2015Feb/0280.html>

[3] [CITE@en[Re: ''''''[''''''upgrade'''''']'''''' return=secure-representation]]
([[Mike West]] 著, [TIME[2015-03-13 17:53:21 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webappsec/2015Mar/0086.html>

[4] [CITE@en[UPGRADE: Change to 'Prefer: https', which is (hopefully) not horrible ho... · a0aa404 · w3c/webappsec]]
([TIME[2015-03-14 11:35:17 +09:00]] 版)
<https://github.com/w3c/webappsec/commit/a0aa404a84a0eca2040246fcd805980461d327ae>

[5] [CITE@en[UPGRADE: 'tls' is shorter than 'https'. · 29d07a9 · w3c/webappsec]] ([TIME[2015-03-18 11:43:22 +09:00]] 版) <https://github.com/w3c/webappsec/commit/29d07a99aebebd02f40a2daa9feb8425c36c5c21>

[6] [CITE@en[UPGRADE: Rename the header from `Prefer: tls` to `HTTPS: 1`. · d7d9fc0 · w3c/webappsec]] ([TIME[2015-03-19 15:48:18 +09:00]] 版) <https://github.com/w3c/webappsec/commit/d7d9fc0e16573455cf17d562eaff9667096e6489>

[7] [CITE@en[Integrate with UPGRADE. Fixes https://www.w3.org/Bugs/Public/show_bug.cg... · whatwg/fetch@fd90b5a]]
([TIME[2015-03-31 11:21:22 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/fd90b5afd0ff09284c2a3cd093c577d17ce06898>

[8] [CITE@en[Upgrade Insecure Requests]]
([TIME[2015-04-24 19:13:15 +09:00]] 版)
<http://www.w3.org/TR/2015/WD-upgrade-insecure-requests-20150424/>

[10] [CITE@en[UPGRADE: 'HTTPS' header causing compatibility issues.]]
([[Mike West]] 著, [TIME[2015-06-30 16:36:50 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webappsec/2015Jun/0075.html>

[11] [CITE@en[Re: UPGRADE: 'HTTPS' header causing compatibility issues.]]
([[Mike West]] 著, [TIME[2015-07-07 21:10:11 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webappsec/2015Jul/0052.html>

[12] [CITE@en[UPGRADE: Rename 'HTTPS: 1' to 'Upgrade-Insecure-Requests: 1'. · w3c/webappsec@eeac392]]
([TIME[2015-07-15 12:32:11 +09:00]] 版)
<https://github.com/w3c/webappsec/commit/eeac3922418bfa6cb254071c74ddd962ee418c80>

[13] [CITE@en[Re: UPGRADE: 'HTTPS' header causing compatibility issues.]]
([[Mike West]] 著, [TIME[2015-07-16 16:49:13 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webappsec/2015Jul/0108.html>

[14] [CITE@en[UPGRADE: Ugly first stab at a strawman. · 56a27a2 · w3c/webappsec]]
([TIME[2015-02-05 20:37:40 +09:00]] 版)
<https://github.com/w3c/webappsec/commit/56a27a20bef8a3f8f9cf29fecf49b8163eb85afd>

[15] [CITE@en[Upgrade Insecure Requests]]
( ([TIME[2015-02-24 21:59:42 +09:00]] 版))
<http://www.w3.org/TR/2015/WD-upgrade-insecure-requests-20150226/>

[16] [CITE@en[Upgrade Insecure Requests]]
( ([TIME[2015-02-26 20:26:19 +09:00]] 版))
<https://w3c.github.io/webappsec/specs/upgrade/>

[17] [CITE@en[1139297 – Implement CSP upgrade-insecure-requests directive]]
([TIME[2015-05-28 14:53:47 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1139297>

[FIG(quote)[
[FIGCAPTION[
[18] [CITE@en[776278 – Auto Upgrade Insecure Requests from Secure Context]]
([TIME[2015-10-02 23:09:30 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=776278>
]FIGCAPTION]

> HSTS plus upgrade-insecure-requests is the way to go.

]FIG]

[19] [CITE@en[Upgrade Insecure Requests]]
([TIME[2015-10-01 23:35:23 +09:00]] 版)
<https://w3c.github.io/webappsec-upgrade-insecure-requests/>

[21] [CITE@en[w3c/webappsec-upgrade-insecure-requests]]
([TIME[2015-10-06 23:26:51 +09:00]] 版)
<https://github.com/w3c/webappsec-upgrade-insecure-requests>

[20] [CITE@en[Upgrade Insecure Requests]]
( ([TIME[2015-10-07 23:50:14 +09:00]] 版))
<http://www.w3.org/TR/2015/CR-upgrade-insecure-requests-20151008/>

[81] [CITE@en[Allow upgrades from explicitly insecure expressions · w3c/webappsec-csp@0e81d81]]
([TIME[2015-10-29 12:41:06 +09:00]] 版)
<https://github.com/w3c/webappsec-csp/commit/0e81d81b64c42ca3c81c048161162b9697ff7b60>

[82] [CITE@en[''''''[''''''UPGRADE'''''']'''''' passive mixed content breakage with the current variant of  upgrade-insecure-requests]]
([[Peter Eckersley]] 著, [TIME[2015-12-27 17:42:31 +09:00]] 版)
<https://lists.w3.org/Archives/Public/public-webappsec/2015Dec/0055.html>

[83] [CITE@en[1243586 – Implement Upgrade-Insecure-Requests HTTP Request Header Field]]
([TIME[2016-03-12 12:49:33 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1243586>

[84] [[Chrome]] だと [[fetch]] される [CODE(URI)@en[https:]] 
から[[HTTPリダイレクト]]で [CODE(URI)@en[http:]] に飛ばされる時、
[[UIR]] が適用されないように見えます。([[Fetch Standard]] によればその場合も
[[UIR]] が適用されるべきだと思われますが...) [TIME[2016-07-17T05:29:25.800Z]]

[85] [CITE@en[Proposal for a MIX Level 2 roadmap.]]
([[Mike West]]著, [TIME[2017-10-27 16:07:15 +09:00]])
<https://lists.w3.org/Archives/Public/public-webappsec/2017Oct/0013.html>

[86] [CITE@en[webappsec-mixed-content/proposed-level-2-roadmap.md at master · mikewest/webappsec-mixed-content]]
([TIME[2017-10-28 22:38:29 +09:00]])
<https://github.com/mikewest/webappsec-mixed-content/blob/master/proposed-level-2-roadmap.md>

[87] [CITE@en[Add MIX level 2 skeleton by estark37 · Pull Request #21 · w3c/webappsec-mixed-content]]
([TIME[2020-01-12 16:30:21 +09:00]])
<https://github.com/w3c/webappsec-mixed-content/pull/21>