Il s'agit d'une question relative à la prise de contact au Websocket Protocol 76.Problème de prise de contact Websocket à l'aide du serveur Python
J'ai écrit un client et un serveur, mais j'ai du mal à obtenir le client pour accepter la prise de contact. Je peux voir qu'il est retourné, mais le client ferme immédiatement la connexion. Je suppose que ma réponse md5sum doit être incorrecte. Pour autant que je sache, je suis la procédure appropriée, quelqu'un peut-il me dire ce que je fais mal?
def create_handshake_resp(handshake):
# parse request
final_line = ""
lines = handshake.splitlines()
for line in lines:
parts = line.partition(":")
if parts[0] == "Sec-WebSocket-Key1":
key1 = parts[2]
elif parts[0] == "Sec-WebSocket-Key2":
key2 = parts[2]
final_line = line
#concat the keys and encrypt
e = hashlib.md5()
e.update(parse_key(key1))
e.update(parse_key(key2))
e.update(final_line)
return "HTTP/1.1 101 WebSocket Protocol Handshake\r\nUpgrade: WebSocket\r\nConnection: Upgrade\r\nWebSocket-Origin: http://%s\r\nWebSocket-Location: ws://%s/\r\nWebSocket-Protocol: sample\r\n\r\n%s" % (httphost, sockethost, e.digest())
def parse_key(key):
spaces = -1
digits = ""
for c in key:
if c == " ":
spaces += 1
if is_number(c):
digits = digits + c
new_key = int(digits)/spaces
return str(new_key)
Comme vous pouvez le voir, je joue ce que je pense être les bonnes opérations sur les touches (numéros de diviser par le nombre d'espace, les résultats concat et la dernière ligne de la demande, puis MD5) et un 16 octet la réponse est définitivement retournée.
Toute aide serait grandement appréciée, et dès que j'en aurais une copie de travail, je l'afficherai ici.
Merci.
EDIT:
changé les en-têtes pour se conformer à la réponse de Kanaka. La prise de contact n'est toujours pas acceptée par le client. Je trouvé comment afficher les demandes de chrome, ce qui est la demande et la réponse étant donnée:
(P) t=1291739663323 [st=3101] WEB_SOCKET_SEND_REQUEST_HEADERS
--> GET/HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: ---
Origin: http://---
Sec-WebSocket-Key1: 3E 203C 220 642;
Sec-WebSocket-Key2: Lg 590 ~5 703O G7 =%t 9
\x74\x66\xef\xab\x50\x60\x35\xc6\x0a
(P) t=1291739663324 [st=3102] SOCKET_STREAM_SENT
(P) t=1291739663348 [st=3126] SOCKET_STREAM_RECEIVED
(P) t=1291739663348 [st=3126] WEB_SOCKET_READ_RESPONSE_HEADERS
--> HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://---
Sec-WebSocket-Location: ws://---/
Sec-WebSocket-Protocol: sample
\xe7\x6f\xb9\xcf\xae\x70\x57\x43\xc6\x20\x85\xe7\x39\x2e\x83\xec\x0
Ad mot pour mot, sauf que j'ai supprimé l'adresse IP pour des raisons évidentes.
Votre empreinte n'a pas de sens. Je suppose que les lignes '# concat'..'return' sont censées être dans' create_handshake_resp'? –
Désolé. Copiez et collez une erreur. Édité. – Jivings
Vous aviez besoin de 'spaces = -1' car vous n'ignorez pas le premier espace après': 'dans l'en-tête (par exemple' Sec-WebSocket-Key1: a b' contient seulement un espace, en ce qui concerne la réponse). Faire 'line.partition (": ")' empêche cela – dbr