def do_cmp_unmask(buf, hlen, plen): c = memoryview_to_bytes(hybi_unmask(buf, hlen, plen)) w = numpy_unmask(buf, hlen, plen) assert w == c, "expected %s got %s" % ( repr_ellipsized(binascii.hexlify(w)), repr_ellipsized(binascii.hexlify(c)), )
def decode_hybi(buf): """ Decode HyBi style WebSocket packets """ blen = len(buf) hlen = 2 if blen < hlen: #log("decode_hybi_header() buffer too small: %i", blen) return None b1, b2 = struct.unpack(">BB", buf[:2]) opcode = b1 & 0x0f fin = bool(b1 & 0x80) masked = bool(b2 & 0x80) if masked: hlen += 4 if blen < hlen: #log("decode_hybi_header() buffer too small for mask: %i", blen) return None payload_len = b2 & 0x7f if payload_len == 126: hlen += 2 if blen < hlen: #log("decode_hybi_header() buffer too small for 126 payload: %i", blen) return None payload_len = struct.unpack('>H', buf[2:4])[0] elif payload_len == 127: hlen += 8 if blen < hlen: #log("decode_hybi_header() buffer too small for 127 payload: %i", blen) return None payload_len = struct.unpack('>Q', buf[2:10])[0] #log("decode_hybi_header() decoded header '%s': hlen=%i, # payload_len=%i, buffer len=%i", binascii.hexlify(buf[:hlen]), hlen, payload_len, blen) length = hlen + payload_len if blen < length: #log("decode_hybi_header() buffer too small for payload: %i (needed %i)", blen, length) return None if masked: payload = hybi_unmask(buf, hlen - 4, payload_len) else: payload = buf[hlen:length] #log("decode_hybi_header() payload_len=%i, hlen=%i, # length=%i, fin=%s", payload_len, hlen, length, fin) return opcode, payload, length, fin
def unmask(buf, hlen, plen): pstart = hlen + 4 pend = pstart + plen mask = buf[hlen:hlen + 4] data = buf[pstart:pend] return hybi_unmask(mask, data)