209_Jack
Messages postés4Date d'inscriptionvendredi 20 août 2004StatutMembreDernière intervention24 juin 2011
-
5 avril 2011 à 15:28
shadow578
Messages postés102Date d'inscriptionmercredi 8 avril 2009StatutMembreDernière intervention27 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.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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.
209_Jack
Messages postés4Date d'inscriptionvendredi 20 août 2004StatutMembreDernière intervention24 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!
shadow578
Messages postés102Date d'inscriptionmercredi 8 avril 2009StatutMembreDernière intervention27 juin 20111 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
209_Jack
Messages postés4Date d'inscriptionvendredi 20 août 2004StatutMembreDernière intervention24 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.