@Override
            public void consumeResponse(
                    final HttpResponse response,
                    final EntityDetails entityDetails,
                    final HttpContext context) throws HttpException, IOException {

                clientContext.setResponse(response);
                httpProcessor.process(response, entityDetails, clientContext);

                entityConsumerRef.set(asyncExecCallback.handleResponse(response, entityDetails));
                if (response.getCode() >= HttpStatus.SC_CLIENT_ERROR) {
                    messageCountDown.decrementAndGet();
                }
                final TimeValue keepAliveDuration = keepAliveStrategy.getKeepAliveDuration(response, clientContext);
                Object userToken = clientContext.getUserToken();
                if (userToken == null) {
                    userToken = userTokenHandler.getUserToken(route, request, clientContext);
                    clientContext.setUserToken(userToken);
                }
                execRuntime.markConnectionReusable(userToken, keepAliveDuration);
                if (entityDetails == null) {
                    execRuntime.validateConnection();
                    if (messageCountDown.decrementAndGet() <= 0) {
                        asyncExecCallback.completed();
                    }
                }
            }
Usually the last HTTP/1.1 request execution handler in the asynchronous
request execution chain that is responsible for execution of
request/response exchanges with the opposite endpoint.

@since 5.0
httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncMainClientExec.java