2017-01-05 15 views
0

私は自分のHttpサーバーを構築しています。これは、学校プロジェクトのWebSocketサポートが組み込まれています。Safari Websocketハンドシェイクエラー

私は主にChrome上のすべてをテストしましたが、すべての点で問題はありませんでしたが、Safari(10.0.2)で問題が発生しています。

ハンドシェイクをWebSocket connection to 'ws://192.168.0.213' failed: Status line contains non-ASCII characterに設定すると、開発コンソールにエラーとして表示されますが、Chromeは正常に動作します。ここで

が交換ヘッダ

要求ヘッダー(サファリ=>サーバー)です

GET/HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: 192.168.0.213 
Origin: http://192.168.0.213 
Cookie: session=MDQ5M2UzYTctODg5NC00ZTEwLWJlOWEtYjBiZTRkNzdiYTRj 
Pragma: no-cache 
Cache-Control: no-cache 
Sec-WebSocket-Key: 9/Mj26XS0JxG+Y+lDTvMcQ== 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Extensions: x-webkit-deflate-frame 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0.2 Safari/602.3.12 

レスポンスヘッダー(サーバー=>サファリ)

HTTP/1.1 101 Switching Protocols 
Connection:Upgrade 
Upgrade:websocket 
Sec-WebSocket-Accept:rpx9CefKAgOdM7RzjhLuWEcCIso= 

生のレスポンスヘッダー

[72][84][84][80][47][49][46][49][32][49] 
[48][49][32][83][119][105][116][99][104][105] 
[110][103][32][80][114][111][116][111][99][111] 
[108][115][13][10][67][111][110][110][101][99] 
[116][105][111][110][58][85][112][103][114][97] 
[100][101][13][10][85][112][103][114][97][100] 
[101][58][87][101][98][115][111][99][107][101] 
[116][13][10][83][101][99][45][87][101][98] 
[83][111][99][107][101][116][45][65][99][99] 
[101][112][116][58][53][120][86][118][113][57] 
[52][121][97][53][84][56][51][88][65][82] 
[115][78][119][74][69][88][97][78][97][108] 
[99][61][13][10][13][10] 
そこにヘッダのエンコーディングの問題でなければならないが、このヘッダはASCIIとしてエンコードされますとオペコードは0x1(テキストで送信することを、私は理解して(C#の)

string handshakeString = $"HTTP/1.1 {(int)StatusCode.SwitchingProtocols} {StatusCode.SwitchingProtocols.GetStatusMessage()}" + Environment.NewLine 
               + "Connection:Upgrade" + Environment.NewLine 
               + "Upgrade:Websocket" + Environment.NewLine 
               + "Sec-WebSocket-Accept:" + Convert.ToBase64String($"{_initHeader["Sec-WebSocket-Key"]}258EAFA5-E914-47DA-95CA-C5AB0DC85B11".Sha1()) + Environment.NewLine 
               + Environment.NewLine; 
byte[] handshake = Encoding.ASCII.GetBytes(handshakeString); // <- There is the ASCII part 
await SendFrameData(OpCode.Text, handshake); // This frame neither gets fragmented or masked 

生成beengされる方法

)をクライアントに送信し、Chromeで作業しています。ヘッダーキー/値が不足していますか?

おかげで、私自身の質問に答える デビッド

+0

明らかに、すべてのASCIIではありません。そうでない場合、Safariはそれについて不平を言いません。あなたのサーバーコードはどのように見えますか?実際の生のバイトはどのように見えますか? –

+0

@RemyLebeau私はちょうどサーバーコードと生のバイトのいくつかを追加しました。 –

+0

'SendFrameData()は実際に何をしていますか?この通信段階では、プロトコルはWebSocketではなくHTTPです。したがって、 'SendFrameData(OpCode.Text、handshake)'が 'handshake' *そのままの状態ではなく、WebSocketフレーム内にラップしている場合、通信を破損しています。 * HTTP * 101レスポンスが送信されるまで* WebSocketフレームを送信することはできません。 –

答えて

0

。ありがとうレミールボー!

ハンドシェイクはWebsocketフレームでラップされました。これはRFC 5455に違反します。したがって、ハンドシェイクはソケットを介して直接送信する必要があります。

関連する問題