1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.testsuite.svm;
17
18 import io.netty.buffer.Unpooled;
19 import io.netty.channel.ChannelFutureListener;
20 import io.netty.channel.ChannelHandlerContext;
21 import io.netty.channel.SimpleChannelInboundHandler;
22 import io.netty.handler.codec.http.DefaultFullHttpResponse;
23 import io.netty.handler.codec.http.FullHttpResponse;
24 import io.netty.handler.codec.http.HttpObject;
25 import io.netty.handler.codec.http.HttpUtil;
26 import io.netty.handler.codec.http.HttpRequest;
27 import io.netty.util.AsciiString;
28
29 import static io.netty.handler.codec.http.HttpHeaderNames.*;
30 import static io.netty.handler.codec.http.HttpResponseStatus.*;
31 import static io.netty.handler.codec.http.HttpVersion.*;
32
33 public class HttpNativeServerHandler extends SimpleChannelInboundHandler<HttpObject> {
34 private static final byte[] CONTENT = { 'H', 'e', 'l', 'l', 'o', ' ', 'N', 'a', 't', 'i', 'v', 'e' };
35
36 private static final AsciiString KEEP_ALIVE = AsciiString.cached("keep-alive");
37
38 @Override
39 public void channelReadComplete(ChannelHandlerContext ctx) {
40 ctx.flush();
41 }
42
43 @Override
44 public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) {
45 if (msg instanceof HttpRequest) {
46 HttpRequest req = (HttpRequest) msg;
47
48 boolean keepAlive = HttpUtil.isKeepAlive(req);
49 FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(CONTENT));
50 response.headers().set(CONTENT_TYPE, "text/plain");
51 response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes());
52
53 if (!keepAlive) {
54 ctx.write(response).addListener(ChannelFutureListener.CLOSE);
55 } else {
56 response.headers().set(CONNECTION, KEEP_ALIVE);
57 ctx.write(response);
58 }
59 }
60 }
61
62 @Override
63 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
64 cause.printStackTrace();
65 ctx.close();
66 }
67 }