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