def from_file(cls, fp): """ read a websockets frame header """ first_byte = utils.bytes_to_int(fp.safe_read(1)) second_byte = utils.bytes_to_int(fp.safe_read(1)) fin = utils.getbit(first_byte, 7) rsv1 = utils.getbit(first_byte, 6) rsv2 = utils.getbit(first_byte, 5) rsv3 = utils.getbit(first_byte, 4) # grab right-most 4 bits opcode = first_byte & 15 mask_bit = utils.getbit(second_byte, 7) # grab the next 7 bits length_code = second_byte & 127 # payload_lengthy > 125 indicates you need to read more bytes # to get the actual payload length if length_code <= 125: payload_length = length_code elif length_code == 126: payload_length = utils.bytes_to_int(fp.safe_read(2)) elif length_code == 127: payload_length = utils.bytes_to_int(fp.safe_read(8)) # masking key only present if mask bit set if mask_bit == 1: masking_key = fp.safe_read(4) else: masking_key = None return cls( fin=fin, rsv1=rsv1, rsv2=rsv2, rsv3=rsv3, opcode=opcode, mask=mask_bit, length_code=length_code, payload_length=payload_length, masking_key=masking_key, )
def __init__(self, key): self.key = key self.masks = [utils.bytes_to_int(byte) for byte in key] self.offset = 0