2012-07-02 120 views
4

我使用lemmingzshadow使用PHP Websocket服務器(web)。一切都很好,直到現在。Chrome 20 websocket握手

Chrome更新20後,如果我想做握手服務器時,它與此錯誤結束從鉻

Error during WebSocket handshake: Sec-WebSocket-Protocol mismatch 

頁眉20個

GET /demo HTTP/1.1 
Upgrade: websocket 
Connection: Upgrade 
Host: gomokulive.eu:8001 
Origin: http://www.gomokulive.eu 
Sec-WebSocket-Key: s+AMQQu4Q10xH2AKy49byg== 
Sec-WebSocket-Version: 13 
Sec-WebSocket-Extensions: x-webkit-deflate-frame 

頁眉送回:

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: dMCVYKkF5VRrIouWFW7EYdvfD28= 
Sec-WebSocket-Protocol: demo 

我認爲問題來自Chrome 20的「Sec-WebSocket-Extensions:x-webkit-deflate-frame」頭。

任何想法如何讓它再次工作?

+0

那裏看來是因爲昨天的升級使用Chrome 20的WebSockets的問題,主要是在Windows平臺上......如果你能恢復到以前的版本,或谷歌將幾乎肯定會很快發佈一個補丁,因爲它可以防止訪問sto漫遊配置文件 –

+0

我有在websockets上運行的遊戲,所以它不像是「恢復到previus版本」。如果ws客戶端無法連接用戶,只會看到錯誤消息:/現在我回到flash實現https://github.com/gimite/web-socket-js – m4recek

+0

@MarkBaker關於此的任何新信息?錯誤或功能?謝謝 –

回答

14

服務器違反了WebSocket協議。 Chrome很可能在版本20中更加正確地遵守該標準,並且揭示了服務器中的錯誤。

問題是服務器在響應中發回了「Sec-WebSocket-Protocol」頭,但這隻有在客戶端在請求中發送相同頭時才合法。如果客戶端沒有發送Sec-WebSocket協議,那麼服務器應該在響應中省略標題。

Section 4.2.2 of rfc6455

+1

這似乎就像你點擊:)我會更仔細地測試它明天 – m4recek

+1

@kanaka upvote for 10k :) –

+0

@webarto,嘿,謝謝! – kanaka

3

的/子協議/ 22頁的說明文的快速修復php-websocket將是:

$response.= "Sec-WebSocket-Accept: " . $secAccept . "\r\n"; 
if (isset($headers['Sec-WebSocket-Protocol'])) 
{ 
    $response.= "Sec-WebSocket-Protocol: " . substr($path, 1) . "\r\n"; 
} 
$response .= "\r\n"; 
1

一種簡單的方法來解決的就是添加Sec-WebSocket-Accept信息時do_handshake,如下面的代碼:

list($resource,$host,$origin,$key) = $this->getheaders($buffer); 

    $accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true)); 

    $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . 
      "Upgrade: WebSocket\r\n" . 
      "Connection: Upgrade\r\n" . 
      "WebSocket-Origin: {$origin}\r\n" . 
      "WebSocket-Location: ws://{$host}{$resource}\r\n". 
      "Sec-WebSocket-Accept: " . $accept . "\r\n\r\n"; 
    $this->handshakes[$socket_index] = true; 

    socket_write($socket,$upgrade,strlen($upgrade)); 

其中,

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

$ key是Sec-WebSocket-Key從$ buffer獲得,可以通過print_r($ buffer)來查看。

希望這能解決你的問題..

+0

258EAFA5-E914-47DA-95CA-C5AB0DC85B11的值來自哪裏? – Ash

+1

我不知道它是固定的帖子,試試吧。我不完全記得,因爲它是在一年前。 – navins