2012-07-02 3 views
4

J'utilise le serveur PHP Websocket par lemmingzshadow (web). Tout a bien fonctionné jusqu'à maintenant.Prise en main de Chrome 20 Websocket

Après la mise à jour au chrome 20, si je veux faire poignée de main avec le serveur se termine par cette erreur

Error during WebSocket handshake: Sec-WebSocket-Protocol mismatch 

en-têtes de chrome 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 

têtes renvoyés:

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

Je pense que le problème est avec l'en-tête "Sec-WebSocket-Extensions: x-webkit-deflate-frame" de Chrome 20.

Une idée pour le faire fonctionner à nouveau?

+0

Il semble avoir un problème avec Chrome 20 Websockets depuis la mise à jour d'hier, principalement sur la plate-forme Windows ... revenir à la version précédente si vous le pouvez, ou Google presque certainement émettre un correctif assez rapidement car il empêche l'accès aux profils itinérants –

+0

J'ai un jeu qui fonctionne sur les websockets, donc rien de tel que "revenir à la version précédente". Si ws client ne peut pas se connecter les utilisateurs ne verront qu'un message d'erreur:/Pour l'instant, je suis retourné à l'implémentation flash https://github.com/gimite/web-socket-js – m4recek

+0

@MarkBaker toute nouvelle information à ce sujet? bug ou une fonctionnalité? merci –

Répondre

14

Le serveur enfreint le protocole WebSocket. Il est probable que Chrome adhère à la norme plus correctement dans la version 20 et que cela révèle un bug dans le serveur.

Le problème est que le serveur renvoie un en-tête "Sec-WebSocket-Protocol" dans la réponse mais cela n'est légal que si le client envoie le même en-tête dans la requête. Si le client n'envoie pas le protocole Sec-WebSocket, le serveur doit omettre l'en-tête dans la réponse.

Voir la/subprotocol/description page 22 Section 4.2.2 of rfc6455

+1

Il semble que vous avez frappé le point :) Je vais le tester plus attentivement demain – m4recek

+1

@kanaka upvote pour 10k :) –

+0

@webarto, heh, merci! – kanaka

3

Une solution rapide pour php-websocket serait:

$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

Un moyen facile de fixer est d'ajouter Sec-WebSocket-Accept informations lorsque do_handshake, le code ci-dessous:

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

où,

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

$ clé est Sec-WebSocket-Key obtenu à partir de $ buffer, vous pouvez print_r ($ buffer) pour voir.

Espérons que cela peut résoudre votre problème ..

+0

d'où vient la valeur 258EAFA5-E914-47DA-95CA-C5AB0DC85B11? – Ash

+1

Je me demande si c'est post fixe, essayez-le. Je ne me souviens pas exactement, comme il y a un an. – navins

Questions connexes