2013-04-01 2 views
3

나는 서버 측에서 WebSocket 프레임 언 마스킹 알고리즘 (this : How can I send and receive WebSocket messages on the server side?)을 구현하려고 시도했다. 여기에 내가 가지고있는 것이있다 :파이썬에서 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) 

그러나 나는 아주 이상한 결과를 얻는다. 자바 스크립트 측면에서 :

w = new WebSocket("ws://localhost:2000"); 
w.send("test"); 
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] 

더 호출 [2, 97, 0, 0]을 생산하고 있습니다. 또한 처음 두 배열의 길이는 4보다 큽니다 (단어 test의 문자 수). 그리고 이들 중 어느 것도 단어 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] 

:

편집은 원시 프레임에서 살펴보고 134이면 133이고 항상 132입니다. 또한 처음 두 프레임은 다른 프레임보다 길다. 무슨 일 이니? I는 방금 살펴본

+0

도움이 될만한 답변을 살펴보십시오. http://stackoverflow.com/a/9778823/1193863 – naren

답변

2

하나 이상의 시간 프레임 및 I는 첫번째 바이트 것을 깨달았다 :

193[DEC] == 11000001[BIN] 

는 사양에 따라 RSV1가 사용되는 것을 의미한다 (제 2 비트가 1이다).

ext = req.headers.get("Sec-WebSocket-Extensions", "").strip() 
if ext: 
    res += "Sec-WebSocket-Extensions: %s\r\n" % ext 

와 크롬에서 내가 볼 수 있습니다 :이 확장이 사용되며, 실제로 내 핸드 쉐이크 코드에서 나는 다음 줄을 발견 한 것을 의미하는 것으로 보인다

내가 악수를 할
Sec-WebSocket-Extensions:x-webkit-deflate-frame 

.

아직 확장 기능이 어떻게 작동하는지 모르겠지만 핸드 셰이크 코드에서이 세 줄을 제거하면 문제가 해결됩니다.

관련 문제