async def METHOD_NAME(reader, writer, stop_event):
    buffer = b""
    command = None
    command_ptr = None
    fragment_length = None
    while not stop_event.is_set() or buffer:
        _logger.info(str(stop_event.is_set()))
        try:
            buffer += await asyncio.wait_for(reader.read(1024), timeout=0.5)
        except TimeoutError:
            continue
        if not buffer:
            continue
        parts = re.split(_CMD_SEP, buffer)
        buffer = parts[-1]
        for fragment in parts[:-1]:
            fragment = fragment.decode()
            _logger.info("Command fragment: %s", fragment)
            if fragment.startswith("*") and command is None:
                command = [None for _ in range(int(fragment[1:]))]
                command_ptr = 0
                fragment_length = None
                continue
            if fragment.startswith("$") and command[command_ptr] is None:
                fragment_length = int(fragment[1:])
                continue
            assert len(fragment) == fragment_length
            command[command_ptr] = fragment
            command_ptr += 1
            if command_ptr < len(command):
                continue
            command = " ".join(command)
            _logger.info("Command %s", command)
            resp = _SUPPORTED_CMDS.get(command, _ERROR_RESP)
            _logger.info("Response from %s", resp)
            writer.write(resp)
            await writer.drain()
            command = None
    _logger.info("Exit handler")