code: def decode_header(cls, stream):
          
          read = stream.read
          data = read(2)
          if len(data) != 2:
              raise WebSocketError("Unexpected EOF while decoding header")
          first_byte, second_byte = struct.unpack('!BB', data)
          header = cls(
              fin=first_byte & cls.FIN_MASK == cls.FIN_MASK,
              opcode=first_byte & cls.OPCODE_MASK,
              flags=first_byte & cls.HEADER_FLAG_MASK,
              length=second_byte & cls.LENGTH_MASK)
          has_mask = second_byte & cls.MASK_MASK == cls.MASK_MASK
          if header.opcode > 0x07:
              if not header.fin:
                  raise WebSocketError('Received fragmented control frame: {0!r}'.format(data))
              # Control frames MUST have a payload length of 125 bytes or less
              if header.length > 125:
                  raise FrameTooLargeException('Control frame cannot be larger than 125 bytes: {0!r}'.format(data))
          if header.length == 126:
              # 16 bit length
              data = read(2)
              if len(data) != 2:
                  raise WebSocketError('Unexpected EOF while decoding header')
              header.length = struct.unpack('!H', data)[0]
          elif header.length == 127:
              # 64 bit length
              data = read(8)
              if len(data) != 8:
                  raise WebSocketError('Unexpected EOF while decoding header')
              header.length = struct.unpack('!Q', data)[0]
          if has_mask:
              mask = read(4)
              if len(mask) != 4:
                  raise WebSocketError('Unexpected EOF while decoding header')
              header.mask = mask
          return header
docs: Decode a WebSocket header.
  
          :param stream: A file like object that can be 'read' from.
          :returns: A `Header` instance.