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.MultiThreadIoEventLoopGroup;
22 import io.netty.channel.nio.NioIoHandler;
23 import io.netty.channel.socket.nio.NioServerSocketChannel;
24 import io.netty.handler.codec.http2.Http2SecurityUtil;
25 import io.netty.handler.logging.LogLevel;
26 import io.netty.handler.logging.LoggingHandler;
27 import io.netty.handler.ssl.ApplicationProtocolConfig;
28 import io.netty.handler.ssl.ApplicationProtocolNames;
29 import io.netty.handler.ssl.SslContext;
30 import io.netty.handler.ssl.SslContextBuilder;
31 import io.netty.handler.ssl.SslProvider;
32 import io.netty.handler.ssl.SupportedCipherSuiteFilter;
33 import io.netty.pkitesting.CertificateBuilder;
34 import io.netty.pkitesting.X509Bundle;
35
36 public final class Http2StaticFileServer {
37
38 private static final int PORT = Integer.parseInt(System.getProperty("port", "8443"));
39
40 public static void main(String[] args) throws Exception {
41 X509Bundle ssc = new CertificateBuilder()
42 .subject("cn=localhost")
43 .setIsCertificateAuthority(true)
44 .buildSelfSigned();
45
46 SslContext sslCtx = SslContextBuilder.forServer(ssc.toKeyManagerFactory())
47 .sslProvider(SslProvider.JDK)
48 .ciphers(Http2SecurityUtil.CIPHERS, SupportedCipherSuiteFilter.INSTANCE)
49 .applicationProtocolConfig(new ApplicationProtocolConfig(
50 ApplicationProtocolConfig.Protocol.ALPN,
51
52 ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE,
53
54 ApplicationProtocolConfig.SelectedListenerFailureBehavior.ACCEPT,
55 ApplicationProtocolNames.HTTP_2,
56 ApplicationProtocolNames.HTTP_1_1))
57 .build();
58
59 EventLoopGroup bossGroup = new MultiThreadIoEventLoopGroup(2, NioIoHandler.newFactory());
60 EventLoopGroup workerGroup = new MultiThreadIoEventLoopGroup(4, NioIoHandler.newFactory());
61 try {
62 ServerBootstrap b = new ServerBootstrap();
63 b.group(bossGroup, workerGroup)
64 .channel(NioServerSocketChannel.class)
65 .handler(new LoggingHandler(LogLevel.INFO))
66 .childHandler(new Http2StaticFileServerInitializer(sslCtx));
67
68 Channel ch = b.bind(PORT).sync().channel();
69
70 System.out.println("Open your web browser and navigate to https://127.0.0.1:" + PORT + '/');
71
72 ch.closeFuture().sync();
73 } finally {
74 bossGroup.shutdownGracefully();
75 workerGroup.shutdownGracefully();
76 }
77 }
78 }