@Override
    public CompletableFuture<Boolean> init() {
        assert endpoint == null : endpoint;
        assert !initialized;
        initialized = true;

        final Throwable cancellationCause = cancellationCause();
        if (cancellationCause != null) {
            acquireEventLoop(endpointGroup);
            failEarly(cancellationCause);
            return initFuture(false, null);
        }

        try {
            endpointGroup = mapEndpoint(endpointGroup);
            if (endpointGroup instanceof Endpoint) {
                return initEndpoint((Endpoint) endpointGroup);
            } else {
                return initEndpointGroup(endpointGroup);
            }
        } catch (Throwable t) {
            acquireEventLoop(endpointGroup);
            failEarly(t);
            return initFuture(false, null);
        }
    }
Creates a new instance. Note that {@link #init()} method must be invoked to finish
the construction of this context.

@param sessionProtocol the {@link SessionProtocol} of the invocation
@param id the {@link RequestId} that contains the identifier of the current {@link Request}
          and {@link Response} pair.
@param req the {@link HttpRequest} associated with this context
@param rpcReq the {@link RpcRequest} associated with this context
@param requestStartTimeNanos {@link System#nanoTime()} value when the request started.
@param requestStartTimeMicros the number of microseconds since the epoch,
                              e.g. {@code System.currentTimeMillis() * 1000}.
core/src/main/java/com/linecorp/armeria/internal/client/DefaultClientRequestContext.java