Dies ist eine Frage zum Handshake im Websocket-Protokoll 76.
Ich habe einen Client und Server geschrieben, habe jedoch Schwierigkeiten, den Handshake vom Client akzeptieren zu lassen. Ich sehe, dass er zurückgegeben wird, aber der Client schließt die Verbindung sofort. Ich vermute, dass meine md5sum-Antwort falsch sein muss.
Soweit ich das beurteilen kann, folge ich dem richtigen Verfahren, kann mir jemand sagen, was ich falsch mache?
def create_handshake_resp(handshake):
# Anfrage parsen
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
# Schlüssel verknüpfen und verschlüsseln
e = hashlib.md5()
e.update(parse_key(key1))
e.update(parse_key(key2))
e.update(final_line)
return "HTTP/1.1 101 WebSocket-Protokoll-Handshake\r\nUpgrade: WebSocket\r\nVerbindung: Upgrade\r\nWebSocket-Origin: http://%s\r\nWebSocket-Location: ws://%s/\r\nWebSocket-Protokoll: beispiel\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)
Wie Sie sehen können, führe ich die Operationen durch, die meiner Meinung nach auf den Schlüsseln richtig sind (Zahlen durch die Anzahl der Leerzeichen teilen, Ergebnisse und die letzte Zeile der Anfrage verknüpfen und dann MD5) und es wird definitiv eine 16-Byte-Antwort zurückgegeben.
Jede Hilfe wäre sehr geschätzt, und sobald ich eine funktionierende Kopie habe, werde ich sie hier posten.
Danke.
BEARBEITEN:
Die Header wurden geändert, um kanakas Antwort zu entsprechen. Der Handshake wird immer noch nicht vom Client akzeptiert. Ich habe herausgefunden, wie man die Anfragen in Chromium anzeigen kann, und dies sind die Anfrage und Antwort, die gegeben werden:
(P) t=1291739663323 [st=3101] WEB_SOCKET_SEND_REQUEST_HEADERS
--> GET / HTTP/1.1
Upgrade: WebSocket
Verbindung: Upgrade
Host: ---
Ursprung: 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-Protokoll-Handshake
Upgrade: WebSocket
Verbindung: Upgrade
Sec-WebSocket-Ursprung: http://---
Sec-WebSocket-Location: ws://---/
Sec-WebSocket-Protokoll: beispiel
\xe7\x6f\xb9\xcf\xae\x70\x57\x43\xc6\x20\x85\xe7\x39\x2e\x83\xec\x0
Wortwörtlich, außer dass ich die IP-Adresse aus offensichtlichen Gründen entfernt habe.