boolean isOutputReady() { switch (requestState) { case IDLE: case ACK: return true; case BODY: return exchangeHandler.available() > 0; default: return false; } }
@Override public void consumeData(final ByteBuffer src, final boolean endStream) throws HttpException, IOException { if (done.get() || responseState != MessageState.BODY) { throw new ProtocolException("Unexpected message data"); } if (src != null) { exchangeHandler.consume(src); } if (endStream) { responseState = MessageState.COMPLETE; exchangeHandler.streamEnd(null); } }
@Override public void failed(final Exception ex) { try { exchangeHandler.failed(ex); } finally { exchangeHandler.releaseResources(); } }
@Override public void produceOutput() throws HttpException, IOException { switch (requestState) { case HEADERS: exchangeHandler.produceRequest(new RequestChannel() { @Override public void sendRequest( final HttpRequest request, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException { commitRequest(request, entityDetails); } }, context); break; case BODY: exchangeHandler.produce(dataChannel); break; } }
Args.notNull(executeContext, "Context"); try { exchangeHandler.produceRequest(new RequestChannel() { exchangeHandler.failed(ex);
exchangeHandler.consumeInformation(response, context); exchangeHandler.produce(dataChannel); connMetrics.incrementResponseCount(); exchangeHandler.consumeResponse(response, entityDetails, context); responseState = endStream ? MessageState.COMPLETE : MessageState.BODY; break; case BODY: responseState = MessageState.COMPLETE; exchangeHandler.streamEnd(headers); break; default:
exchangeHandler.consumeInformation(response, context); } else { if (!connectionReuseStrategy.keepAlive(committedRequest, response, context)) { requestState = MessageState.BODY; if (status < HttpStatus.SC_CLIENT_ERROR) { exchangeHandler.produce(internalDataChannel); httpProcessor.process(response, entityDetails, context); exchangeHandler.consumeResponse(response, entityDetails, context); if (entityDetails == null) { if (!keepAlive) {
@Override public void failed(final Exception ex) { exchangeHandler.failed(ex); }
@Override public void updateCapacity(final CapacityChannel capacityChannel) throws IOException { handler.updateCapacity(new CapacityChannel() { @Override public void update(final int increment) throws IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": capacity update " + increment); } capacityChannel.update(increment); } }); }
@Override public void releaseResources() { handler.releaseResources(); }
log.debug(exchangeId + ": produce request data"); handler.produce(new DataStreamChannel() {
@Override public void consume(final ByteBuffer src) throws IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": consume response data, len " + src.remaining() + " bytes"); } handler.consume(src); }
@Override public void streamEnd(final List<? extends Header> trailers) throws HttpException, IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": end of response data"); } handler.streamEnd(trailers); }
@Override public void produceRequest(final RequestChannel channel, final HttpContext context) throws HttpException, IOException { handler.produceRequest(new RequestChannel() { @Override public void sendRequest( final HttpRequest request, final EntityDetails entityDetails, final HttpContext context) throws HttpException, IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": send request " + new RequestLine(request) + ", " + (entityDetails != null ? "entity len " + entityDetails.getContentLength() : "null entity")); } channel.sendRequest(request, entityDetails, context); } }, context); }
@Override public void consumeInformation( final HttpResponse response, final HttpContext context) throws HttpException, IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": information response " + new StatusLine(response)); } handler.consumeInformation(response, context); }
@Override public void consumeResponse( final HttpResponse response, final EntityDetails entityDetails, final HttpContext context) throws HttpException, IOException { if (log.isDebugEnabled()) { log.debug(exchangeId + ": consume response " + new StatusLine(response) + ", " + (entityDetails != null ? "entity len " + entityDetails.getContentLength() : " null entity")); } handler.consumeResponse(response, entityDetails, context); }
Args.notNull(executeContext, "Context"); try { exchangeHandler.produceRequest(new RequestChannel() { exchangeHandler.failed(ex);
exchangeHandler.consumeInformation(response, context); } else { if (!connectionReuseStrategy.keepAlive(committedRequest, response, context)) { requestState = MessageState.BODY; if (status < HttpStatus.SC_CLIENT_ERROR) { exchangeHandler.produce(internalDataChannel); httpProcessor.process(response, entityDetails, context); exchangeHandler.consumeResponse(response, entityDetails, context); if (entityDetails == null) { if (!keepAlive) {
void produceOutput() throws HttpException, IOException { switch (requestState) { case IDLE: requestState = MessageState.HEADERS; exchangeHandler.produceRequest(new RequestChannel() { @Override public void sendRequest( final HttpRequest request, final EntityDetails entityDetails, final HttpContext httpContext) throws HttpException, IOException { commitRequest(request, entityDetails); } }, context); break; case ACK: outputChannel.suspendOutput(); break; case BODY: exchangeHandler.produce(internalDataChannel); break; } }
@Override public void failed(final Exception ex) { exchangeHandler.failed(ex); }