Dies ist eine Frage zum Handshake in Websocket Protocol 76.Websocket-Handshake-Problem mit Python-Server
Ich habe einen Client und Server geschrieben, habe aber Probleme, den Client den Handshake zu akzeptieren. Ich kann sehen, dass es zurückgegeben wird, aber der Client schließt sofort die Verbindung. Ich vermute, dass meine MD5sum Antwort falsch sein muss.
Soweit ich das beurteilen kann, befolge ich die richtige Prozedur, kann mir jemand sagen, was ich falsch mache?
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)
Wie Sie sehen können, bin ich durchführen, was ich denke, die richtigen Operationen an den Tasten (dividieren Zahlen von Raum zählen, concat Ergebnisse und die letzte Zeile der Anforderung und dann MD5) und ein 16-Byte zu sein Antwort wird definitiv zurückgegeben.
Jede Hilfe würde sehr geschätzt, und sobald ich eine Arbeitskopie habe, werde ich es hier posten.
Danke.
EDIT:
die Header geändert mit kanaka Antwort zu erfüllen. Der Handshake wird vom Kunden immer noch nicht akzeptiert. ich herausgefunden, wie die Anforderungen in Chromium anzuzeigen, und dies ist die Anfrage und Antwort gegeben werden:
(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 wörtlich, es sei denn ich die IP-Adresse aus offensichtlichen Gründen entfernt haben.
Ihr Einzug keinen Sinn macht. Ich nehme an, dass die Zeilen '# concat'..return' in' create_handshake_resp' stehen sollen? –
Entschuldigung. Fehler kopieren und einfügen Bearbeitet. – Jivings
Sie benötigten die 'Leerzeichen = -1 ', da Sie das erste Leerzeichen nach': 'im Header nicht ignorieren (z. B. Sec-WebSocket-Key1: ein b enthält nur ein Leerzeichen, soweit die Antwort betroffen ist). Doing 'line.partition (": ")' verhindert dies – dbr