fre*_*ish 5 python decode mask websocket
我尝试在服务器端实现WebSocket帧解密算法(基于此:How can I send and receive WebSocket messages on the server side? )。这是我所得到的:
def decode(data):
frame = bytearray(data)
length = frame[1] & 127
indexFirstMask = 2
if length == 126:
indexFirstMask = 4
elif length == 127:
indexFirstMask = 10
indexFirstDataByte = indexFirstMask + 4
mask = frame[indexFirstMask:indexFirstDataByte]
i = indexFirstDataByte
j = 0
decoded = []
while i < len(frame):
decoded.append(frame[i] ^ mask[j%4])
i += 1
j += 1
print decoded
return "".join(chr(byte) for byte in decoded)
Run Code Online (Sandbox Code Playgroud)
然而我得到了非常奇怪的结果。在 JavaScript 方面:
w = new WebSocket("ws://localhost:2000");
w.send("test");
w.send("test");
w.send("test");
w.send("test");
Run Code Online (Sandbox Code Playgroud)
在服务器端产生:
[42, 73, 45, 46, 1, 0]
[42, 1, 98, 0, 0]
[2, 97, 0, 0]
[2, 97, 0, 0]
Run Code Online (Sandbox Code Playgroud)
更多的调用w.send("test");产生[2, 97, 0, 0]. 另外,前两个数组的长度 >4( word 中的字符数test)。这些都没有转换为 word test。看来我的解码代码一定做错了什么。是什么原因造成的?有什么帮助吗?
编辑看看原始帧:
[193, 134, 48, 166, 232, 11, 26, 239, 197, 37, 49, 166]
[193, 133, 57, 161, 169, 218, 19, 160, 203, 218, 57]
[193, 132, 150, 97, 124, 54, 148, 0, 124, 54]
[193, 132, 163, 26, 102, 249, 161, 123, 102, 249]
[193, 132, 238, 212, 210, 156, 236, 181, 210, 156]
Run Code Online (Sandbox Code Playgroud)
当然,这些数字有点随机(由于屏蔽),但请注意,第二个字节(应该表示有效负载的长度)是134,然后是133,然后总是132。而且前两帧比其他帧长。这里发生了什么?
我刚刚又看了一遍这个帧,我意识到第一个字节:
193[DEC] == 11000001[BIN]
Run Code Online (Sandbox Code Playgroud)
根据规范,这意味着RSV1已使用(第二位是1)。这似乎意味着使用了扩展名,实际上在我的握手代码中我发现了以下行:
ext = req.headers.get("Sec-WebSocket-Extensions", "").strip()
if ext:
res += "Sec-WebSocket-Extensions: %s\r\n" % ext
Run Code Online (Sandbox Code Playgroud)
在 Chrome 中我可以看到:
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Run Code Online (Sandbox Code Playgroud)
当我握手时。
我还不确定这些扩展是如何工作的,但从握手代码中删除这 3 行可以解决问题。