Extract close code and reason in decode_hybi.

Also, make it a bit more robust if no code and/or reason is given.
This commit is contained in:
Joel Martin 2011-05-02 16:50:17 -05:00
parent a339a4856a
commit 8c3fc55124
1 changed files with 25 additions and 16 deletions

View File

@ -172,20 +172,24 @@ Sec-WebSocket-Accept: %s\r
def decode_hybi(buf, base64=False):
""" Decode HyBi style WebSocket packets.
Returns:
{'fin' : 0_or_1,
'opcode' : number,
'mask' : 32_bit_number,
'length' : payload_bytes_number,
'payload' : decoded_buffer,
'left' : bytes_left_number}
{'fin' : 0_or_1,
'opcode' : number,
'mask' : 32_bit_number,
'length' : payload_bytes_number,
'payload' : decoded_buffer,
'left' : bytes_left_number,
'close_code' : number,
'close_reason' : string}
"""
ret = {'fin' : 0,
'opcode' : 0,
'mask' : 0,
'length' : 0,
'payload' : None,
'left' : 0}
ret = {'fin' : 0,
'opcode' : 0,
'mask' : 0,
'length' : 0,
'payload' : None,
'left' : 0,
'close_code' : None,
'close_reason' : None}
blen = len(buf)
ret['left'] = blen
@ -253,6 +257,13 @@ Sec-WebSocket-Accept: %s\r
print "Exception while b64decoding buffer:", repr(buf)
raise
if ret['opcode'] == 0x08:
if ret['length'] >= 2:
ret['close_code'] = struct.unpack_from(
">H", ret['payload'])
if ret['length'] > 3:
ret['close_reason'] = ret['payload'][2:]
return ret
@staticmethod
@ -391,11 +402,9 @@ Sec-WebSocket-Accept: %s\r
break
else:
if frame['opcode'] == 0x8: # connection close
code, reason = struct.unpack_from(
">H%ds" % (frame['length']-2),
frame['payload'])
closed = "Client closed, reason: %s - %s" % (
code, reason)
frame['close_code'],
frame['close_reason'])
break
else: