1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty5.example.http.helloworld;
17
18 import io.netty5.channel.ChannelFutureListeners;
19 import io.netty5.channel.ChannelHandlerContext;
20 import io.netty5.channel.SimpleChannelInboundHandler;
21 import io.netty5.handler.codec.http.DefaultFullHttpResponse;
22 import io.netty5.handler.codec.http.FullHttpResponse;
23 import io.netty5.handler.codec.http.HttpObject;
24 import io.netty5.handler.codec.http.HttpRequest;
25 import io.netty5.handler.codec.http.HttpUtil;
26 import io.netty5.util.concurrent.Future;
27
28 import static io.netty5.handler.codec.http.HttpHeaderNames.CONNECTION;
29 import static io.netty5.handler.codec.http.HttpHeaderNames.CONTENT_LENGTH;
30 import static io.netty5.handler.codec.http.HttpHeaderNames.CONTENT_TYPE;
31 import static io.netty5.handler.codec.http.HttpHeaderValues.CLOSE;
32 import static io.netty5.handler.codec.http.HttpHeaderValues.KEEP_ALIVE;
33 import static io.netty5.handler.codec.http.HttpHeaderValues.TEXT_PLAIN;
34 import static io.netty5.handler.codec.http.HttpResponseStatus.OK;
35
36 public class HttpHelloWorldServerHandler extends SimpleChannelInboundHandler<HttpObject> {
37 private static final byte[] CONTENT = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };
38
39 @Override
40 public void channelReadComplete(ChannelHandlerContext ctx) {
41 ctx.flush();
42 }
43
44 @Override
45 public void messageReceived(ChannelHandlerContext ctx, HttpObject msg) {
46 if (msg instanceof HttpRequest) {
47 HttpRequest req = (HttpRequest) msg;
48
49 boolean keepAlive = HttpUtil.isKeepAlive(req);
50 FullHttpResponse response = new DefaultFullHttpResponse(req.protocolVersion(), OK,
51 ctx.bufferAllocator().allocate(CONTENT.length)
52 .writeBytes(CONTENT));
53 response.headers()
54 .set(CONTENT_TYPE, TEXT_PLAIN)
55 .setInt(CONTENT_LENGTH, response.payload().readableBytes());
56
57 if (keepAlive) {
58 if (!req.protocolVersion().isKeepAliveDefault()) {
59 response.headers().set(CONNECTION, KEEP_ALIVE);
60 }
61 } else {
62
63 response.headers().set(CONNECTION, CLOSE);
64 }
65
66 Future<Void> f = ctx.write(response);
67
68 if (!keepAlive) {
69 f.addListener(ctx, ChannelFutureListeners.CLOSE);
70 }
71 }
72 }
73
74 @Override
75 public void channelExceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
76 cause.printStackTrace();
77 ctx.close();
78 }
79 }