0

Safari 6 と websockets を使用しています。サーバーがブラウザから次のハンドシェイクを受信して​​います。

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: nomad.local:1299
Origin: file://
Sec-WebSocket-Key: WhZTuybN4i2ZshDBxco42w==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

プロトコルは含まれていません。私のサーバーはそれを処理できますが、ブラウザ クライアントとのハンドシェイクを完了しようとすると、次のメッセージが表示されます: WebSocket ハンドシェイク中のエラー: Sec-WebSocket-Protocol の不一致

サーバーに送信されたメッセージに、クライアントへのハンドシェイクで返す必要がある暗黙のプロトコルはありますか?

これは、最新のSafariにアップグレードする前に機能しました

4

2 に答える 2

1

クライアントがハンドシェイクでサブプロトコル (Sec-WebSocket-Protocol) を送信しない場合、サーバーはサブプロトコル ヘッダー (Sec-WebSocket-Protocol) を返信してはなりません。クライアントにサブプロトコル ヘッダーが含まれていなくても、サーバーが共通のデフォルトの "Sec-WebSocket-Protocol: chat" を返信する場合、クライアントは接続を拒否する必要があります。一部のブラウザはこれについてずさんで、最近、コンプライアンスを強化し始めています.

クライアントがサブプロトコル リストを送信する場合、サーバーはサポートする単一のサブプロトコルを選択し、これを選択したサブプロトコルとしてクライアントに送り返す必要があります。

于 2012-08-21T21:28:29.870 に答える
0

プロトコルは WebSocket です ;-) Sec-WebSocket-Protocol の詳細については、RFC を参照してください: http://datatracker.ietf.org/doc/rfc6455/?include_text=1

クライアントからのハンドシェイクは次のようになります。

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: http://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

サーバーからのハンドシェイクは次のようになります。

    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
    Sec-WebSocket-Protocol: chat

Safari 6 の実装が異なるかどうかはわかりませんが、RFC からのプロトコルは通常悪夢です...標準が暗示されている可能性がありますか?

于 2012-08-21T20:55:42.247 に答える