'Decode a WebSocket header.
:param stream: A file like object that can be \'read\' from.
:returns: A `Header` instance.'

@classmethod
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 > 7):
        if (not header.fin):
            raise ProtocolError('Received    fragmented    control    frame:    {0!r}'.format(data))
        if (header.length > 125):
            raise FrameTooLargeException('Control    frame    cannot    be    larger    than    125    bytes:    {0!r}'.format(data))
    if (header.length == 126):
        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):
        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
