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();
}
}
};
}