Aller au menu - Aller au contenu
Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !

[WebSocket] Validation du handshake

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1 
Auteur Message
1 visiteur sur ce sujet (1 Anonyme)
Page 1 
Hors ligne blister # Posté le 22/10/2010 à 22:24:37
Avatar

Études : SUPINFO Normandie à Caen

Bonjour,

Je ne savais pas trop ou poster. Je suis actuellement entrain de créer un serveur websocket en python cependant je n'arrive pas a faire la validation du handshake je m'explique.

Tout d'abord je me sert du draft du protocole websocket

http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-03

Ensuite la poignet de mains commence par le handshake du client puis je doit renvoyer celui du serveur suivant ce qu'envoie le client.

Dans celui du clients 3 info nous interesse pour valider le handshake la Key1, Key2 et le code qui est à la fin du hanshake.

Moi au niveau du serveur je doit, si j'ai bien compris le protocole ,effectuer une opération au niveau de chaque clé.
cet operation consiste à concatener tous les chiffres d'une clé puis de divisé ce nombre par le nombre d'espace puis de faire un pack en unsigned long interger big endian du résultat. je fais la même chose avec la clé 2.

Ensuite j'additionne la clé 1, 2 et le code de fin handshake et j'applique un md5 la dessus

Citation : Exemple de handshake client

GET /demo HTTP/1.1
Host: example.com
Connection: Upgrade
Sec-WebSocket-Key2: 12998 5 Y3 1 .P00
Sec-WebSocket-Protocol: sample
Upgrade: WebSocket
Sec-WebSocket-Key1: 18x 6]8vM;54 *(5: { U1]8 z [ 8
Sec-WebSocket-Key2: 1_ tx7X d < nw 334J702) 7]o}` 0
Origin: http://example.com

Tm[K T2u


Citation : Exemple de handshake Serveur

HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Location: ws://example.com/demo
Sec-WebSocket-Protocol: sample

fQJ,fN/4F4!~K~MH


Voilà pour l'introduction. Malheureusement je n'arrive pas à produire la code pour signer le handshake serveur en tout cas à chaque fois j'ai une déconnection du clients car la clé est mauvaise...

Voici mon code pour générer le handshake à partir de celui du clients

Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding:utf8 -*-
import re
import struct
import hashlib
class Handshake:
	def __init__(self,handshakeClient):
	
		getHost = re.compile("Host: (.*)\r\n")
		getOrigin = re.compile("Origin: (.*)\r\n")
		getRessource = re.compile("GET (.*) HTTP")
		getKey1 = re.compile("Sec-WebSocket-Key1: (.*)\r\n")
		getKey2 = re.compile("Sec-WebSocket-Key2: (.*)\r\n") 
		getCode = re.compile("\r\n(.*)$") 
		
		self.host = (getHost.search(handshakeClient)).group(1)
		self.origin = (getOrigin.search(handshakeClient)).group(1)
		self.ressource = (getRessource.search(handshakeClient)).group(1)
		self.key1 = (getKey1.search(handshakeClient)).group(1)
		self.key2 = (getKey2.search(handshakeClient)).group(1)
		self.code= (getCode.search(handshakeClient)).group(1)
	
	def parseKey(self,key):
		valeur = ""
		space = 0
		for caractere in key:
			if ord(caractere) >=48 and ord(caractere)<=57:
				valeur+=caractere
			elif ord(caractere) == ord(" "):
				space+=1
		return struct.pack('!L',(int(valeur)/space)) # ordre big endian Unsigned Long Interger
	
	def createKey(self): # to sign the handshake of the server
		return hashlib.md5(self.parseKey(self.key1)+self.parseKey(self.key2)+self.code).digest() # md5 of the concatenation of key1,key2,code
		
	def createHandshakeServer(self):
		return "HTTP/1.1 101 Web Socket Protocol Handshake\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Origin: http://%s\r\nSec-WebSocket-Location: ws://%s%s\r\nSec-WebSocket-Protocol: sample\r\n\r\n%s" % (self.host, self.origin,self.ressource,self.createKey())



J'espère que vous pourrez m'aider.

Blister
Édité le 22/10/2010 à 22:33:19 par blister

Image utilisateur
 
Publicité # Posté le 22/10/2010 à 22:24:37

Hors ligne excelise # Posté le 29/01/2011 à 15:31:39

Bonjour,

Je n'arrive pas non plus à créer une connexion entre le client et le serveur ! Je travaille également sous Python. Mon serveur reçoit le handshake du client, mais cela s'arrête là !

Ce qui est curieux, c'est que tu cherches une clef dans le handshake du client, non ? Cela m'étonne car j'ai trouvé des serveurs Python sur internet qui envoient la même chose au client quel que soit le handshake du client.

A titre d'exemple, le code d'Adrian Gaudebert.

Pourrais-tu me renseigner sur ce point ?

Merci par avance
Connecté fred1599 # Posté le 29/01/2011 à 22:22:12
Avatar

Bon j'y connais rien là dedans, mais je retiens ceci

Citation
cet operation consiste à concatener tous les chiffres d'une clé puis de divisé ce nombre par le nombre d'espace


Vite fait je ferais ceci

Code : Python Console
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
>>> def valeur(key):
...     nombre = ""
...     for i in key:
...         if i.isdigit():
...             nombre += i
...     return nombre
... 
>>> 
>>> def espace(key):
...     return key.count(" ")
... 
>>> cle = "18x 6]8vM;54 *(5: { U1]8 z [ 8"
>>> valeur(cle)
'1868545188'
>>> espace(cle)
7 # nombre d'espacement


Citation
puis de faire un pack en unsigned long interger big endian du résultat


Là j'ai rien capté!

Édité le 29/01/2011 à 22:24:47 par fred1599
Hors ligne quelqun_dautre # Posté le 30/01/2011 à 14:50:08
<3
Avatar

Études : IUT Toulon

Comme j'ai le beau code, j'aurais plutôt fait ca:
Citation : fred1599
Code : Python
1
2
def valeur(key):
    return ''.join([i for i in key if i.isdigit()])

Mais ensuite c'est personnel, et ca n'aide pas beaucoup l'OP.

THE GAME.
 
Hors ligne FMIS@Menace. # Posté le 01/02/2011 à 18:37:27
Avatar

Si ça peut aider :
Code : Python
1
2
3
4
5
6
7
>>> import struct
>>> def valeur(key):
	return int(''.join([i for i in key if i.isdigit()])) / key.count(" ")

>>> clef = "18x 6]8vM;54 *(5: { U1]8 z [ 8"
>>> struct.pack("L", valeur(clef)) # retourne un unsigned long integer
'\xf2\x1a\xe9\x0f'

[thread.start() for thread in sweater if want_to_destroy_my_sweater] #pythonftw :>
 
Hors ligne excelise # Posté le 02/02/2011 à 23:38:13

Merci à vous trois !

Retour au forum "Langage Python" ou à la liste des forums

Pour accéder à cette section
Connectez-vous !
connexion_rpx


Lire aussi