Esta es una pregunta sobre el protocolo de enlace en Websocket Protocol 76.Problema de enlace de Websocket con el servidor de Python
He escrito un cliente y un servidor, pero estoy teniendo problemas para que el cliente acepte el protocolo de enlace. Puedo ver que se devuelve, pero el cliente cierra inmediatamente la conexión. Supongo que mi respuesta md5sum debe ser incorrecta.
Por lo que puedo decir, estoy siguiendo el procedimiento adecuado, ¿alguien me puede decir lo que estoy haciendo 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)
Como se puede ver, estoy realizando lo que creo que es el correcto funcionamiento de las teclas (números se dividen por recuento espacio, resultados concat y la última línea de la solicitud y luego MD5) y un byte 16 la respuesta definitivamente está siendo devuelta.
Cualquier ayuda sería muy apreciada, y tan pronto como tenga una copia de trabajo la publicaré aquí.
Gracias.
EDIT:
cambiado las cabeceras para cumplir con la respuesta de Kanaka. El cliente todavía no acepta el apretón de manos. He encontrado la manera de visualizar las solicitudes de cromo, y esta es la solicitud y la respuesta que se da:
(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 pie de la letra, excepto que he eliminado la dirección IP por razones obvias.
Su sangría no tiene sentido. Supongo que las líneas '# concat'..'return' están destinadas a' create_handshake_resp'? –
Lo siento. Copia y pega el error. Editado – Jivings
Necesitaba los 'espacios = -1' porque no está ignorando el primer espacio después de': 'en el encabezado (por ejemplo' Sec-WebSocket-Key1: a b' solo contiene un espacio, en lo que respecta a la respuesta). Hacer 'line.partition (": ")' previene esto – dbr