[21] [DFN[[RUBYB[拡張宣言]@en[extension declaration]]]]は、
[[HTTPメッセージ]]に適用される拡張を宣言するものです。
[[HTTPヘッダー]]
[CODE(HTTP)@en[[[Man:]]]], [CODE(HTTP)@en[[[C-Man:]]]],
[CODE(HTTP)@en[[[Opt:]]]], [CODE(HTTP)@en[[[C-Opt:]]]]
は、[[拡張宣言]]を含めるものです。

* 仕様書

[REFS[
- [1] [CITE@en[RFC 2774 - An HTTP Extension Framework]] ([TIME[2014-09-08 03:36:50 +09:00]] 版) <http://tools.ietf.org/html/rfc2774#section-3>
- [19] [CITE@en[RFC 2774 - An HTTP Extension Framework]] ([TIME[2014-09-08 03:36:50 +09:00]] 版) <http://tools.ietf.org/html/rfc2774#section-4>
- [30] [CITE@en[RFC 2774 - An HTTP Extension Framework]] ([TIME[2014-09-08 03:36:50 +09:00]] 版) <http://tools.ietf.org/html/rfc2774#section-5>
- [34] [CITE@en[RFC 2774 - An HTTP Extension Framework]] ([TIME[2014-09-08 03:36:50 +09:00]] 版) <http://tools.ietf.org/html/rfc2774#section-6>
- [39] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=38>
- [41] [CITE[UPnP Device Architecture 2.0]] ([TIME[2014-09-05 02:24:48 +09:00]] 版) <http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v2.0.pdf#page=116>
]REFS]

* 意味

[2] [[拡張宣言]]は、当該[[メッセージ]]に拡張が適用されることを示すとともに、
[[ヘッダー接頭辞]]の[[名前空間]]を予約するものです [SRC[>>1]]。

[10] 拡張は、[[絶対URL]]か[[ヘッダー名]]で識別します。
[[ヘッダー名]]は [[IETF]] [[標準化過程RFC]] で定義された[[ヘッダー]]の名前でなければ[['''なりません''']]。
[SRC[>>1]]

;; [11] [[ヘッダー名]]を指定できるのは、[[絶対URL]]で定義された拡張から [[IETF]]
[[標準化過程RFC]] で規定された標準仕様への移行のためと説明されています [SRC[>>1]]。

[20] [[拡張宣言]]は、[RUBYB[必須]@en[mandatory]]のものと[RUBYB[任意選択]@en[optional]]のものがあります [SRC[>>19]]。
[CODE(HTTP)@en[[[Man:]]]] と [CODE(HTTP)@en[[[C-Man:]]]] には必須の[[拡張宣言]]を指定できます。
[CODE(HTTP)@en[[[Opt:]]]] と [CODE(HTTP)@en[[[C-Opt:]]]] には必須の[[拡張宣言]]を指定できます。

[23] [[拡張宣言]]は、[[ホップ毎]]のものと[[末端対末端]]のものがあります [SRC[>>19]]。
[[ホップ毎]]の[[拡張宣言]]は、当該[[HTTP接続]]にのみ適用されます [SRC[>>19]]。
[CODE(HTTP)@en[[[C-Man:]]]] と [CODE(HTTP)@en[[[C-Opt:]]]] には[[ホップ毎]]の[[拡張宣言]]を指定できます [SRC[>>19]]。
[CODE(HTTP)@en[[[Man:]]]] と [CODE(HTTP)@en[[[Opt:]]]] には[[末端対末端]]の[[拡張宣言]]を指定できます [SRC[>>19]]。

* 構文

[27] 各[[ヘッダー]]の値は、1つ以上の[[拡張宣言]]の[[リスト]] ([CODE(HTTP)[#]])
です [SRC[>>19]]。

[FIG(railroad)[
= [[拡張宣言]]
= *
== [[OWS]]
== [CODE(HTTP)[[[,]]]]
== [[OWS]]
== [[拡張宣言]]
]FIG]

[4] [[拡張宣言]]は、 [CODE[[["]]]] で括った[[絶対URL]]または[[ヘッダー名]]の後に、
0個以上の [CODE(HTTP)[[[;]]]] と[[引数]]を指定したものです [SRC[>>1]]。

;; [6] 仕様書の時代的に構文上明記されていませんが、 [CODE(HTTP)[[[;]]]]
の前後には [[OWS]] が挿入できると思われます。

[FIG(railroad)[
= [CODE[[["]]]]
= |
== [[絶対URL]]
== [[ヘッダー名]]
= [CODE[[["]]]]
= *
== [[OWS]]
== [CODE(HTTP)[[[;]]]]
== [[OWS]]
== [[引数]]
]FIG]

;; [5] [[絶対URL]]は [[RFC 2068]] を通じて [[RFC 1738]] の定義が参照されています。
[[非ASCII文字]]は使えません。

;; [3] [[絶対URL]]は必ず [CODE(URI)[[[:]]]] を含み、[[ヘッダー]]は必ず含まないので、
両者は曖昧なく区別できます。

[7] [[引数]]は、名前のみか、名前と値を [CODE(HTTP)[[[=]]]] で連結したものです [SRC[>>1]]。

[8] 名前は[[字句]]です [SRC[>>1]]。

;; [17] [[大文字・小文字不区別]]と思われますが、明記されていません。唯一定義されている
[CODE(HTTP)@en[[[ns]]]] [[引数]]は構文上不区別となっています [SRC[>>1]]。

[9] 値は[[字句]]または[[引用文字列]]です [SRC[>>1]]。

[FIG(railroad)[
= [[字句]]
= ?
== [CODE(HTTP)[[[=]]]]
== |
=== [[字句]]
=== [[引用文字列]]
]FIG]

* 文脈

[26] 任意選択の[[拡張宣言]]は、どの[[HTTPメッセージ]]にも指定できます [SRC[>>19, >>34]]。

[28] [CODE(HTTP)@en[[[C-Man:]]]], [CODE(HTTP)@en[[[C-Opt:]]]] およびこれらで宣言された[[ヘッダー接頭辞]]から始まる[[ヘッダー]]の名前は、
[CODE(HTTP)@en[[[Connection:]]]] に指定しなければ[['''なりません''']] [SRC[>>19]]。

[31] 必須の[[拡張宣言]]を含む[[要求]]を[RUBYB[必須要求]@en[mandatory request]]といいます。
必須要求の[[要求メソッド]]は [CODE(HTTP)[[[M-*]]]] でなければ[['''なりません''']]。 [SRC[>>19]]

[35] [[鯖]]は、必須の要求に対する[[応答]]で、または対応していることが事前に分かっている[[受信者]]に対してを除き、
必須の[[拡張宣言]]を送信しては[['''なりません''']] [SRC[>>34]]。

[40] [[SSDP]] の [CODE(HTTP)@en[[[M-SEARCH]]]] [[要求]]でも
[CODE(HTTP)@en[[[MAN:]]]] を使います [SRC[>>39]]。

[42] [[SSDP]] の [CODE(HTTP)@en[[[NOTIFY]]]] [[要求]]で
[CODE(HTTP)@en[[[OPT:]]]] や[[ヘッダー接頭辞]]から始まる[[ヘッダー]]を使った例も示されています [SRC[>>41]]。

* 処理モデル

[25] 任意選択の[[拡張宣言]]の[[受信者]]は、拡張で指定された規則に従っても構いませんし、
拡張を無視しても構いません [SRC[>>19, >>30]]。

[24] 必須の[[拡張宣言]]の[[受信者]]は、拡張で指定された規則に従わなければ[['''なりません''']] [SRC[>>19, >>30]]。従えない時は、 [CODE(HTTP)[[[510]]]] 
[[応答]]を返さなければ[['''なりません''']] [SRC[>>30]]。

[29] [[末端対末端]]または[[ホップ毎]]の必須の[[拡張宣言]]を受信し、
その拡張をすべて理解して処理できた[[鯖]]は、
[[応答]]にそれぞれ [CODE(HTTP)@en[[[Ext:]]]] と [CODE(HTTP)@en[[[C-Ext:]]]]
を指定しなければ[['''なりません''']] [SRC[>>30]]。

;; [33] [CODE(HTTP)@en[[[Ext:]]]] も参照。

[32] 必須の[[拡張宣言]]を処理する[[受信者]]でない[[串]]は、
[[転送]]時に[[拡張宣言]]を削除しては[['''なりません''']] [SRC[>>30]]。

[36] [[クライアント]]が理解できない、または使いたくない必須の[[拡張宣言]]が[[応答]]に含まれていた場合には、
[CODE(HTTP)[[[500]]]] [[応答]]が返されたかのように扱う[['''べきです''']] [SRC[>>34]]。

* 引数

[12] 構文上 [CODE(HTTP)@en[[[ns]]]] が最初の[[引数]]でなければならないようになっています [SRC[>>1]]。

;; [13] 実際に順序に意味があるのかは不明です。

[14] 拡張の[[引数]]を使っても構いませんが、受信者が認識することは保証できません。
拡張の[RUBYB[実現値データ]@en[instance data]]を伝えるために[[引数]]を使っては[['''なりません''']]。 [SRC[>>1]]

;; [18] [[引数]]の名前が重複して良いのかは不明です。

[15] 未知の[[引数]]は無視する[['''べきです''']] [SRC[>>1]]。[[串]]は[[転送]]時に削除しては[['''なりません''']]
[SRC[>>1]]。

[16] 次の[[引数]]があります。
[FIG(short list)[
- [CODE(HTTP)@en[[[ns]]]]
]FIG]

* 歴史

[38] [[RFC 4229]] が [[RFC 2774]] を出典にこれら4[[ヘッダー]]を状態「[[実験的]]」
で[[IANA登録簿]]に登録しています [SRC[>>37]]。

[REFS[
- [37] [CITE@en[RFC 4229 - HTTP Header Field Registrations]] ([TIME[2014-11-02 18:53:20 +09:00]] 版) <http://tools.ietf.org/html/rfc4229>
]REFS]

* 関連

[22] 意味的には[[XML名前空間]]の[[名前空間宣言]]と似ています。