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