1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.example.http2.file;
17
18 import io.netty.bootstrap.ServerBootstrap;
19 import io.netty.channel.Channel;
20 import io.netty.channel.EventLoopGroup;
21 import io.netty.channel.nio.NioEventLoopGroup;
22 import io.netty.channel.socket.nio.NioServerSocketChannel;
23 import io.netty.handler.codec.http2.Http2SecurityUtil;
24 import io.netty.handler.logging.LogLevel;
25 import io.netty.handler.logging.LoggingHandler;
26 import io.netty.handler.ssl.ApplicationProtocolConfig;
27 import io.netty.handler.ssl.ApplicationProtocolNames;
28 import io.netty.handler.ssl.SslContext;
29 import io.netty.handler.ssl.SslContextBuilder;
30 import io.netty.handler.ssl.SslProvider;
31 import io.netty.handler.ssl.SupportedCipherSuiteFilter;
32 import io.netty.handler.ssl.util.SelfSignedCertificate;
33
34 public final class Http2StaticFileServer {
35
36 private static final int PORT = Integer.parseInt(System.getProperty("port", "8443"));
37
38 public static void main(String[] args) throws Exception {
39 SelfSignedCertificate ssc = new SelfSignedCertificate();
40 SslContext sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey())
41 .sslProvider(SslProvider.JDK)
42 .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
43 .applicationProtocolConfig(new ApplicationProtocolConfig(
44 ApplicationProtocolConfig.Protocol.ALPN,
45
46 ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE,
47
48 ApplicationProtocolConfig.SelectedListenerFailureBehavior.ACCEPT,
49 ApplicationProtocolNames.HTTP_2,
50 ApplicationProtocolNames.HTTP_1_1))
51 .build();
52
53 EventLoopGroup group = new NioEventLoopGroup();
54 try {
55 ServerBootstrap b = new ServerBootstrap();
56 b.group(group)
57 .channel(NioServerSocketChannel.class)
58 .handler(new LoggingHandler(LogLevel.INFO))
59 .childHandler(new Http2StaticFileServerInitializer(sslCtx));
60
61 Channel ch = b.bind(PORT).sync().channel();
62
63 System.out.println("Open your web browser and navigate to https://127.0.0.1:" + PORT + '/');
64
65 ch.closeFuture().sync();
66 } finally {
67 group.shutdownGracefully();
68 }
69 }
70 }