public AsyncServerExchangeHandler create()

in httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncServerFilterChainExchangeHandlerFactory.java [77:177]


    public AsyncServerExchangeHandler create(final HttpRequest request, final HttpContext context) throws HttpException {
        return new AsyncServerExchangeHandler() {

            private final AtomicReference<AsyncDataConsumer> dataConsumerRef = new AtomicReference<>();
            private final AtomicReference<AsyncResponseProducer> responseProducerRef = new AtomicReference<>();

            @Override
            public void handleRequest(
                    final HttpRequest request,
                    final EntityDetails entityDetails,
                    final ResponseChannel responseChannel,
                    final HttpContext context) throws HttpException, IOException {
                dataConsumerRef.set(filterChain.handle(request, entityDetails, context, new AsyncFilterChain.ResponseTrigger() {

                    @Override
                    public void sendInformation(
                            final HttpResponse response) throws HttpException, IOException {
                        responseChannel.sendInformation(response, context);
                    }

                    @Override
                    public void submitResponse(
                            final HttpResponse response,
                            final AsyncEntityProducer entityProducer) throws HttpException, IOException {
                        final AsyncResponseProducer responseProducer = new BasicResponseProducer(response, entityProducer);
                        responseProducerRef.set(responseProducer);
                        responseProducer.sendResponse(responseChannel, context);
                    }

                    @Override
                    public void pushPromise(final HttpRequest promise, final AsyncPushProducer responseProducer) throws HttpException, IOException {
                        responseChannel.pushPromise(promise, responseProducer, context);
                    }

                }));
            }

            @Override
            public void failed(final Exception cause) {
                if (exceptionCallback != null) {
                    exceptionCallback.execute(cause);
                }
                final AsyncResponseProducer handler = responseProducerRef.get();
                if (handler != null) {
                    handler.failed(cause);
                }
            }

            @Override
            public void updateCapacity(final CapacityChannel capacityChannel) throws IOException {
                final AsyncDataConsumer dataConsumer = dataConsumerRef.get();
                if (dataConsumer != null) {
                    dataConsumer.updateCapacity(capacityChannel);
                } else {
                    capacityChannel.update(Integer.MAX_VALUE);
                }
            }

            @Override
            public void consume(final ByteBuffer src) throws IOException {
                final AsyncDataConsumer dataConsumer = dataConsumerRef.get();
                if (dataConsumer != null) {
                    dataConsumer.consume(src);
                }
            }

            @Override
            public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException {
                final AsyncDataConsumer dataConsumer = dataConsumerRef.get();
                if (dataConsumer != null) {
                    dataConsumer.streamEnd(trailers);
                }
            }

            @Override
            public int available() {
                final AsyncResponseProducer responseProducer = responseProducerRef.get();
                Asserts.notNull(responseProducer, "Response producer");
                return responseProducer.available();
            }

            @Override
            public void produce(final DataStreamChannel channel) throws IOException {
                final AsyncResponseProducer responseProducer = responseProducerRef.get();
                Asserts.notNull(responseProducer, "Response producer");
                responseProducer.produce(channel);
            }

            @Override
            public void releaseResources() {
                final AsyncDataConsumer dataConsumer = dataConsumerRef.getAndSet(null);
                if (dataConsumer != null) {
                    dataConsumer.releaseResources();
                }
                final AsyncResponseProducer responseProducer = responseProducerRef.getAndSet(null);
                if (responseProducer != null) {
                    responseProducer.releaseResources();
                }
            }
        };
    }