[2] [DFN[[CODE(HTTP)[[[426]]]]]] ([DFN[[[Upgrade Required]]]])
は、[[プロトコル]]の切り替えが必要なことを表す[[状態符号]]です。

* 仕様書

[REFS[
- [428] '''[CITE@en[RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content]] ([TIME[2014-08-07 05:54:02 +09:00]] 版) <https://tools.ietf.org/html/rfc7231#section-6.5.15>'''
- [4] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#page-58>
- [9] [CITE@en[RFC 6455 - The WebSocket Protocol]] ([TIME[2015-03-11 20:42:50 +09:00]] 版) <http://tools.ietf.org/html/rfc6455#section-4.2.2>
]REFS]

* 意味

[429] [CODE(HTTP)[[[426]]]] は、[[鯖]]が[[要求]]を現在のプロトコルで処理することは拒みつつ、
他のプロトコルに切り替えた後なら処理する意志があることを示します [SRC[>>428]]。

* 構文

[5] [[鯖]]は [CODE(HTTP)[[[426]]]] [[応答]]に [CODE(HTTP)@en[[[Upgrade:]]]]
[[ヘッダー]]を含めて[[プロトコル]](群)を指定しなければ[['''なりません''']] [SRC[>>4, >>428]]。

[10] [[WebSocket接続の確立]]時に[[要求]]で [CODE[[[Sec-WebSocket-Version:]] [[13]]]] 
以外が指定された場合には、 [CODE(HTTP)[[[426]]]] [[応答]]の
[CODE(HTTP)@en[[[Sec-WebSocket-Version:]]]]
[[ヘッダー]]に対応する版(群)を指定しなければ[['''なりません''']] [SRC[>>9]]。

* 歴史

[REFS[
- [3] [CITE@en[draft-ietf-tip-usehttp-01 - Using the Transaction Internet Protocol (TIP) with HTTP]]
( ([TIME[1998-01-30]] 版))
<http://tools.ietf.org/html/draft-ietf-tip-usehttp-01#page-4>
]REFS]

[427] >>3 は [CODE(HTTP)[[[426]]]] 「Abort」を提案していましたが、支持を集められなかったようです。

[6] 現在の [CODE(HTTP)[[[426]]]] は、 [[RFC 2817]]
([CODE(HTTP)@en[[[Upgrade:]] [[TLS/1.0]]]]) により導入されました。

[REFS[
- [1] [CITE@en[RFC 2817 - Upgrading to TLS Within HTTP/1.1]] ([TIME[2012-01-09 20:05:09 +09:00]] 版) <http://tools.ietf.org/html/rfc2817#section-4.2>
- [8] [CITE@en[RFC 2817 - Upgrading to TLS Within HTTP/1.1]] ([TIME[2015-02-22 14:29:05 +09:00]] 版) <http://tools.ietf.org/html/rfc2817#section-6>
]REFS]

[7] その後 [[RFC 7231]] により [[RFC 2817]] が[[更新]]され、本[[状態符号]]の規定は改訂されました。

* 関連

[430] [[プロトコル]]の切り替えに使う [CODE(HTTP)[[[101]]]] とは違って、
[CODE(HTTP)[[[426]]]] は切り替えが必要なことを表しているだけです。
[CODE(HTTP)[[[426]]]] は元々の[[要求]]の処理も、プロトコルの切り替えも、どちらも行っていません。

* 実利用例



[14] [TIME[2020-09-09T06:02:48.00Z]]

[PRE(code)[
$ telnet trello.com 80
Trying 18.136.214.18...
Connected to trello.com.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 426 Upgrade Required
date: Wed, 09 Sep 2020 06:02:08 GMT
server: envoy
connection: close
content-length: 0

Connection closed by foreign host.
]PRE]

;; [16] [CODE[Upgrade:]] が指定されていないので違反。

[PRE(code)[
$ telnet trello.com 80
Trying 18.136.214.19...
Connected to trello.com.
Escape character is '^]'.
GET /

HTTP/1.1 426 Upgrade Required
date: Wed, 09 Sep 2020 06:03:15 GMT
server: envoy
connection: close
content-length: 0

Connection closed by foreign host.
]PRE]

;; [15] 本来 [CODE[GET /]] [[改行]]、
で[[HTTP/0.9応答]]を返さないといけないが、
[[改行]]が2回ないと[[応答]]が返ってこなかった。

[17] 
[TIME[2026-01-02T09:46:47.000Z]] <https://www.samba.org/>

>
[PRE[
GET / HTTP/1.1\x0D
Host: www.samba.org\x0D
Connection: keep-alive\x0D
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0\x0D
Accept: */*\x0D
Accept-Language: en-US\x0D
\x0D
HTTP/1.1 426 Upgrade Required
upgrade: HTTP/2
connection: upgrade
content-length: 16
content-type: text/plain
alt-svc: h3=":443"; ma=999999; persistent=1

Upgrade Required
]PRE]

[18] >>17 のサーバーはすごく厳しくて、 [CODE[User-Agent:]] が古めの
[[Webブラウザー]]のときは [CODE[403]],
[[プロトコルの版]]が [[HTTP/1.0]] だと [CODE[403]]
になります。

* メモ

[11] [CITE@en[HTTP 1.1 426 Upgrade Required]]
([TIME[2020-09-09T06:02:22.000Z]])
<https://community.atlassian.com/t5/Trello-discussions/HTTP-1-1-426-Upgrade-Required/td-p/1461934>

[12] [CITE[2020年8月末頃から Trello API 経由のデータ取得が失敗する | Qrunch(クランチ)]]
([TIME[2020-09-09T06:02:27.000Z]])
<https://qrunch.net/@armband/entries/opOrB1EoTmxEayqj?ref=qrunch>
