1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.netty5.example.http2.tiles;
18
19 import io.netty5.bootstrap.ServerBootstrap;
20 import io.netty5.channel.Channel;
21 import io.netty5.channel.ChannelInitializer;
22 import io.netty5.channel.ChannelOption;
23 import io.netty5.channel.EventLoopGroup;
24 import io.netty5.channel.socket.SocketChannel;
25 import io.netty5.channel.socket.nio.NioServerSocketChannel;
26 import io.netty5.handler.ssl.ApplicationProtocolConfig;
27 import io.netty5.handler.ssl.ApplicationProtocolConfig.Protocol;
28 import io.netty5.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior;
29 import io.netty5.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior;
30 import io.netty5.handler.ssl.ApplicationProtocolNames;
31 import io.netty5.handler.ssl.SslContext;
32 import io.netty5.handler.ssl.SslContextBuilder;
33 import io.netty5.handler.ssl.SupportedCipherSuiteFilter;
34 import io.netty5.handler.ssl.util.SelfSignedCertificate;
35 import io.netty5.util.concurrent.Future;
36
37 import javax.net.ssl.SSLException;
38 import java.security.cert.CertificateException;
39
40 import static io.netty5.handler.codec.http2.Http2SecurityUtil.CIPHERS;
41
42
43
44
45
46
47 public class Http2Server {
48
49 public static final int PORT = Integer.parseInt(System.getProperty("http2-port", "8443"));
50
51 private final EventLoopGroup group;
52
53 public Http2Server(EventLoopGroup eventLoopGroup) {
54 group = eventLoopGroup;
55 }
56
57 public Future<Void> start() throws Exception {
58 final SslContext sslCtx = configureTLS();
59 ServerBootstrap b = new ServerBootstrap();
60 b.option(ChannelOption.SO_BACKLOG, 1024);
61 b.group(group).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {
62 @Override
63 protected void initChannel(SocketChannel ch) throws Exception {
64 ch.pipeline().addLast(sslCtx.newHandler(ch.bufferAllocator()), new Http2OrHttpHandler());
65 }
66 });
67
68 Channel ch = b.bind(PORT).asStage().get();
69 return ch.closeFuture();
70 }
71
72 private static SslContext configureTLS() throws CertificateException, SSLException {
73 SelfSignedCertificate ssc = new SelfSignedCertificate();
74 ApplicationProtocolConfig apn = new ApplicationProtocolConfig(
75 Protocol.ALPN,
76
77 SelectorFailureBehavior.NO_ADVERTISE,
78
79 SelectedListenerFailureBehavior.ACCEPT,
80 ApplicationProtocolNames.HTTP_2,
81 ApplicationProtocolNames.HTTP_1_1);
82
83 return SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey(), null)
84 .ciphers(CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
85 .applicationProtocolConfig(apn).build();
86 }
87 }