Websocket, Handshake et jeux de caractères

Résolu
209_Jack Messages postés 4 Date d'inscription vendredi 20 août 2004 Statut Membre Dernière intervention 24 juin 2011 - 5 avril 2011 à 15:28
shadow578 Messages postés 102 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 27 juin 2011 - 27 juin 2011 à 09:57
Bonjour,

J'essaie de faire dialoguer un site web avec un serveur sous Delphi au moyen des websockets (nouvelles API d'HTML5). Le protocole de communication démarre en envoyant un Handshake à la connexion des sockets. Le client (web) envoie donc son message formaté au serveur (delphi) qui doit le retravailler pour envoyer une réponse acceptable par le client.

J'ai préparé un morceau de code qui récupère le handshake client et qui retravaille les 3 éléments de clé pour créer la clé à renvoyer. Quand j'utilise les données du document détaillant le protocole j'obtiens le résultat attendu, en revanche quand j'essaie de me connecter par web, mon handshake de retour n'est pas bon...

je pense que mon problème vient de la réception coté serveur :

voici un extrait du handshake d'exemple

Sec-WebSocket-Key1: 18x 6]8vM;54 *(5: { U1]8 z [ 8 (cle1)
Sec-WebSocket-Key2: 1_ tx7X d < nw 334J702) 7]o}` 0 (cle2)

Tm[K T2u (cle3)


j'ai un problème avec clé3

le protocole précise que les 8 derniers bytes du message contiennent la dernière partie de la clé (donc 8 caractères sur 8 bytes), il précise aussi que dans cette exemple clé3 est affiché tel qu'il serait interprété en utf-8 : Tm[K T2u

Quand je reçois le handshake j'ai bien les premières lignes comme il faut mais pour la dernière (cle3) je reçois ce genre de caractères par exemple "gâŽî±&ø" et quand j'utilise cle1 2 et 3 pour générer ma somme md5 je n'obtiens jamais la réponse attendue par le client.

Je pense donc que le problème vient du fait que je reçoit cle3 comme une série de caractères illisible et qu'il faudrait que ca soit plutot des caractères interprété en utf-8. j'ai bien essayé plusieurs méthode de conversion mais je n'obtiens rien de satisfaisant.

Pour information j'utilise Delphi6 et comme socket sur mon serveur une TTCPBlockSocket et mon buffer de réception est un array of char.

Voici donc les questions pour lesquelles je sollicite votre aide :
- quel est le jeux de caractère dans lequel je reçois mes données? est ce de l'ansi par defaut?
- faut il que j'essaie de recevoir cle3 en utf8? mais dans ce cas un caractère utf-8 n'est il pas codé sur 2 bytes? je n'en obtiendrai pas 8 alors?
- est ce que la série de caractère que je reçois doit être reconvertie pour être plus lisible ?

je pense vraiment que le problème vient de là car quand j'utilise cle 1 2 et 3 codées en dur j'obtiens bien le bon md5, peut etre que le problème vient d'ailleurs mais dans ce cas je ne vois absolument pas d'où...

Si jamais l'explication n'est pas assez claire n'hésitez à me demander d'autres précisions.

Merci d'avance pour votre aide

7 réponses

209_Jack Messages postés 4 Date d'inscription vendredi 20 août 2004 Statut Membre Dernière intervention 24 juin 2011
14 avril 2011 à 15:07
J'ai finalement trouvé la réponse, il n'y avait aucun problème de md5 mais simplement je formais ma réponse comme ceci


rep := 'HTTP/1.1 101 WebSocket Protocol Handshake'+#13#10+
'Upgrade: WebSocket'+#13#10+
'Connection: Upgrade'+#13#10+
'Sec-WebSocket-Location: ws://'+host+#13#10+
'Sec-WebSocket-Origin: '+origin+#13#10+
#13#10#13#10+md5rep;


Ce qui fait au final 3 #13#10 au lieu de 2 avant la réponse md5... Maintenant mon serveur se connecte correctement.
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
5 avril 2011 à 23:18
Solution 1. Delphi antérieur à D2007 ne supporte pas l'UTF8 par défaut, et il faut plus ou moins le forcer en utilisant les fonctions UTF8Encode et UTFDecode - essaye de décoder les caractères illisibles ainsi et ça devrait marcher.

Solution 2. Essaye d'encoder les clefs en hexadécimal, ça sera exactement deux caractères héxadécimaux par caractère de clef, et pas de prise de tête. La conversion est aussi triviale.

Solution 3. Ou le Base64 mais c'est moins élégant et un peu trop lourd pour une petite utilisation comme celle-ci, mais bon. Et la longueur de clef encodée est potentiellement variable.

Cordialement, Bacterius !
0
209_Jack Messages postés 4 Date d'inscription vendredi 20 août 2004 Statut Membre Dernière intervention 24 juin 2011
6 avril 2011 à 15:23
Merci pour votre aide,
malheureusement je ne m'en sors toujours pas.


En fait mon but est d'obtenir une chaine de 16 caractères (128bits) pour générer son identifiant md5. Les 64 premiers bits sont obtenus à l'aide de clé 1 et 2 pas de problème de ce coté là. les 64 derniers bits, donc les 8 caractères de cette chaine doivent être en théorie la clé 3 collée telle qu'elle, mon problème est que la clé 3 devrait être un série de caractères propres et non pas ce que je reçois...
J'ai bien cherché à voir si les différents webbrowser pouvaient envoyer cette dernière partie modifiée d'une façon quelconque mais je ne trouve pas de réponse.

Quant au changement de base, si j'essaie un utf8Encode sur ma cle 3 j'obtiens ce genre de choses : " „\¾ÞQT " devient " „\¾ÞQT " donc rien de plus utilisable,

J'ai bien essayé aussi de convertir cette clé en hexadécimal mais au final j'ai la représentation en hexa dans un string et pour mon entrée de md5 je dois le transformer en 8 caractères.

Ou alors je ne fais pas ce qu'il faut, je ne suis pas très à l'aise avec les différentes conversions.

Si quelqu'un peut m'en dire un peu plus ou m'aiguiller sur autre chose je suis preneur!

Merci encore
0
shadow578 Messages postés 102 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 27 juin 2011 1
23 juin 2011 à 11:13
salut !

Je viens de découvrir le websocket proposé par html 5.

Mais avec mon navigateur lorsque j'envoie une connections par socket au serveur delphi (composant tsocketserveur) je reçoit comme toi comment as tu fait ? Car je ne comprend pas avec ta répose
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
shadow578 Messages postés 102 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 27 juin 2011 1
24 juin 2011 à 12:01
Bonjour,
Après plusieurs essaies je n'arrive toujours pas à renvoyer une réponse correct.

  rep := 'HTTP/1.1 101 WebSocket Protocol Handshake'+#13#10+
          'Upgrade: WebSocket'+#13#10+
          'Connection: Upgrade'+#13#10+
          'Sec-WebSocket-Origin: http://localhost'+#13#10+
          'Sec-WebSocket-Location: ws://....'+#13#10+
          'Sec-WebSocket-Protocol: sample'+#13#10+
           #13#10+md5rep;


Pour le md5rep je fais normalement ce qui faut.. fonction reprise dailleurs puis conversion en md5.

Help :(
0
209_Jack Messages postés 4 Date d'inscription vendredi 20 août 2004 Statut Membre Dernière intervention 24 juin 2011
24 juin 2011 à 14:01
Bonjour,

si le client n'accepte pas ta réponse et qu'il ferme la connection immédiatement, c'est que ta réponse est incorrecte. Dans ce cas là soit tu calcule un mauvais md5 soit il y a une erreur ailleurs.

pour le md5 je te conseille d'utiliser les exemples que j'ai mis dans le premier post, ils sont corrects, si tu obtiens le bon résultat c'est que le problème vient d'ailleurs, dans ce cas la vérifie au niveau des champs Origin et Location, tu dois y mettre une réponse qui dépend du client. Pour plus d'infos je t'invite à lire ce document : http://www.whatwg.org/specs/web-socket-protocol/ et particulièrement à partir de la page 31 pour bien comprendre comment créer ta réponse.

Si ca ne fonctionne toujours pas, vérifie qu'il n'y a pas de soucis dans le formatage de la réponse.

Bon courage!
0
shadow578 Messages postés 102 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 27 juin 2011 1
27 juin 2011 à 09:57
J'ai l'impression que tout est ok pourtant.

Comment tu vérifie si ton handshake est bon ? (à part que le serveur doit marcher..)

Mais comme tu disait plus haut la key 3 est dans un autre format à l'arrivé tu as fait commennt ?

Merci en tout cas
0
Rejoignez-nous