[102] [[HTTP]] の[[状態符号]] [DFN[[CODE(HTTP)[[[101]]]]]] は、
[[プロトコル]]を [[HTTP/1.1]] 以外に切り替えることを表します。

[103] この[[応答]]までは [[HTTP/1.1]] ですが、その後は新しい[[プロトコル]]に切り替わります。

[107] [[HTTP]] の[[鯖]]も[[クライアント]]も、 [[HTTP]]
以外の[[プロトコル]]の実装は特に義務付けられていません。しかし、
[[HTTP/1.1]] の[[クライアント]]は、 [CODE(HTTP)[[[101]]]]
を含む [CODE(HTTP)[[[1xx]]]] の[[応答]]の[[構文解析]]には対応しなければなりません。

[106] この[[状態符号]]は [CODE(HTTP)@en[[[Upgrade:]]]] [[ヘッダー]]と共に使われます。
用法と処理モデルについては、 [CODE(HTTP)@en[[[Upgrade:]]]] の項も参照してください。

* 仕様書

[REFS[
- [111] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-06-07 01:55:45 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-6.2.2>'''
- [5] [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.1>
]REFS]

* 意味

[112] [CODE(HTTP)[[[101]]]] [[状態符号]]は、 [[クライアント]]が
[CODE(HTTP)@en[[[Upgrade:]]]] [[ヘッダー]]で示した本[[接続]]で利用する[[アプリケーションプロトコル]]の変更の要求を[[鯖]]が理解し、
従う意思があることを示しています。 [SRC[>>111]]

* 構文

[113] [[鯖]]は、 [CODE(HTTP)[[[101]]]] [[応答]]に [CODE(HTTP)@en[[[Upgrade:]]]] 
[[ヘッダー]]を生成しなければ[['''なりません''']] [SRC[>>101]]。

* 文脈

[108] [[HTTP/1.0]] [[クライアント]]に [CODE(HTTP)[[[101]]]]
を含む [CODE(HTTP)[[[1xx]]]] の[[応答]]を送っては[['''なりません''']]。

[6] [[HTTP/2]] では [CODE(HTTP)[[[101]]]] [[応答]]は使えません [SRC[>>5]]。

* 処理

[109] [[HTTP/1.1]] の[[クライアント]]は、 [CODE(HTTP)[[[101]]]]
を含む [CODE(HTTP)[[[1xx]]]] の[[構文解析]]に対応しなければ[['''なりません''']]。

[110] [[HTTP/1.1]] の[[串]]は、自身が [CODE(HTTP)[[[1xx]]]]
[[応答]]を特に要求した場合を除き、 [CODE(HTTP)[[[101]]]]
を含む [CODE(HTTP)[[[1xx]]]] [[応答]]を[[転送]]しなければ[['''なりません''']]。

[1] [[HTTP/1.0]] [[応答]]が [CODE(HTTP)[[[101]]]] [[応答]]だった時に[[クライアント]]がどう処理するべきかは不明です。

[2] [[クライアント]]が理解できない [CODE(HTTP)[[[101]]]] [[応答]]を受信した時にどうしなければならないのかは不明です。

[3] [[サーバー]]は [CODE(HTTP)[[[101]]] [[応答]]の後直ちに[[プロトコル]]を切り替えることになっています。
[[クライアント]]は切り替えが可能かどうか表明する方法がありません (本来[[クライアント]]の指示に[[サーバー]]が応えて切り替えるはずのものですから)。
従って[[クライアント]]が処理できないデータを受け取ることになりますから、
[[持続接続]]の利用の有無に関わらず、[[クライアント]]は直ちに[[HTTP接続]]を閉じ、
受信データがあったとしても捨てるべきと思われます。

[4] [[クライアント]]がその場合に [[fetch]] のような [[API]] でどう処理するべきかも明確ではありません。
[CODE(HTTP)[[[101]]]] [[応答]]を結果として返すかもしれませんし、
[[最後の応答]]ではないのですから、[[ネットワークエラー]]とするべきかもしれません。

;; [104] [CODE(HTTP)@en[[[Upgrade:]]]] の項も参照してください。

[7] [[Chrome]] と [[IE]] は、 [CODE(HTTP)[[[101]]]] も (少なくても [[XHR]] では)
他の [CODE(HTTP)[[[1xx]]]] と同じく無視し、その後に[[最後の要求]]があればそれを結果として採用するようです。
([[XHR]] では[[要求]]に [CODE(HTTP)@en[[[Upgrade:]]]] は指定できないため、
[[応答]]に [CODE(HTTP)@en[[[Upgrade:]]]] が含まれていても、プロトコルの切り替えを表すのではなく、
切り替え可能なプロトコルを示していると解釈するべきと思われます。) [TIME[2015-08-12T03:18:06.100Z]]

[8] [[Firefox]] は、 ([[XHR]] では) [CODE(HTTP)[[[101]]]] [[応答]]を結果として採用するようです。
[TIME[2015-08-12T03:18:43.00Z]]

[9] [[HTTP/2]] [[RFC]] は [CODE(HTTP)[[[101]]]] [[応答]]をどう処理するべきか規定していません。

[10] [[Firefox]] は [[HTTP/2]] [CODE(HTTP)[[[101]]]] を受信したら、
[[ストリームエラー]] [CODE[[[PROTOCOL_ERROR]]]] とします。
[TIME[2015-10-11T09:52:53.000Z]]

* 歴史

[FIG(quote)[
[FIGCAPTION[
RFC 2068・2616 (HTTP/1.1)  10.1.2 101 Switching Protocols
]FIGCAPTION]

> The server understands and is willing to comply with the client's
request, via the Upgrade message header field (section [DEL[14.41]] [INS[14.42]]), for a
change in the application protocol being used on this connection. The
server will switch protocols to those defined by the response's
Upgrade header field immediately after the empty line which
terminates the 101 response.

サーバーは、この接続で使用する応用プロトコルの変更に関して、 
[CODE(HTTP)[[[Upgrade]]]] メッセージ頭欄を通じたクライアントの要求を理解し、
それに従う意思があります。
サーバーは [CODE(HTTP)[101]] 応答の終端である空行の直後に応答の
[CODE(HTTP)[Upgrade]] 頭欄で定義されたプロトコルに切り替えます。

> The protocol [DEL[should only be switched]] [INS[SHOULD be switched only]] when it is advantageous to do
so. For example, switching to a newer version of HTTP is advantageous
over older versions, and switching to a real-time, synchronous protocol [DEL[may]] [INS[might]]
be advantageous when delivering resources that use such features.

プロトコルの切り替えは、そうすることに利点がある場合にのみ行われる'''べきです'''。
例えば、新しい版の HTTP に切り替えることは古い版より有利ですし、
実時刻同期プロトコルに切り替えることはこの機能を使った資源を配送する時には有利です。
]FIG]

* 関連

[105] [CODE(HTTP)[[[100]]]] と [CODE(HTTP)[[[101]]]] の送信順序については、
[CODE(HTTP)@en[[[Upgrade:]]]] を参照してください。

[FIG(quote)[
[FIGCAPTION[
[11] [CITE@en[Docker Remote API v1.19 - Docker]]
([TIME[2016-11-17 10:13:12 +09:00]])
<https://docs.docker.com/engine/reference/api/docker_remote_api_v1.19/>
]FIGCAPTION]

> Example request:
>  GET /containers/4fa6e0f0c678/logs?stderr=1&stdout=1&timestamps=1&follow=1&tail=10&since=1428990821 HTTP/1.1
> Example response:
>  HTTP/1.1 101 UPGRADED
>  Content-Type: application/vnd.docker.raw-stream
>  Connection: Upgrade
>  Upgrade: tcp
>  
>  {{ STREAM }}

]FIG]
