async def METHOD_NAME(self, network_reader, network_writer, process_reader, process_writer):
    replaces = []
    # Server host from the client point of view
    host = network_writer.transport.get_extra_info("sockname")[0]
    for replace in self._replaces:
        if b'{{HOST}}' in replace[1]:
            replaces.append((replace[0], replace[1].replace(b'{{HOST}}', host.encode()), ))
        else:
            replaces.append((replace[0], replace[1], ))
    network_read = asyncio.ensure_future(network_reader.read(READ_SIZE))
    reader_read = asyncio.ensure_future(process_reader.read(READ_SIZE))
    timeout = 30
    while True:
        done, pending = await asyncio.wait(
            [
                network_read,
                reader_read
            ],
            timeout=timeout,
            return_when=asyncio.FIRST_COMPLETED)
        if len(done) == 0:
            raise ConnectionResetError()
        for coro in done:
            data = coro.result()
            if coro == network_read:
                if network_reader.at_eof():
                    raise ConnectionResetError()
                network_read = asyncio.ensure_future(network_reader.read(READ_SIZE))
                process_writer.write(data)
                await process_writer.drain()
            elif coro == reader_read:
                if process_reader.at_eof():
                    raise ConnectionResetError()
                reader_read = asyncio.ensure_future(process_reader.read(READ_SIZE))
                for replace in replaces:
                    data = data.replace(replace[0], replace[1])
                timeout = 2  # We reduce the timeout when the process start to return stuff to avoid problem with server not closing the connection
                network_writer.write(data)
                await network_writer.drain()