@Override public void close(AtmosphereResponse response) throws IOException { // Once we initiate the flush, we discard anything coming after for whatever reason. if (!doneProcessing.getAndSet(true) && channel.isOpen()) { logger.trace("About to flush to {} for {}", channel, response.uuid()); ByteBuf statusAndHeadersBuffer = writeHeader ? Unpooled.wrappedBuffer(constructStatusAndHeaders(response, chainedBodyBuffer.readableBytes()).getBytes("UTF-8")) : Unpooled.EMPTY_BUFFER; ByteBuf drain = Unpooled.wrappedBuffer(statusAndHeadersBuffer, chainedBodyBuffer); channel.writeAndFlush(drain).addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture channelFuture) throws Exception { chainedBodyBuffer = null; if (!keepAlive) { channel.close().awaitUninterruptibly(); } } }); } else { throw Utils.ioExceptionForChannel(channel, response.uuid()); } }
@Override public void close(AtmosphereResponse response) throws IOException { // Once we initiate the flush, we discard anything coming after for whatever reason. if (!doneProcessing.getAndSet(true) && channel.isOpen()) { logger.trace("About to flush to {} for {}", channel, response.uuid()); ByteBuf statusAndHeadersBuffer = writeHeader ? Unpooled.wrappedBuffer(constructStatusAndHeaders(response, chainedBodyBuffer.readableBytes()).getBytes("UTF-8")) : Unpooled.EMPTY_BUFFER; ByteBuf drain = Unpooled.wrappedBuffer(statusAndHeadersBuffer, chainedBodyBuffer); channel.writeAndFlush(drain).addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture channelFuture) throws Exception { chainedBodyBuffer = null; if (!keepAlive) { channel.close().awaitUninterruptibly(); } } }); } else { throw Utils.ioExceptionForChannel(channel, response.uuid()); } }