private void writeResponse(HttpObject msg, ChannelHandlerContext ctx) { FullHttpResponse response = new DefaultFullHttpResponse( HTTP_1_1, msg.decoderResult().isSuccess() ? OK : BAD_REQUEST, Unpooled.copiedBuffer(_buf.toString(), CharsetUtil.UTF_8)); if (HttpHeaderUtil.isKeepAlive(_request)) { response.headers().set(CONNECTION, HttpHeaderValues.KEEP_ALIVE); ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); } else { ctx.write(response).addListener(ChannelFutureListener.CLOSE); } }
@Override protected void encode(ChannelHandlerContext ctx, HttpObject msg, ByteBuf out) throws Exception { if (msg instanceof HttpMessage) { if (state != ST_INIT) { throw new IllegalStateException( "unexpected message type: " + msg.getClass().getSimpleName()); } @SuppressWarnings({"unchecked", "CastConflictsWithInstanceof"}) H m = (H) msg; // Encode the message. encodeInitialLine(out, m); encodeHeaders(out, m); out.writeByte(CR); out.writeByte(LF); state = HttpHeaders.isTransferEncodingChunked(m) ? ST_CONTENT_CHUNK : ST_CONTENT_NON_CHUNK; } if (msg instanceof HttpContent) { if (state == ST_INIT) { throw new IllegalStateException( "unexpected message type: " + msg.getClass().getSimpleName()); } HttpContent chunk = (HttpContent) msg; ByteBuf content = chunk.content(); int contentLength = content.readableBytes(); if (state == ST_CONTENT_NON_CHUNK) { if (contentLength > 0) { out.writeBytes(content, content.readerIndex(), content.readableBytes()); } if (chunk instanceof LastHttpContent) { state = ST_INIT; } } else if (state == ST_CONTENT_CHUNK) { if (contentLength > 0) { out.writeBytes(copiedBuffer(Integer.toHexString(contentLength), CharsetUtil.US_ASCII)); out.writeByte(CR); out.writeByte(LF); out.writeBytes(content, content.readerIndex(), contentLength); out.writeByte(CR); out.writeByte(LF); } if (chunk instanceof LastHttpContent) { out.writeByte((byte) '0'); out.writeByte(CR); out.writeByte(LF); encodeTrailingHeaders(out, (LastHttpContent) chunk); out.writeByte(CR); out.writeByte(LF); state = ST_INIT; } } else { throw new Error(); } } }