package netty.cookbook.common.http; import static io.netty.handler.codec.http.HttpHeaders.Names.CONNECTION; import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH; import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE; import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http.QueryStringDecoder; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; @FunctionalInterface public interface HttpEventHandler extends Serializable { public HttpResponse handle(HttpRequest req, QueryStringDecoder query) throws Exception; static final String HEADER_CONNECTION_CLOSE = "Close"; public static HttpResponse buildHttpResponse(Object data, int status, String ctype) { ByteBuf byteBuf = Unpooled .copiedBuffer(String.valueOf(data).getBytes()); HttpResponseStatus httpStatus = HttpResponseStatus.valueOf(status); FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, httpStatus, byteBuf); response.headers().set(CONTENT_TYPE, ctype); response.headers().set(CONTENT_LENGTH, byteBuf.readableBytes()); response.headers().set(CONNECTION, HEADER_CONNECTION_CLOSE); return response; } public static FullHttpResponse buildFullHttpResponse(Object data, int status, String ctype) { ByteBuf byteBuf = Unpooled.copiedBuffer(String.valueOf(data).getBytes()); HttpResponseStatus httpStatus = HttpResponseStatus.valueOf(status); final FullHttpResponse response = new DefaultFullHttpResponse( HttpVersion.HTTP_1_1, httpStatus, byteBuf); response.headers().set(CONTENT_TYPE, ctype); response.headers().set(CONTENT_LENGTH, byteBuf.readableBytes()); response.headers().set(CONNECTION, HEADER_CONNECTION_CLOSE); return response; } public static HttpEventHandler deepClone(HttpEventHandler h) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(h); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); return (HttpEventHandler) ois.readObject(); } catch (Exception e) { e.printStackTrace(); return null; } } public static HttpResponse response(Object data, int status) { return buildHttpResponse(data, status, ContentTypePool.TEXT_UTF8); } }