2012-07-02 5 views
4

저는 lemmingzshadow (web)의 PHP Websocket 서버를 사용하고 있습니다. 모든 것이 이제까지 잘 작동했습니다.크롬 20 웹 소켓 핸드 셰이크

내가 서버와 핸드 셰이크를 수행하려는 경우 업데이트가 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에서 문제가되는 것은 "Sec-WebSocket-Extensions : x-webkit-deflate-frame"헤더입니다.

다시 작동시키는 방법을 알려주세요.

+0

... 주로 Windows 플랫폼에서, 어제의 업그레이드 이후 크롬 20 WebSocket을에 문제가 당신이 할 수있는 경우 이전 버전으로 되돌릴가 나타나거나 구글은 거의 것입니다 분명히 꽤 빨리 패치를 발행 할 것입니다. 왜냐하면 액세스 샵 로밍 프로파일을 막기 때문입니다. –

+0

나는 웹 소켓에서 실행되는 게임을 가지고 있기 때문에 "previus 버전으로 되돌리기"와 같은 것이 아닙니다. 클라이언트가 연결할 수없는 경우 오류 메시지 만 표시됩니다./지금은 플래시 구현으로 돌아갑니다. https://github.com/gimite/web-socket-js – m4recek

+0

@MarkBaker 여기에 대한 새로운 정보가 있습니까? 버그 또는 기능? 감사합니다 –

답변

14

서버가 WebSocket 프로토콜을 위반합니다. Chrome이 버전 20에서 표준을보다 정확하게 준수하고 있으며 서버의 버그를 드러내고있는 것 같습니다.

문제는 서버가 응답에 "Sec-WebSocket-Protocol"헤더를 보내고 있지만 클라이언트가 요청에서 동일한 헤더를 보내는 경우에만 유효하다는 것입니다. 클라이언트가 Sec-WebSocket-Protocol을 전송하지 않으면 서버는 응답의 헤더를 생략해야합니다.

Section 4.2.2 of rfc6455

+1

당신이 요점을 맞은 것 같습니다 :) 내가 자세히 신중하게 테스트합니다 tomorow – m4recek

+1

@ kanaka 10k에 대한 upvote :) –

+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));

$ 키는 $ buffer에서 가져온 것이므로 Sec-WebSocket-Key은 $ print_r ($ buffer)로 볼 수 있습니다. 이 문제를 해결할 수

희망은 ..

+0

258EAFA5-E914-47DA-95CA-C5AB0DC85B11 값의 출처는 어디입니까? – Ash

+1

게시물이 고정되어 있는지 궁금합니다. 시도해보십시오. 1 년 전과 마찬가지로 정확하게 기억하지 않습니다. – navins