1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.eclipse.jetty.embedded;
21
22 import java.io.IOException;
23 import java.lang.management.ManagementFactory;
24 import java.util.Date;
25 import java.util.EnumSet;
26
27 import javax.servlet.DispatcherType;
28 import javax.servlet.Filter;
29 import javax.servlet.FilterChain;
30 import javax.servlet.FilterConfig;
31 import javax.servlet.Servlet;
32 import javax.servlet.ServletException;
33 import javax.servlet.ServletRequest;
34 import javax.servlet.ServletResponse;
35 import javax.servlet.http.Cookie;
36 import javax.servlet.http.HttpServlet;
37 import javax.servlet.http.HttpServletRequest;
38 import javax.servlet.http.HttpServletResponse;
39 import javax.servlet.http.HttpSession;
40
41 import org.eclipse.jetty.alpn.ALPN;
42 import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
43 import org.eclipse.jetty.http2.HTTP2Cipher;
44 import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
45 import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
46 import org.eclipse.jetty.jmx.MBeanContainer;
47 import org.eclipse.jetty.server.HttpConfiguration;
48 import org.eclipse.jetty.server.HttpConnectionFactory;
49 import org.eclipse.jetty.server.NegotiatingServerConnectionFactory;
50 import org.eclipse.jetty.server.Request;
51 import org.eclipse.jetty.server.SecureRequestCustomizer;
52 import org.eclipse.jetty.server.Server;
53 import org.eclipse.jetty.server.ServerConnector;
54 import org.eclipse.jetty.server.SslConnectionFactory;
55 import org.eclipse.jetty.servlet.DefaultServlet;
56 import org.eclipse.jetty.servlet.ServletContextHandler;
57 import org.eclipse.jetty.servlet.ServletHolder;
58 import org.eclipse.jetty.servlets.PushSessionCacheFilter;
59 import org.eclipse.jetty.util.ssl.SslContextFactory;
60
61
62
63
64
65 public class Http2Server
66 {
67 public static void main(String... args) throws Exception
68 {
69 Server server = new Server();
70
71 MBeanContainer mbContainer = new MBeanContainer(
72 ManagementFactory.getPlatformMBeanServer());
73 server.addBean(mbContainer);
74
75 ServletContextHandler context = new ServletContextHandler(server, "/",ServletContextHandler.SESSIONS);
76 context.setResourceBase("src/main/resources/docroot");
77 context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
78 context.addFilter(PushedTilesFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
79 context.addServlet(new ServletHolder(servlet), "/test/*");
80 context.addServlet(DefaultServlet.class, "/").setInitParameter("maxCacheSize","81920");
81 server.setHandler(context);
82
83
84 HttpConfiguration http_config = new HttpConfiguration();
85 http_config.setSecureScheme("https");
86 http_config.setSecurePort(8443);
87 http_config.setSendXPoweredBy(true);
88 http_config.setSendServerVersion(true);
89
90
91 ServerConnector http = new ServerConnector(server,new HttpConnectionFactory(http_config), new HTTP2CServerConnectionFactory(http_config));
92 http.setPort(8080);
93 server.addConnector(http);
94
95
96 String jetty_distro = System.getProperty("jetty.distro","../../jetty-distribution/target/distribution");
97 SslContextFactory sslContextFactory = new SslContextFactory();
98 sslContextFactory.setKeyStorePath(jetty_distro + "/demo-base/etc/keystore");
99 sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
100 sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
101 sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
102
103
104 HttpConfiguration https_config = new HttpConfiguration(http_config);
105 https_config.addCustomizer(new SecureRequestCustomizer());
106
107
108 HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(https_config);
109
110 NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable();
111 ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
112 alpn.setDefaultProtocol(http.getDefaultProtocol());
113
114
115 SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,alpn.getProtocol());
116
117
118 ServerConnector http2Connector =
119 new ServerConnector(server,ssl,alpn,h2,new HttpConnectionFactory(https_config));
120 http2Connector.setPort(8443);
121 server.addConnector(http2Connector);
122
123 ALPN.debug=false;
124
125 server.start();
126
127 server.join();
128 }
129
130 public static class PushedTilesFilter implements Filter
131 {
132 @Override
133 public void init(FilterConfig filterConfig) throws ServletException
134 {
135 }
136
137 @Override
138 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
139 {
140 Request baseRequest = Request.getBaseRequest(request);
141
142 if (baseRequest.isPush() && baseRequest.getRequestURI().contains("tiles") )
143 {
144 String uri = baseRequest.getRequestURI().replace("tiles","pushed").substring(baseRequest.getContextPath().length());
145 request.getRequestDispatcher(uri).forward(request,response);
146 return;
147 }
148
149 chain.doFilter(request,response);
150 }
151
152 @Override
153 public void destroy()
154 {
155 }
156 };
157
158 static Servlet servlet = new HttpServlet()
159 {
160 private static final long serialVersionUID = 1L;
161
162 @Override
163 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
164 {
165 String code=request.getParameter("code");
166 if (code!=null)
167 response.setStatus(Integer.parseInt(code));
168
169 HttpSession session = request.getSession(true);
170 if (session.isNew())
171 response.addCookie(new Cookie("bigcookie",
172 "This is a test cookies that was created on "+new Date()+" and is used by the jetty http/2 test servlet."));
173 response.setHeader("Custom","Value");
174 response.setContentType("text/plain");
175 String content = "Hello from Jetty using "+request.getProtocol() +"\n";
176 content+="uri="+request.getRequestURI()+"\n";
177 content+="session="+session.getId()+(session.isNew()?"(New)\n":"\n");
178 content+="date="+new Date()+"\n";
179
180 for (Cookie c : request.getCookies())
181 content+="cookie "+c.getName()+"="+c.getValue()+"\n";
182
183 response.setContentLength(content.length());
184 response.getOutputStream().print(content);
185 }
186 };
187 }