1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package io.netty.example.http2.helloworld.frame.server;
18
19 import io.netty.bootstrap.ServerBootstrap;
20 import io.netty.channel.Channel;
21 import io.netty.channel.ChannelOption;
22 import io.netty.channel.EventLoopGroup;
23 import io.netty.channel.MultiThreadIoEventLoopGroup;
24 import io.netty.channel.nio.NioIoHandler;
25 import io.netty.channel.socket.nio.NioServerSocketChannel;
26 import io.netty.handler.codec.http2.Http2SecurityUtil;
27 import io.netty.handler.logging.LogLevel;
28 import io.netty.handler.logging.LoggingHandler;
29 import io.netty.handler.ssl.ApplicationProtocolConfig;
30 import io.netty.handler.ssl.ApplicationProtocolConfig.Protocol;
31 import io.netty.handler.ssl.ApplicationProtocolConfig.SelectedListenerFailureBehavior;
32 import io.netty.handler.ssl.ApplicationProtocolConfig.SelectorFailureBehavior;
33 import io.netty.handler.ssl.ApplicationProtocolNames;
34 import io.netty.handler.ssl.OpenSsl;
35 import io.netty.handler.ssl.SslContext;
36 import io.netty.handler.ssl.SslContextBuilder;
37 import io.netty.handler.ssl.SslProvider;
38 import io.netty.handler.ssl.SupportedCipherSuiteFilter;
39 import io.netty.pkitesting.CertificateBuilder;
40 import io.netty.pkitesting.X509Bundle;
41
42
43
44
45
46
47
48
49 public final class Http2Server {
50
51 static final boolean SSL = System.getProperty("ssl") != null;
52
53 static final int PORT = Integer.parseInt(System.getProperty("port", SSL? "8443" : "8080"));
54
55 public static void main(String[] args) throws Exception {
56
57 final SslContext sslCtx;
58 if (SSL) {
59 SslProvider provider = OpenSsl.isAlpnSupported() ? SslProvider.OPENSSL : SslProvider.JDK;
60 X509Bundle ssc = new CertificateBuilder()
61 .subject("cn=localhost")
62 .setIsCertificateAuthority(true)
63 .buildSelfSigned();
64 sslCtx = SslContextBuilder.forServer(ssc.toKeyManagerFactory())
65 .sslProvider(provider)
66
67
68 .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
69 .applicationProtocolConfig(new ApplicationProtocolConfig(
70 Protocol.ALPN,
71
72 SelectorFailureBehavior.NO_ADVERTISE,
73
74 SelectedListenerFailureBehavior.ACCEPT,
75 ApplicationProtocolNames.HTTP_2,
76 ApplicationProtocolNames.HTTP_1_1))
77 .build();
78 } else {
79 sslCtx = null;
80 }
81
82 EventLoopGroup group = new MultiThreadIoEventLoopGroup(NioIoHandler.newFactory());
83 try {
84 ServerBootstrap b = new ServerBootstrap();
85 b.option(ChannelOption.SO_BACKLOG, 1024);
86 b.group(group)
87 .channel(NioServerSocketChannel.class)
88 .handler(new LoggingHandler(LogLevel.INFO))
89 .childHandler(new Http2ServerInitializer(sslCtx));
90
91 Channel ch = b.bind(PORT).sync().channel();
92
93 System.err.println("Open your HTTP/2-enabled web browser and navigate to " +
94 (SSL? "https" : "http") + "://127.0.0.1:" + PORT + '/');
95
96 ch.closeFuture().sync();
97 } finally {
98 group.shutdownGracefully();
99 }
100 }
101 }