private void handleReadHttpContent(ChannelHandlerContext ctx, HttpContent content) { if (!ignoreBodyRead) { if (content instanceof LastHttpContent) { if (content.content().readableBytes() > 0 || !((LastHttpContent) content).trailingHeaders().isEmpty()) { // It has data or trailing headers, send them ctx.fireChannelRead(content); } else { ReferenceCountUtil.release(content); } removeHandlerIfActive(ctx, ctx.name() + "-body-publisher"); currentlyStreamedMessage = null; consumedInMessage(ctx); } else { ctx.fireChannelRead(content); } } else { ReferenceCountUtil.release(content); if (content instanceof LastHttpContent) { ignoreBodyRead = false; if (currentlyStreamedMessage != null) { removeHandlerIfActive(ctx, ctx.name() + "-body-publisher"); } currentlyStreamedMessage = null; } } }
private void completeBody(final ChannelHandlerContext ctx) { removeHandlerIfActive(ctx, ctx.name() + "-body-subscriber"); if (sendLastHttpContent) { ChannelPromise promise = outgoing.peek().promise; ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT, promise).addListener( (ChannelFutureListener) channelFuture -> executeInEventLoop(ctx, () -> { outgoing.remove(); sentOutMessage(ctx); flushNext(ctx); }) ); ctx.read(); } else { outgoing.remove().promise.setSuccess(); sentOutMessage(ctx); flushNext(ctx); ctx.read(); } }