[19] [DFN[[CODE(HTTP)@en[[[HTTP2-Settings:]]]]]] [[ヘッダー]]は、
[CODE(HTTP)@en[[[Upgrade: h2c]]]] を指定した [[HTTP/1.1]] over [[TCP]] から
[[HTTP/2]] over [[TCP]] への移行を求める[[要求]]において、
[[HTTP/2]] [CODE(HTTP)@en[[[SETTINGS]]]] [[フレーム]]を指定するものです。

* 代替

[20] この[[ヘッダー]]が広く実装されるかどうかは不明です。

;; [CODE(HTTP)@en[[[Upgrade: h2c]]]] も参照。

[21] そもそも [[TLS]] を使わない [[HTTP]] は安全ではないので、
使うべきではありません。通常は [[HTTP/2]] over [[HTTPS]] を使うべきです。 [[HTTPS]]
では本[[ヘッダー]]は使いません。

* 仕様書

[REFS[
- [1] '''[CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-3.2.1>'''
- [16] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-8.1.2.2>
- [13] [CITE@en[RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)]] ([TIME[2015-05-15 10:14:54 +09:00]] 版) <https://tools.ietf.org/html/rfc7540#section-11.5>
]REFS]

* 意味

[3] [[HTTP/2接続]]に関する[[引数]]を含むものです [SRC[>>1]]。

[4] [[connection-specific header field]] です [SRC[>>1]]。

* 構文

[5] [[字句68]]です [SRC[>>1]]。

[9] 値は、 [CODE(HTTP)@en[[[SETTINGS]]]] [[フレーム]]の [[payload]]
を [[RFC 4648]] [[base64url]] [[符号化]]し[[詰め]]を省略したものです [SRC[>>1]]。

* 文脈

[2] [[HTTP/1.1]] から [[HTTP/2]] への切り替えの[[要求]]は、
[CODE(HTTP)@en[[[HTTP2-Settings:]]]] [[ヘッダー]]をちょうど1つだけ含まなければ[['''なりません''']] [SRC[>>1]]。

[10] [CODE(HTTP)@en[[[Connection:]]]] にも [CODE(HTTP)@en[[[HTTP2-Settings]]]]
を指定しなければ[['''なりません''']] [SRC[>>1]]。

[6] [[サーバー]]は、送信しては[['''なりません''']] [SRC[>>1]]。

;; [12] [[クライアント]]が [CODE(HTTP)@en[[[Upgrade:]] [[h2c]]]] 以外の文脈で使ってはならないという規定は、なぜかありません。

[14] [[HTTP/1.0]] で利用することは明確には禁止されていませんが、
[[HTTP/1.0]] では [CODE(HTTP)@en[[[Upgrade:]]]] は利用できないため、意味がありません。

[17] [[HTTP/2]] では[[生成]]しては[['''なりません''']] [SRC[>>1, >>16]]。

;; [15] [[HTTP/2]] [[メッセージ]]に [CODE(HTTP)@en[[[HTTP2-Settings:]]]]
[[ヘッダー]]を指定しても意味はありません。 [CODE(HTTP)@en[[[SETTINGS]]]]
[[フレーム]]を使う必要があります。

* 処理

[8] [[サーバー]]は、 [CODE(HTTP)@en[[[HTTP2-Settings:]]]] [[ヘッダー]]が複数あるか、
1つもなければ、[[HTTP/2]] に切り替えては[['''なりません''']] [SRC[>>1]]。

[11] [[サーバー]]は、値を通常の [CODE[[[SETTINGS]]]] [[フレーム]]と同じように解釈します
[SRC[>>1]]。

[18] [[base64url]] [[復号]]や[[フレーム]]解釈によりエラーが検出された場合にどうするべきなのかは不明です。
切り替えずに [[HTTP/1.1]] で処理を続けるべきなのでしょうか。

[7] 詳しくは [CODE(HTTP)@en[[[Upgrade: h2c]]]] を参照。

[22] [[HTTP/2]] への切り替えを表す[[要求]]以外では無視するべきと思われますが、
[[RFC]] には明記されていません。

* 歴史

[24] [[HTTP/2]] と共に導入されました。

[FIG(quote)[
[FIGCAPTION[
[23] [CITE@ja[HTTP/2 プロトコルネゴシエーション方法と ATS での実装 - Yahoo! JAPAN Tech Blog]]
([TIME[2016-03-02 18:01:38 +09:00]] 版)
<http://techblog.yahoo.co.jp/infrastructure/http2/ats_http2_pn/>
]FIGCAPTION]

> ATS には現状 HTTP アップグレードメカニズムを使用した HTTP/2 へのアップグレードには対応しておらず、NPN もしくは ALPN によるプロトコルネゴシエーションのみサポートされている状態です。しかしながらアップグレード対応の為の実装作業はそれほど大掛かりな作業ではなく、http スキームからのネゴシエーション方法もサポートしておきたいため(本稿のためのネタ作りも兼ねて!)今回実装してパッチを送りました。

]FIG]
