Mercurial Hosting > luan
comparison src/org/eclipse/jetty/server/handler/DefaultHandler.java @ 802:3428c60d7cfc
replace jetty jars with source
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Wed, 07 Sep 2016 21:15:48 -0600 |
parents | |
children | 947b11aa3157 |
comparison
equal
deleted
inserted
replaced
801:6a21393191c1 | 802:3428c60d7cfc |
---|---|
1 // | |
2 // ======================================================================== | |
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. | |
4 // ------------------------------------------------------------------------ | |
5 // All rights reserved. This program and the accompanying materials | |
6 // are made available under the terms of the Eclipse Public License v1.0 | |
7 // and Apache License v2.0 which accompanies this distribution. | |
8 // | |
9 // The Eclipse Public License is available at | |
10 // http://www.eclipse.org/legal/epl-v10.html | |
11 // | |
12 // The Apache License v2.0 is available at | |
13 // http://www.opensource.org/licenses/apache2.0.php | |
14 // | |
15 // You may elect to redistribute this code under either of these licenses. | |
16 // ======================================================================== | |
17 // | |
18 | |
19 package org.eclipse.jetty.server.handler; | |
20 | |
21 import java.io.IOException; | |
22 import java.io.OutputStream; | |
23 import java.net.URL; | |
24 | |
25 import javax.servlet.ServletException; | |
26 import javax.servlet.http.HttpServletRequest; | |
27 import javax.servlet.http.HttpServletResponse; | |
28 | |
29 import org.eclipse.jetty.http.HttpHeaders; | |
30 import org.eclipse.jetty.http.HttpMethods; | |
31 import org.eclipse.jetty.http.MimeTypes; | |
32 import org.eclipse.jetty.server.Handler; | |
33 import org.eclipse.jetty.server.Request; | |
34 import org.eclipse.jetty.server.Server; | |
35 import org.eclipse.jetty.util.ByteArrayISO8859Writer; | |
36 import org.eclipse.jetty.util.IO; | |
37 import org.eclipse.jetty.util.log.Log; | |
38 import org.eclipse.jetty.util.log.Logger; | |
39 import org.eclipse.jetty.util.resource.Resource; | |
40 | |
41 | |
42 /* ------------------------------------------------------------ */ | |
43 /** Default Handler. | |
44 * | |
45 * This handle will deal with unhandled requests in the server. | |
46 * For requests for favicon.ico, the Jetty icon is served. | |
47 * For reqests to '/' a 404 with a list of known contexts is served. | |
48 * For all other requests a normal 404 is served. | |
49 * TODO Implement OPTIONS and TRACE methods for the server. | |
50 * | |
51 * | |
52 * @org.apache.xbean.XBean | |
53 */ | |
54 public class DefaultHandler extends AbstractHandler | |
55 { | |
56 private static final Logger LOG = Log.getLogger(DefaultHandler.class); | |
57 | |
58 final long _faviconModified=(System.currentTimeMillis()/1000)*1000L; | |
59 byte[] _favicon; | |
60 boolean _serveIcon=true; | |
61 boolean _showContexts=true; | |
62 | |
63 public DefaultHandler() | |
64 { | |
65 try | |
66 { | |
67 URL fav = this.getClass().getClassLoader().getResource("org/eclipse/jetty/favicon.ico"); | |
68 if (fav!=null) | |
69 { | |
70 Resource r = Resource.newResource(fav); | |
71 _favicon=IO.readBytes(r.getInputStream()); | |
72 } | |
73 } | |
74 catch(Exception e) | |
75 { | |
76 LOG.warn(e); | |
77 } | |
78 } | |
79 | |
80 /* ------------------------------------------------------------ */ | |
81 /* | |
82 * @see org.eclipse.jetty.server.server.Handler#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, int) | |
83 */ | |
84 public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException | |
85 { | |
86 if (response.isCommitted() || baseRequest.isHandled()) | |
87 return; | |
88 | |
89 baseRequest.setHandled(true); | |
90 | |
91 String method=request.getMethod(); | |
92 | |
93 // little cheat for common request | |
94 if (_serveIcon && _favicon!=null && method.equals(HttpMethods.GET) && request.getRequestURI().equals("/favicon.ico")) | |
95 { | |
96 if (request.getDateHeader(HttpHeaders.IF_MODIFIED_SINCE)==_faviconModified) | |
97 response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); | |
98 else | |
99 { | |
100 response.setStatus(HttpServletResponse.SC_OK); | |
101 response.setContentType("image/x-icon"); | |
102 response.setContentLength(_favicon.length); | |
103 response.setDateHeader(HttpHeaders.LAST_MODIFIED, _faviconModified); | |
104 response.setHeader(HttpHeaders.CACHE_CONTROL,"max-age=360000,public"); | |
105 response.getOutputStream().write(_favicon); | |
106 } | |
107 return; | |
108 } | |
109 | |
110 | |
111 if (!method.equals(HttpMethods.GET) || !request.getRequestURI().equals("/")) | |
112 { | |
113 response.sendError(HttpServletResponse.SC_NOT_FOUND); | |
114 return; | |
115 } | |
116 | |
117 response.setStatus(HttpServletResponse.SC_NOT_FOUND); | |
118 response.setContentType(MimeTypes.TEXT_HTML); | |
119 | |
120 ByteArrayISO8859Writer writer = new ByteArrayISO8859Writer(1500); | |
121 | |
122 writer.write("<HTML>\n<HEAD>\n<TITLE>Error 404 - Not Found"); | |
123 writer.write("</TITLE>\n<BODY>\n<H2>Error 404 - Not Found.</H2>\n"); | |
124 writer.write("No context on this server matched or handled this request.<BR>"); | |
125 | |
126 if (_showContexts) | |
127 { | |
128 writer.write("Contexts known to this server are: <ul>"); | |
129 | |
130 Server server = getServer(); | |
131 Handler[] handlers = server==null?null:server.getChildHandlersByClass(ContextHandler.class); | |
132 | |
133 for (int i=0;handlers!=null && i<handlers.length;i++) | |
134 { | |
135 ContextHandler context = (ContextHandler)handlers[i]; | |
136 if (context.isRunning()) | |
137 { | |
138 writer.write("<li><a href=\""); | |
139 if (context.getVirtualHosts()!=null && context.getVirtualHosts().length>0) | |
140 writer.write("http://"+context.getVirtualHosts()[0]+":"+request.getLocalPort()); | |
141 writer.write(context.getContextPath()); | |
142 if (context.getContextPath().length()>1 && context.getContextPath().endsWith("/")) | |
143 writer.write("/"); | |
144 writer.write("\">"); | |
145 writer.write(context.getContextPath()); | |
146 if (context.getVirtualHosts()!=null && context.getVirtualHosts().length>0) | |
147 writer.write(" @ "+context.getVirtualHosts()[0]+":"+request.getLocalPort()); | |
148 writer.write(" ---> "); | |
149 writer.write(context.toString()); | |
150 writer.write("</a></li>\n"); | |
151 } | |
152 else | |
153 { | |
154 writer.write("<li>"); | |
155 writer.write(context.getContextPath()); | |
156 if (context.getVirtualHosts()!=null && context.getVirtualHosts().length>0) | |
157 writer.write(" @ "+context.getVirtualHosts()[0]+":"+request.getLocalPort()); | |
158 writer.write(" ---> "); | |
159 writer.write(context.toString()); | |
160 if (context.isFailed()) | |
161 writer.write(" [failed]"); | |
162 if (context.isStopped()) | |
163 writer.write(" [stopped]"); | |
164 writer.write("</li>\n"); | |
165 } | |
166 } | |
167 } | |
168 | |
169 for (int i=0;i<10;i++) | |
170 writer.write("\n<!-- Padding for IE -->"); | |
171 | |
172 writer.write("\n</BODY>\n</HTML>\n"); | |
173 writer.flush(); | |
174 response.setContentLength(writer.size()); | |
175 OutputStream out=response.getOutputStream(); | |
176 writer.writeTo(out); | |
177 out.close(); | |
178 } | |
179 | |
180 /* ------------------------------------------------------------ */ | |
181 /** | |
182 * @return Returns true if the handle can server the jetty favicon.ico | |
183 */ | |
184 public boolean getServeIcon() | |
185 { | |
186 return _serveIcon; | |
187 } | |
188 | |
189 /* ------------------------------------------------------------ */ | |
190 /** | |
191 * @param serveIcon true if the handle can server the jetty favicon.ico | |
192 */ | |
193 public void setServeIcon(boolean serveIcon) | |
194 { | |
195 _serveIcon = serveIcon; | |
196 } | |
197 | |
198 public boolean getShowContexts() | |
199 { | |
200 return _showContexts; | |
201 } | |
202 | |
203 public void setShowContexts(boolean show) | |
204 { | |
205 _showContexts = show; | |
206 } | |
207 | |
208 } |