【HTTPステータスコード徹底解説】426「Upgrade Required」の意味と原因をわかりやすく解説!

2024-06-19

HTTP ステータスコード 426 "Upgrade Required" は、クライアントが送信したリクエストを、現在のプロトコルで処理できないことをサーバーが伝える際に使用されます。この場合、サーバーはクライアントに対して、別のプロトコルへのアップグレードを要求します。

発生原因

426 エラーが発生する主な原因は以下の2つです。

  1. プロトコルの非互換性: クライアントとサーバーが使用しているHTTPプロトコルのバージョンが互換性がない場合。例えば、クライアントがHTTP/1.1でリクエストを送信し、サーバーがHTTP/2でのみ対応している場合などが該当します。
  2. 必要なプロトコル拡張の欠如: リクエストされたリソースへのアクセスには、特定のHTTPプロトコル拡張が必要な場合がある。例えば、サーバーがTLS 1.3でのみHTTPSリクエストを受け付ける場合、クライアントが古いTLSバージョンを使用していると426エラーが発生します。

426 レスポンスには、Upgrade ヘッダーフィールドが含まれます。このヘッダーフィールドには、サーバーが要求するプロトコルと、そのプロトコルのパラメータが記載されます。クライアントは、この情報に基づいてプロトコルをアップグレードし、再度リクエストを送信する必要があります。

以下の例は、426 Upgrade Required レスポンスを示しています。

HTTP/1.1 426 Upgrade Required
Connection: close
Upgrade: TLS/1.3

この例では、サーバーはクライアントに対してTLS 1.3へのアップグレードを要求しています。

問題解決

426 エラーを解決するには、以下のいずれかの方法を試す必要があります。

  • クライアント側でプロトコルをアップグレードする: クライアントソフトウェアの設定を確認し、最新バージョンにアップデートします。
  • 必要なプロトコル拡張を有効にする: クライアントソフトウェアの設定で、必要なプロトコル拡張が有効になっていることを確認します。
  • サーバー側で設定を変更する: サーバーの設定を変更し、古いプロトコルもサポートできるようにする。ただし、これはセキュリティ上のリスクを伴うため、推奨されない方法です。


    HTTP ステータスコード426「Upgrade Required」のサンプルコード

    426 レスポンス

    from http.server import BaseHTTPRequestHandler, HTTPServer
    
    class UpgradeRequestHandler(BaseHTTPRequestHandler):
        def do_GET(self):
            self.send_response(426)
            self.send_header('Upgrade', 'TLS/1.3')
            self.end_headers()
            self.wfile.write(b'')
    
    if __name__ == '__main__':
        server = HTTPServer(('localhost', 8080), UpgradeRequestHandler)
        try:
            server.serve_forever()
        except KeyboardInterrupt:
            server.shutdown()
            print('Server stopped.')
    

    このコードを実行すると、localhost:8080 に対するGETリクエストに対して、426 Upgrade Required レスポンスが返されます。

    クライアントコード

    import requests
    
    url = 'http://localhost:8080'
    
    try:
        response = requests.get(url)
    except requests.exceptions.HTTPError as e:
        if e.status_code == 426:
            print('Upgrade Required:', e.headers['Upgrade'])
        else:
            print('Error:', e.status_code)
    else:
        print('Success:', response.status_code)
    

    注:

    • 上記のコードはあくまで例であり、実際の状況に合わせて変更する必要があります。
    • 426 エラーを処理する際には、適切なエラーハンドリングを実装することが重要です。


    HTTP ステータスコード 426 "Upgrade Required" の代替手段

    しかし、状況によっては、426 エラーを回避する代替手段が存在する場合があります。以下に、いくつかの代替手段とその適用例を紹介します。

    代替手段 1: 代替プロトコルの使用

    場合によっては、サーバーがサポートする代替プロトコルを使用してリクエストを送信することで、426 エラーを回避できる場合があります。例えば、サーバーが HTTP/2 をサポートしている場合は、クライアントは HTTP/1.1 ではなく HTTP/2 でリクエストを送信することを試みることができます。

    例:

    クライアントが HTTP/1.1 でリクエストを送信し、サーバーが 426 Upgrade Required レスポンスを返す場合、クライアントは以下のコードを使用して HTTP/2 でリクエストを再送信することができます。

    import requests
    
    url = 'https://example.com'
    
    try:
        response = requests.get(url, request_headers={'Upgrade': 'HTTP/2.0'})
    except requests.exceptions.HTTPError as e:
        if e.status_code == 426:
            print('Upgrade Required:', e.headers['Upgrade'])
        else:
            print('Error:', e.status_code)
    else:
        print('Success:', response.status_code)
    

    代替手段 2: クライアント側プロトコルのダウングレード

    サーバーが古いプロトコルしかサポートしていない場合は、クライアント側でプロトコルをダウングレードすることで、426 エラーを回避できる場合があります。ただし、これはセキュリティ上のリスクを伴う可能性があるため、最後の手段としてのみ検討すべきです。

    代替手段 3: コンテンツネゴシエーションの使用

    クライアントが Content-Accept ヘッダーを使用して、受容可能なコンテンツタイプをサーバーに伝えることができる場合、サーバーはクライアントが処理できる形式でコンテンツを提供できる可能性があります。これにより、426 エラーを回避できる場合があります。

    クライアントが Accept: application/json ヘッダーを使用して JSON 形式のコンテンツを要求し、サーバーが XML 形式のコンテンツしか提供できない場合、サーバーは 406 Not Acceptable レスポンスを返す代わりに、JSON 形式に変換してからコンテンツを提供することができます。

    代替手段 4: エラーハンドリングの適切な実装

    426 エラーが発生した場合、クライアントアプリケーションは適切なエラーハンドリングを実装する必要があります。これにより、ユーザーに何が起こっているのかを明確に伝え、問題を解決するための措置を講

    注意事項

    上記に記載されている代替手段は、あくまでも一般的な指針であり、すべての状況に適用できるわけではありません。具体的な状況に応じて、適切な代替手段を選択する必要があります。また、代替手段を使用する前に、その影響と潜在的なリスクを慎重に評価することが重要です。