4

サーバー側でWebSocket フレームのマスク解除アルゴリズムを実装しようとしました (これに基づいて:サーバー側で WebSocket メッセージを送受信するにはどうすればよいですか? )。これが私が持っているものです:

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)

しかし、私は非常に奇妙な結果を得ます。JavaScript 側:

w = new WebSocket("ws://localhost:2000");
w.send("test");
w.send("test");
w.send("test");
w.send("test");

サーバー側で生成します:

[42, 73, 45, 46, 1, 0]
[42, 1, 98, 0, 0]
[2, 97, 0, 0]
[2, 97, 0, 0]

w.send("test");より多くのプロデュースを呼び出します[2, 97, 0, 0]。また、最初の 2 つの配列の長さは 4 ( word 内の文字数test) を超えています。そして、これらはいずれも word に変換されませんtest。デコードコードで何か間違ったことをしているに違いないようです。何が原因ですか?何か助けはありますか?

EDIT生のフレームを見てください:

[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]

もちろん、これらの数値は (マスキングのため) 少しランダムですが、2 番目のバイト (ペイロードの長さを表すと想定されている) はであり134、その後133は常にであることに注意してください132。また、最初の 2 つのフレームは、他のフレームよりも長くなっています。何が起きてる?

4

1 に答える 1