【发布时间】:2010-12-07 01:37:09
【问题描述】:
这是Websocket Protocol 76中关于握手的问题。
我已经编写了客户端和服务器,但无法获取客户端 接受握手。我可以看到它正在被返回,但是客户端立即关闭了连接。我猜我的 md5sum 响应一定是不正确的。
据我所知,我正在遵循正确的程序,谁能告诉我我做错了什么?
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)
如您所见,我正在对键执行我认为正确的操作(将数字除以空间计数、连接结果和请求的最后一行,然后是 MD5),并且 16 字节的响应肯定是返回。
任何帮助将不胜感激,一旦我有工作副本,我会在这里发布。
谢谢。
编辑:
更改了标题以符合 kanaka 的响应。客户仍然不接受握手。 我发现了如何在 Chromium 中显示请求,这是给出的请求和响应:
(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
逐字逐句,除非我出于明显的原因删除了 IP 地址。
【问题讨论】:
-
您的缩进没有意义。我认为
#concat..return的行应该在create_handshake_resp? -
对不起。复制粘贴错误。已编辑。
-
您需要
spaces = -1,因为您没有忽略标题中:之后的第一个空格(例如,就响应而言,Sec-WebSocket-Key1: a b仅包含一个空格)。做line.partition(": ")可以防止这种情况发生