HTTP Status 426 Upgrade Requiredについて調べた
プロトコル古いからアップデートしろって話らしい
前職で新規アプリのバックエンドを作っていて、各種ステータスコードを定義している時に新卒くんから「アプリ強制アップデートのステータスコードはxxxなんですか?426 Upgrade Requiredってあるんですけど」ってレビューうけて「これはプロトコルとかに使われるやつでアプリのアップデートはあんまり適切ではないかも」と返したけどそもそも426って実環境で見たことないorあんまり見たことかも~ってことを思い出しので調べたのをメモ。
てか、日本語で書かれてるのまったくない。
426の仕様
我らがMDN Web Docでの該当ページ
426 Upgrade Required - HTTP | MDN
んでRFC
RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content| section-6.5.15
The 426 (Upgrade Required) status code indicates that the server refuses to perform the request using the current protocol but might be willing to do so after the client upgrades to a different protocol. The server MUST send an Upgrade header field in a 426 response to indicate the required protocol(s) (Section 6.7 of [RFC7230]).
つまりはサーバーが受けたプロトコルに対して"拒否"を行うが、別のプロトコルなら実行可能"かも"という意思表示的なことをするステータスコードらしい。
で、その別のプロトコルはUpgradeヘッダーフィールドで返答するとのこと。
UpgradeヘッダーについてのRFCはこちら
RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing| section-6.7
Upgradeヘッダーはプロトコルのリストを記載して切り替えを促すためにあるっぽい。
101 Switching Protocolsでは切り替え先のプロトコルはUpgradeヘッダーに記載しないと駄目ですよって書いてある
具体的に、HTTP/1.1でリクエストされたがHTTP/2もしくはwebsocketを提示したい場合はこのようになる
HTTP/1.1 426 Upgrade Required
Content-Type: text/plain
Connection: close
Upgrade: h2c, websocket
HTTP/2以降では非推奨らしいが?
調べてると"426はHTTP/2以降は非推奨です!"というのを見かけるがRFCを調べてもそのあたりを言及している文章は無い。
んで、"非推奨"とよばれている根拠になっているのはHTTP/2の仕様上プロトコルのアップグレードにUpgradeヘッダーを使用しないため実質的に426を使っても切り替え先のプロトコルを提示できないため不適切という意味合いらしい。
それに関連して101 Switching Protocolsも不適切という流れになる。
"非推奨"ではないがUpgradeヘッダーを使えない以上"適切ではない"という結論。
じゃぁ今はどうやってプロトコルを変更してるん?
なうでヤングなHTTP/2はALPN(Application-Layer Protocol Negotiation)で使用するプロトコルを決定している。
簡単にいうとTLSハンドシェイクのClientHelloで利用可能なプロトコルを送信、ServerHelloで利用するプロトコルを返信する。
いちいちHTTP通信確立したあとじゃなくてする前にっていうのはそれはそうね~
アプリの強制アップデートのプロトコルとして適切か
結論として、HTTP 426は「プロトコルの切り替え」を目的としたステータスコードであり、アプリのアップデートを促す用途には適してはないかなと。
アプリの強制アップデートには専用のAPIレスポンスや別の設計パターンを考える必要があると思います。