Пример #1
0
 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)),
     )
Пример #2
0
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
Пример #3
0
 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)