これらの値は、単一のモードの競合する表記ではありません。

Connection: Upgrade
Connection: keep-alive, Upgrade

二つ目は二つの接続オプションを列挙しています。HTTP は Connection をカンマ区切りのリストとして定義し、オプション名は大文字小文字を区別しません。値全体を正確な文字列 Upgrade と比較するコードは、そのオプションを含む有効なリストを見逃します。

通常の転送では、HTTP 仲介者は受信したフィールドを解析し、そのオプションが名指しするフィールドを削除したうえで、Connection 自体を削除するか、後続の接続に対する仲介者自身の制御オプションに置き換えます。

ハードコードされた Keep-Alive フィールドだけを削除しても不十分です。メッセージはリスト内で別の接続固有のフィールドを名指しでき、そのフィールドは通常の転送に漏れてはなりません。

プロトコルアップグレードを支えるには、二つの接続と新しいプロトコルを意図的に扱う必要があります。受信した Upgrade ヘッダーを盲目的にコピーすることは、その受け渡しの実装ではありません。

一方のブラウザーが動作し他方が失敗するときは、仲介者の両側で実際のフィールド値を比較してください。単一のトークンと二トークンのリストの違いは、ブラウザーに別のブラウザーの正確な書式を模倣させることなく、パーサーの誤りを明らかにできます。

これはプロキシが解析する HTTP メッセージに関するものです。通常の HTTPS CONNECT トンネルは、暗号化されたウェブサイトの Connection フィールドをそのプロキシに露出しません。

関連記事