Sujet : Handshake Websocket

Coucou !

Oui, c'est encore moi, encore à propos des WebSocket. Chez moi la connexion est très aléatoire tout de même (souvent, ça ne marche pas en fait). Je soupçonne le handshake (bizarrement).

Voici les pistes que j'ai (pas encore testées, ce sont des pistes) :
- 3 \r\n au lieu de 2 avant la $response
- Inclusion du protocole quand il existe (genre "WebSocket-Protocol: sample" par exemple)
- Vérifier qu'il n'y ai pas de caractère NUL \0 (ou \255 ?) dans la réponse (problème avec le protocole HTTP)

D'autre part, tu m'avais dit que le protocole changeait (à cause de la faille de sécurité). Qu'en est-il de l'avancement : ils sont enfin décidés pour autre chose ?

Merci, @+

2

Re : Handshake Websocket

Hey smile,

Ça veut dire quoi aléatoire ? Tu testes sur quoi ? La dernière version sur le trunk fonctionne très bien. En ce moment, chat.hoa-project.net est arrêté suite à une migration des serveurs et des services sur IPv6 mais ce sera bientôt réparé. Mais Hoa\Websocket n'est pas à mettre en cause, seulement les services du serveur.

Concernant l'avancement, on avait hybi-00 avant et hybi-06+ (de 06 à 09 en ce moment) maintenant. Firefox l'utilise déjà car le draft est quasiment complet. Hoa\Websocket supporte les deux : il est capable de recevoir et émettre des requêtes depuis ou vers n'importe quelle version du protocole. Flash va rester sur hybi-00, mais les navigateurs modernes sont ou vont tous passer vers hybi-06+ (je ne connais pas les différences entre 6, 7, 8 et 9 mais je pense que ce n'est que la « forme » de la spéc' et pas le fond, sauf quelques petites subtilités à droite et à gauche mais rien d'important).
Il y a deux endroits où suivre l'avancement : bugzilla.mozilla.org et w3.org/Bugs/Public/. Côté W3C, ça ne bouge plus beaucoup, pratiquement plus pour tout dire . Côté Mozilla, maintenant que l'implém' est dans Firefox 5, plus beaucoup d'activité.

Ah oui, par contre, comme l'API (pas la spéc' hein, l'API seulement), n'est pas terminée, Mozilla a décidé de préfixer l'objet WebSocket pour MozWebSocket pour Firefox6 (voir le bug #659324).

Si tu veux le code source du chat, voir ici : hg.hoa-project.net/Chat.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

3

Re : Handshake Websocket

Je teste sur un serveur à moi (plus ou moins copié sur Hoa) et soit Opera, soit Chrome soit Firefox 4. Souvent, je dois essayer plusieurs fois avant de me connecter avec succès. Je fais plus de tests ce soir et je t'en dis plus. wink

Merci beaucoup pour ce point en tout cas !

4

Re : Handshake Websocket

$ hg clone http://hg.hoa-project.net/Chat .
$ sed -i '' -e 's/chat\.hoa-project\.net/localhost/g' *.*
$ php Server.php&
$ firefox index.html

Amuse-toi avec plusieurs onglets ou plusieurs navigateurs.

Si tu as des erreurs, dis moi d'où elles viennent. Je sais que le paquetage Hoa\Http pu pas mal, je l'ai fait vite fait mais je vais le refaire je pense.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

5

Re : Handshake Websocket

Yeay.

Alors ça marche à 100% avec Firefox.
Et ça fail à pas mal de % avec Chrome et Opera.

Tu as de la chance, j'ai enquêté pour toi !

Chrome et Opera balancent des clé plus longues, ou avec plus de chiffres.

Du coup ça fail ici :

        $keynumb1  = (int) preg_replace('#[^0-9]#', '', $key1);
        $keynumb2  = (int) preg_replace('#[^0-9]#', '', $key2);

Un clé (voire même les deux) vaut alors "2147483647", ce qui correspond à mon PHP_INT_MAX (PHP 5.3.5 Windows).

Du coup le challenge n'est pas validé... Logique !

Dernière fois dit par Savageman (15 Jun. 2011 22:17)

6

Re : Handshake Websocket

Patch qui fonctionne chez moi :

        $key3      = $x[count($x) - 1];
        $keynumb1  = preg_replace('#[^0-9]#', '', $key1);
        $keynumb2  = preg_replace('#[^0-9]#', '', $key2);

        $spaces1   = substr_count($key1, ' ');
        $spaces2   = substr_count($key2, ' ');

        $part1     = pack('N', bcdiv($keynumb1, $spaces1, 0));
        $part2     = pack('N', bcdiv($keynumb2, $spaces2, 0));

On enlève les cast en (int) et on divise avec quelque chose qui sait gérer les grands nombres (et en plus dispo de base en PHP sans rien installer, classe !).

7

Re : Handshake Websocket

Il faut quand même compilé PHP avec --enable-bcmath, et cette option n'est pas activée par défaut hmm.
Du coup, si on convertit en float (double pour PHP au sens C), qu'on divise puis qu'on cast, ça pourrait résoudre le problème tu penses ? Un truc du genre :

        $keynumb1  = (float) preg_replace('#[^0-9]#', '', $key1);
        $keynumb2  = (float) preg_replace('#[^0-9]#', '', $key2);

        $spaces1   = substr_count($key1, ' ');
        $spaces2   = substr_count($key2, ' ');

        $part1     = pack('N', (int) ($keynumb1 / $spaces1));
        $part2     = pack('N', (int) ($keynumb2 / $spaces2));

Tu peux tester ça pour moi ? Si ça ne fonctionne pas, alors enlève le cast (int) et regarde ce que ça donne.

Merci pour avoir fouillé, j'apprécié beaucoup ! J'avoue que quand j'ai testé (au moins 100 fois) avec Chrome et Opera je n'ai jamais rencontré le problème. Un beau hasard ? Tu as testé sur quelle version ?

Ton patch serait intéressant non pas sur Opéra et Chrome qui vont migrer vers la hybi-06+ mais pour Flash (qui peut-être a le même comportement).

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

8

Re : Handshake Websocket

Ça marche à 100% (du moins sur les dizaines d'essais que j'ai fait).

La division renvoie parfois du nombre négatif, parfois même à virgule (même avec le cast en INT yikes ) mais ça ne pose ni problème à Chrome ni à Opera.

J'ai Chrome 13 et Opera 11.50 beta.

Dernière fois dit par Savageman (16 Jun. 2011 07:42)

9

Re : Handshake Websocket

Ok chouette !
Juste pour information, tu es en 32 ou 64bits ? Ça pourrait expliquer que je n'ai pas rencontré le problème (parce qu'en 64bits, PHP_INT_MAX = 9223372036854775807).

Voici le changeset #1764 smile. Va me falloir ton autorisation pour t'ajouter à la liste des contributeurs officiels du coup ;-). Ou simplement t'ajouter dans le message du commit, comme tu préfères.

« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

10

Re : Handshake Websocket

Mon PC est 64 bits, mais mon install de Apache/PHP doit être en 32 je pense.

Pas de souci pour l'ajout aux contributeurs. wink