Mercurial Hosting > luan
annotate src/org/eclipse/jetty/server/Response.java @ 1075:ebb0f1343ef6
remove JBuffer
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Thu, 10 Nov 2016 03:08:20 -0700 |
parents | 27f3dc761452 |
children |
rev | line source |
---|---|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
1 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
2 // ======================================================================== |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
4 // ------------------------------------------------------------------------ |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 // All rights reserved. This program and the accompanying materials |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
6 // are made available under the terms of the Eclipse Public License v1.0 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
7 // and Apache License v2.0 which accompanies this distribution. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
8 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
9 // The Eclipse Public License is available at |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
10 // http://www.eclipse.org/legal/epl-v10.html |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
11 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
12 // The Apache License v2.0 is available at |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
13 // http://www.opensource.org/licenses/apache2.0.php |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
14 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
15 // You may elect to redistribute this code under either of these licenses. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
16 // ======================================================================== |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
17 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
18 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
19 package org.eclipse.jetty.server; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
20 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
21 import java.io.IOException; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
22 import java.io.PrintWriter; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
23 import java.util.Collection; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
24 import java.util.ArrayList; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
25 import java.util.Collections; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
26 import java.util.EnumSet; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
27 import java.util.Enumeration; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
28 import java.util.Locale; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
29 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 import javax.servlet.RequestDispatcher; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
31 import javax.servlet.ServletOutputStream; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
32 import javax.servlet.SessionTrackingMode; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
33 import javax.servlet.http.Cookie; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
34 import javax.servlet.http.HttpServletResponse; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
35 import javax.servlet.http.HttpSession; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
36 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
37 import org.eclipse.jetty.http.HttpCookie; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
38 import org.eclipse.jetty.http.HttpFields; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
39 import org.eclipse.jetty.http.HttpHeaderValues; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
40 import org.eclipse.jetty.http.HttpHeaders; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
41 import org.eclipse.jetty.http.HttpStatus; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
42 import org.eclipse.jetty.http.HttpURI; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
43 import org.eclipse.jetty.http.HttpVersions; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
44 import org.eclipse.jetty.http.MimeTypes; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
45 import org.eclipse.jetty.server.handler.ContextHandler; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
46 import org.eclipse.jetty.util.ByteArrayISO8859Writer; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
47 import org.eclipse.jetty.util.QuotedStringTokenizer; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
48 import org.eclipse.jetty.util.StringUtil; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
49 import org.eclipse.jetty.util.URIUtil; |
820
8e9db0bbf4f9
remove org.eclipse.jetty.util.log and upgrade slf4j
Franklin Schmidt <fschmidt@gmail.com>
parents:
813
diff
changeset
|
50 import org.slf4j.Logger; |
8e9db0bbf4f9
remove org.eclipse.jetty.util.log and upgrade slf4j
Franklin Schmidt <fschmidt@gmail.com>
parents:
813
diff
changeset
|
51 import org.slf4j.LoggerFactory; |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
52 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
53 /** Response. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
54 * <p> |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
55 * Implements {@link javax.servlet.http.HttpServletResponse} from the <code>javax.servlet.http</code> package. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
56 * </p> |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
57 */ |
999 | 58 public final class Response implements HttpServletResponse |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
59 { |
820
8e9db0bbf4f9
remove org.eclipse.jetty.util.log and upgrade slf4j
Franklin Schmidt <fschmidt@gmail.com>
parents:
813
diff
changeset
|
60 private static final Logger LOG = LoggerFactory.getLogger(Response.class); |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
61 |
813 | 62 |
63 public static final int | |
64 NONE=0, | |
65 STREAM=1, | |
66 WRITER=2; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
67 |
813 | 68 /** |
69 * If a header name starts with this string, the header (stripped of the prefix) | |
70 * can be set during include using only {@link #setHeader(String, String)} or | |
71 * {@link #addHeader(String, String)}. | |
72 */ | |
73 public final static String SET_INCLUDE_HEADER_PREFIX = "org.eclipse.jetty.server.include."; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
74 |
813 | 75 /** |
76 * If this string is found within the comment of a cookie added with {@link #addCookie(Cookie)}, then the cookie | |
77 * will be set as HTTP ONLY. | |
78 */ | |
79 public final static String HTTP_ONLY_COMMENT="__HTTP_ONLY__"; | |
80 | |
81 private final AbstractHttpConnection _connection; | |
999 | 82 private int _status = SC_OK; |
813 | 83 private String _reason; |
84 private Locale _locale; | |
85 private String _mimeType; | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
86 private String _cachedMimeType; |
813 | 87 private String _characterEncoding; |
88 private boolean _explicitEncoding; | |
89 private String _contentType; | |
90 private volatile int _outputState; | |
91 private PrintWriter _writer; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
92 |
813 | 93 public Response(AbstractHttpConnection connection) |
94 { | |
999 | 95 _connection = connection; |
813 | 96 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
97 |
813 | 98 public void addCookie(HttpCookie cookie) |
99 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
100 _connection._responseFields.addSetCookie(cookie); |
813 | 101 } |
102 | |
999 | 103 @Override |
813 | 104 public void addCookie(Cookie cookie) |
105 { | |
106 String comment=cookie.getComment(); | |
107 boolean http_only=false; | |
108 | |
109 if (comment!=null) | |
110 { | |
111 int i=comment.indexOf(HTTP_ONLY_COMMENT); | |
112 if (i>=0) | |
113 { | |
114 http_only=true; | |
115 comment=comment.replace(HTTP_ONLY_COMMENT,"").trim(); | |
116 if (comment.length()==0) | |
117 comment=null; | |
118 } | |
119 } | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
120 _connection._responseFields.addSetCookie(cookie.getName(), |
813 | 121 cookie.getValue(), |
122 cookie.getDomain(), | |
123 cookie.getPath(), | |
124 cookie.getMaxAge(), | |
125 comment, | |
126 cookie.getSecure(), | |
127 http_only || cookie.isHttpOnly(), | |
128 cookie.getVersion()); | |
129 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
130 |
999 | 131 @Override |
813 | 132 public boolean containsHeader(String name) |
133 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
134 return _connection._responseFields.containsKey(name); |
813 | 135 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
136 |
999 | 137 @Override |
813 | 138 public String encodeURL(String url) |
139 { | |
809
09d518d313b7
remove SessionManager
Franklin Schmidt <fschmidt@gmail.com>
parents:
802
diff
changeset
|
140 throw new UnsupportedOperationException(); |
813 | 141 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
142 |
999 | 143 @Override |
813 | 144 public String encodeRedirectURL(String url) |
145 { | |
999 | 146 throw new UnsupportedOperationException(); |
813 | 147 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
148 |
999 | 149 @Override |
813 | 150 @Deprecated |
151 public String encodeUrl(String url) | |
152 { | |
999 | 153 throw new UnsupportedOperationException(); |
813 | 154 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
155 |
999 | 156 @Override |
813 | 157 @Deprecated |
158 public String encodeRedirectUrl(String url) | |
159 { | |
999 | 160 throw new UnsupportedOperationException(); |
813 | 161 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
162 |
999 | 163 @Override |
813 | 164 public void sendError(int code, String message) throws IOException |
165 { | |
166 if (isCommitted()) | |
167 LOG.warn("Committed before "+code+" "+message); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
168 |
813 | 169 resetBuffer(); |
999 | 170 _characterEncoding = null; |
813 | 171 setHeader(HttpHeaders.EXPIRES,null); |
172 setHeader(HttpHeaders.LAST_MODIFIED,null); | |
173 setHeader(HttpHeaders.CACHE_CONTROL,null); | |
174 setHeader(HttpHeaders.CONTENT_TYPE,null); | |
175 setHeader(HttpHeaders.CONTENT_LENGTH,null); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
176 |
999 | 177 _outputState = NONE; |
813 | 178 setStatus(code,message); |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
179 |
813 | 180 if (message==null) |
181 message=HttpStatus.getMessage(code); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
182 |
813 | 183 // If we are allowed to have a body |
184 if (code!=SC_NO_CONTENT && | |
185 code!=SC_NOT_MODIFIED && | |
186 code!=SC_PARTIAL_CONTENT && | |
187 code>=SC_OK) | |
188 { | |
189 Request request = _connection.getRequest(); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
190 |
911 | 191 setHeader(HttpHeaders.CACHE_CONTROL, "must-revalidate,no-cache,no-store"); |
192 setContentType(MimeTypes.TEXT_HTML_8859_1); | |
193 ByteArrayISO8859Writer writer= new ByteArrayISO8859Writer(2048); | |
194 if (message != null) | |
813 | 195 { |
911 | 196 message= StringUtil.replace(message, "&", "&"); |
197 message= StringUtil.replace(message, "<", "<"); | |
198 message= StringUtil.replace(message, ">", ">"); | |
813 | 199 } |
911 | 200 String uri= request.getRequestURI(); |
201 if (uri!=null) | |
813 | 202 { |
911 | 203 uri= StringUtil.replace(uri, "&", "&"); |
204 uri= StringUtil.replace(uri, "<", "<"); | |
205 uri= StringUtil.replace(uri, ">", ">"); | |
206 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
207 |
911 | 208 writer.write("<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=ISO-8859-1\"/>\n"); |
209 writer.write("<title>Error "); | |
210 writer.write(Integer.toString(code)); | |
211 writer.write(' '); | |
212 if (message==null) | |
213 message=HttpStatus.getMessage(code); | |
214 writer.write(message); | |
215 writer.write("</title>\n</head>\n<body>\n<h2>HTTP ERROR: "); | |
216 writer.write(Integer.toString(code)); | |
217 writer.write("</h2>\n<p>Problem accessing "); | |
218 writer.write(uri); | |
219 writer.write(". Reason:\n<pre> "); | |
220 writer.write(message); | |
221 writer.write("</pre>"); | |
222 writer.write("</p>\n<hr /><i><small>Powered by Jetty://</small></i>"); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
223 |
911 | 224 for (int i= 0; i < 20; i++) |
225 writer.write("\n "); | |
226 writer.write("\n</body>\n</html>\n"); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
227 |
911 | 228 writer.flush(); |
229 setContentLength(writer.size()); | |
230 writer.writeTo(getOutputStream()); | |
231 writer.destroy(); | |
813 | 232 } |
233 else if (code!=SC_PARTIAL_CONTENT) | |
234 { | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
235 _connection._requestFields.remove(HttpHeaders.CONTENT_TYPE); |
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
236 _connection._requestFields.remove(HttpHeaders.CONTENT_LENGTH); |
999 | 237 _characterEncoding = null; |
238 _mimeType = null; | |
239 _cachedMimeType = null; | |
813 | 240 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
241 |
813 | 242 complete(); |
243 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
244 |
999 | 245 @Override |
813 | 246 public void sendError(int sc) throws IOException |
247 { | |
999 | 248 sendError(sc,null); |
813 | 249 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
250 |
999 | 251 @Override |
813 | 252 public void sendRedirect(String location) throws IOException |
253 { | |
254 if (location==null) | |
255 throw new IllegalArgumentException(); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
256 |
813 | 257 if (!URIUtil.hasScheme(location)) |
258 { | |
259 StringBuilder buf = _connection.getRequest().getRootURL(); | |
260 if (location.startsWith("/")) | |
261 buf.append(location); | |
262 else | |
263 { | |
264 String path=_connection.getRequest().getRequestURI(); | |
265 String parent=(path.endsWith("/"))?path:URIUtil.parentPath(path); | |
266 location=URIUtil.addPaths(parent,location); | |
267 if(location==null) | |
268 throw new IllegalStateException("path cannot be above root"); | |
269 if (!location.startsWith("/")) | |
270 buf.append('/'); | |
271 buf.append(location); | |
272 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
273 |
813 | 274 location=buf.toString(); |
275 HttpURI uri = new HttpURI(location); | |
276 String path=uri.getDecodedPath(); | |
277 String canonical=URIUtil.canonicalPath(path); | |
278 if (canonical==null) | |
279 throw new IllegalArgumentException(); | |
280 if (!canonical.equals(path)) | |
281 { | |
282 buf = _connection.getRequest().getRootURL(); | |
283 buf.append(URIUtil.encodePath(canonical)); | |
284 String param=uri.getParam(); | |
285 if (param!=null) | |
286 { | |
287 buf.append(';'); | |
288 buf.append(param); | |
289 } | |
290 String query=uri.getQuery(); | |
291 if (query!=null) | |
292 { | |
293 buf.append('?'); | |
294 buf.append(query); | |
295 } | |
296 String fragment=uri.getFragment(); | |
297 if (fragment!=null) | |
298 { | |
299 buf.append('#'); | |
300 buf.append(fragment); | |
301 } | |
302 location=buf.toString(); | |
303 } | |
304 } | |
305 | |
306 resetBuffer(); | |
307 setHeader(HttpHeaders.LOCATION,location); | |
308 setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); | |
309 complete(); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
310 |
813 | 311 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
312 |
999 | 313 @Override |
813 | 314 public void setDateHeader(String name, long date) |
315 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
316 _connection._responseFields.putDateField(name, date); |
813 | 317 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
318 |
999 | 319 @Override |
813 | 320 public void addDateHeader(String name, long date) |
321 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
322 _connection._responseFields.addDateField(name, date); |
813 | 323 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
324 |
999 | 325 @Override |
813 | 326 public void setHeader(String name, String value) |
327 { | |
328 if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) | |
329 setContentType(value); | |
330 else | |
331 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
332 _connection._responseFields.put(name, value); |
813 | 333 if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) |
334 { | |
335 if (value==null) | |
336 _connection._generator.setContentLength(-1); | |
337 else | |
338 _connection._generator.setContentLength(Long.parseLong(value)); | |
339 } | |
340 } | |
341 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
342 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
343 |
999 | 344 @Override |
813 | 345 public Collection<String> getHeaderNames() |
346 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
347 final HttpFields fields=_connection._responseFields; |
813 | 348 return fields.getFieldNamesCollection(); |
349 } | |
350 | |
999 | 351 @Override |
813 | 352 public String getHeader(String name) |
353 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
354 return _connection._responseFields.getStringField(name); |
813 | 355 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
356 |
999 | 357 @Override |
813 | 358 public Collection<String> getHeaders(String name) |
359 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
360 final HttpFields fields=_connection._responseFields; |
813 | 361 Collection<String> i = fields.getValuesCollection(name); |
362 if (i==null) | |
363 return Collections.EMPTY_LIST; | |
364 return i; | |
365 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
366 |
999 | 367 @Override |
813 | 368 public void addHeader(String name, String value) |
369 { | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
370 |
813 | 371 if (HttpHeaders.CONTENT_TYPE.equalsIgnoreCase(name)) |
372 { | |
373 setContentType(value); | |
374 return; | |
375 } | |
376 | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
377 _connection._responseFields.add(name, value); |
813 | 378 if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) |
379 _connection._generator.setContentLength(Long.parseLong(value)); | |
380 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
381 |
999 | 382 @Override |
813 | 383 public void setIntHeader(String name, int value) |
384 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
385 _connection._responseFields.putLongField(name, value); |
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
386 if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) |
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
387 _connection._generator.setContentLength(value); |
813 | 388 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
389 |
999 | 390 @Override |
813 | 391 public void addIntHeader(String name, int value) |
392 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
393 _connection._responseFields.addLongField(name, value); |
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
394 if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(name)) |
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
395 _connection._generator.setContentLength(value); |
813 | 396 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
397 |
999 | 398 @Override |
813 | 399 public void setStatus(int sc) |
400 { | |
401 setStatus(sc,null); | |
402 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
403 |
999 | 404 @Override |
813 | 405 public void setStatus(int sc, String sm) |
406 { | |
407 if (sc<=0) | |
408 throw new IllegalArgumentException(); | |
999 | 409 _status = sc; |
410 _reason = sm; | |
813 | 411 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
412 |
999 | 413 @Override |
813 | 414 public String getCharacterEncoding() |
415 { | |
416 if (_characterEncoding==null) | |
999 | 417 _characterEncoding = StringUtil.__ISO_8859_1; |
813 | 418 return _characterEncoding; |
419 } | |
420 | |
999 | 421 @Override |
813 | 422 public String getContentType() |
423 { | |
424 return _contentType; | |
425 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
426 |
999 | 427 @Override |
813 | 428 public ServletOutputStream getOutputStream() throws IOException |
429 { | |
430 if (_outputState!=NONE && _outputState!=STREAM) | |
431 throw new IllegalStateException("WRITER"); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
432 |
813 | 433 ServletOutputStream out = _connection.getOutputStream(); |
999 | 434 _outputState = STREAM; |
813 | 435 return out; |
436 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
437 |
999 | 438 @Override |
813 | 439 public PrintWriter getWriter() throws IOException |
440 { | |
441 if (_outputState!=NONE && _outputState!=WRITER) | |
442 throw new IllegalStateException("STREAM"); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
443 |
813 | 444 /* if there is no writer yet */ |
445 if (_writer==null) | |
446 { | |
447 /* get encoding from Content-Type header */ | |
448 String encoding = _characterEncoding; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
449 |
813 | 450 if (encoding==null) |
451 { | |
452 /* implementation of educated defaults */ | |
453 if(_cachedMimeType != null) | |
454 encoding = MimeTypes.getCharsetFromContentType(_cachedMimeType); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
455 |
813 | 456 if (encoding==null) |
457 encoding = StringUtil.__ISO_8859_1; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
458 |
813 | 459 setCharacterEncoding(encoding); |
460 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
461 |
813 | 462 /* construct Writer using correct encoding */ |
463 _writer = _connection.getPrintWriter(encoding); | |
464 } | |
465 _outputState=WRITER; | |
466 return _writer; | |
467 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
468 |
999 | 469 @Override |
813 | 470 public void setCharacterEncoding(String encoding) |
471 { | |
472 if (this._outputState==0 && !isCommitted()) | |
473 { | |
999 | 474 _explicitEncoding = true; |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
475 |
813 | 476 if (encoding==null) |
477 { | |
478 // Clear any encoding. | |
479 if (_characterEncoding!=null) | |
480 { | |
481 _characterEncoding=null; | |
482 if (_cachedMimeType!=null) | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
483 _contentType = _cachedMimeType; |
813 | 484 else if (_mimeType!=null) |
999 | 485 _contentType = _mimeType; |
813 | 486 else |
999 | 487 _contentType = null; |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
488 |
813 | 489 if (_contentType==null) |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
490 _connection._responseFields.remove(HttpHeaders.CONTENT_TYPE); |
813 | 491 else |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
492 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 493 } |
494 } | |
495 else | |
496 { | |
497 // No, so just add this one to the mimetype | |
498 _characterEncoding=encoding; | |
499 if (_contentType!=null) | |
500 { | |
501 int i0=_contentType.indexOf(';'); | |
502 if (i0<0) | |
503 { | |
504 _contentType=null; | |
505 if(_cachedMimeType!=null) | |
506 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
507 String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); |
813 | 508 if (content_type!=null) |
509 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
510 _contentType = content_type; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
511 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 512 } |
513 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
514 |
813 | 515 if (_contentType==null) |
516 { | |
517 _contentType = _mimeType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
518 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 519 } |
520 } | |
521 else | |
522 { | |
523 int i1=_contentType.indexOf("charset=",i0); | |
524 if (i1<0) | |
525 { | |
526 _contentType = _contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); | |
527 } | |
528 else | |
529 { | |
530 int i8=i1+8; | |
531 int i2=_contentType.indexOf(" ",i8); | |
532 if (i2<0) | |
533 _contentType=_contentType.substring(0,i8)+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); | |
534 else | |
535 _contentType=_contentType.substring(0,i8)+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= ")+_contentType.substring(i2); | |
536 } | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
537 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 538 } |
539 } | |
540 } | |
541 } | |
542 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
543 |
999 | 544 @Override |
813 | 545 public void setContentLength(int len) |
546 { | |
547 // Protect from setting after committed as default handling | |
548 // of a servlet HEAD request ALWAYS sets _content length, even | |
549 // if the getHandling committed the response! | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
550 if (isCommitted()) |
813 | 551 return; |
552 _connection._generator.setContentLength(len); | |
553 if (len>0) | |
554 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
555 _connection._responseFields.putLongField(HttpHeaders.CONTENT_LENGTH, len); |
813 | 556 if (_connection._generator.isAllContentWritten()) |
557 { | |
558 if (_outputState==WRITER) | |
559 _writer.close(); | |
560 else if (_outputState==STREAM) | |
561 { | |
562 try | |
563 { | |
564 getOutputStream().close(); | |
565 } | |
566 catch(IOException e) | |
567 { | |
568 throw new RuntimeException(e); | |
569 } | |
570 } | |
571 } | |
572 } | |
573 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
574 |
999 | 575 @Override |
813 | 576 public void setContentType(String contentType) |
577 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
578 if (isCommitted()) |
813 | 579 return; |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
580 |
813 | 581 // Yes this method is horribly complex.... but there are lots of special cases and |
582 // as this method is called on every request, it is worth trying to save string creation. | |
583 // | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
584 |
813 | 585 if (contentType==null) |
586 { | |
587 if (_locale==null) | |
999 | 588 _characterEncoding = null; |
589 _mimeType = null; | |
590 _cachedMimeType = null; | |
813 | 591 _contentType=null; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
592 _connection._responseFields.remove(HttpHeaders.CONTENT_TYPE); |
813 | 593 } |
594 else | |
595 { | |
596 // Look for encoding in contentType | |
597 int i0=contentType.indexOf(';'); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
598 |
813 | 599 if (i0>0) |
600 { | |
601 // we have content type parameters | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
602 |
813 | 603 // Extract params off mimetype |
999 | 604 _mimeType = contentType.substring(0,i0).trim(); |
605 _cachedMimeType = MimeTypes.CACHE.get(_mimeType); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
606 |
813 | 607 // Look for charset |
608 int i1=contentType.indexOf("charset=",i0+1); | |
609 if (i1>=0) | |
610 { | |
999 | 611 _explicitEncoding = true; |
813 | 612 int i8=i1+8; |
613 int i2 = contentType.indexOf(' ',i8); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
614 |
813 | 615 if (_outputState==WRITER) |
616 { | |
617 // strip the charset and ignore; | |
618 if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) | |
619 { | |
620 if (_cachedMimeType!=null) | |
621 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
622 String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); |
813 | 623 if (content_type!=null) |
624 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
625 _contentType=content_type; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
626 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 627 } |
628 else | |
629 { | |
999 | 630 _contentType = _mimeType+";charset="+_characterEncoding; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
631 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 632 } |
633 } | |
634 else | |
635 { | |
999 | 636 _contentType = _mimeType+";charset="+_characterEncoding; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
637 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 638 } |
639 } | |
640 else if (i2<0) | |
641 { | |
642 _contentType=contentType.substring(0,i1)+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
643 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 644 } |
645 else | |
646 { | |
647 _contentType=contentType.substring(0,i1)+contentType.substring(i2)+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
648 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 649 } |
650 } | |
651 else if ((i1==i0+1 && i2<0) || (i1==i0+2 && i2<0 && contentType.charAt(i0+1)==' ')) | |
652 { | |
653 // The params are just the char encoding | |
999 | 654 _cachedMimeType = MimeTypes.CACHE.get(_mimeType); |
813 | 655 _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8)); |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
656 |
813 | 657 if (_cachedMimeType!=null) |
658 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
659 String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); |
813 | 660 if (content_type!=null) |
661 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
662 _contentType=content_type; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
663 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 664 } |
665 else | |
666 { | |
667 _contentType=contentType; | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
668 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 669 } |
670 } | |
671 else | |
672 { | |
673 _contentType=contentType; | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
674 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 675 } |
676 } | |
677 else if (i2>0) | |
678 { | |
679 _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8,i2)); | |
680 _contentType=contentType; | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
681 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 682 } |
683 else | |
684 { | |
685 _characterEncoding = QuotedStringTokenizer.unquote(contentType.substring(i8)); | |
686 _contentType=contentType; | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
687 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 688 } |
689 } | |
690 else // No encoding in the params. | |
691 { | |
999 | 692 _cachedMimeType = null; |
813 | 693 _contentType=_characterEncoding==null?contentType:contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
694 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 695 } |
696 } | |
697 else // No params at all | |
698 { | |
999 | 699 _mimeType = contentType; |
700 _cachedMimeType = MimeTypes.CACHE.get(_mimeType); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
701 |
813 | 702 if (_characterEncoding!=null) |
703 { | |
704 if (_cachedMimeType!=null) | |
705 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
706 String content_type = MimeTypes.getAssociate(_cachedMimeType,_characterEncoding); |
813 | 707 if (content_type!=null) |
708 { | |
1023
27f3dc761452
MimeTypes uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1022
diff
changeset
|
709 _contentType=content_type; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
710 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 711 } |
712 else | |
713 { | |
999 | 714 _contentType = _mimeType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
715 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 716 } |
717 } | |
718 else | |
719 { | |
720 _contentType=contentType+";charset="+QuotedStringTokenizer.quoteIfNeeded(_characterEncoding,";= "); | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
721 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 722 } |
723 } | |
724 else if (_cachedMimeType!=null) | |
725 { | |
999 | 726 _contentType = _cachedMimeType.toString(); |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
727 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 728 } |
729 else | |
730 { | |
731 _contentType=contentType; | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
732 _connection._responseFields.put(HttpHeaders.CONTENT_TYPE,_contentType); |
813 | 733 } |
734 } | |
735 } | |
736 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
737 |
999 | 738 @Override |
813 | 739 public void setBufferSize(int size) |
740 { | |
983
23ec25435b8c
simplify AbstractGenerator
Franklin Schmidt <fschmidt@gmail.com>
parents:
982
diff
changeset
|
741 throw new UnsupportedOperationException(); |
813 | 742 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
743 |
999 | 744 @Override |
813 | 745 public int getBufferSize() |
746 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
747 return _connection._generator.getContentBufferSize(); |
813 | 748 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
749 |
999 | 750 @Override |
813 | 751 public void flushBuffer() throws IOException |
752 { | |
753 _connection.flushResponse(); | |
754 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
755 |
999 | 756 @Override |
813 | 757 public void reset() |
758 { | |
759 resetBuffer(); | |
760 fwdReset(); | |
999 | 761 _status = 200; |
762 _reason = null; | |
813 | 763 |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
764 HttpFields response_fields=_connection._responseFields; |
813 | 765 |
766 response_fields.clear(); | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
767 String connection=_connection._requestFields.getStringField(HttpHeaders.CONNECTION); |
813 | 768 if (connection!=null) |
769 { | |
770 String[] values = connection.split(","); | |
771 for (int i=0;values!=null && i<values.length;i++) | |
772 { | |
1020
6be43ef1eb96
HttpHeaderValues uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1018
diff
changeset
|
773 int cb = HttpHeaderValues.CACHE.getOrdinal(values[0].trim()); |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
774 |
1020
6be43ef1eb96
HttpHeaderValues uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1018
diff
changeset
|
775 if (cb != -1) |
813 | 776 { |
1020
6be43ef1eb96
HttpHeaderValues uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1018
diff
changeset
|
777 switch(cb) |
813 | 778 { |
779 case HttpHeaderValues.CLOSE_ORDINAL: | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
780 response_fields.put(HttpHeaders.CONNECTION,HttpHeaderValues.CLOSE); |
813 | 781 break; |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
782 |
813 | 783 case HttpHeaderValues.KEEP_ALIVE_ORDINAL: |
784 if (HttpVersions.HTTP_1_0.equalsIgnoreCase(_connection.getRequest().getProtocol())) | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
785 response_fields.put(HttpHeaders.CONNECTION,HttpHeaderValues.KEEP_ALIVE); |
813 | 786 break; |
787 case HttpHeaderValues.TE_ORDINAL: | |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
788 response_fields.put(HttpHeaders.CONNECTION,HttpHeaderValues.TE); |
813 | 789 break; |
790 } | |
791 } | |
792 } | |
793 } | |
794 } | |
795 | |
796 | |
999 | 797 private void fwdReset() |
813 | 798 { |
799 resetBuffer(); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
800 |
813 | 801 _writer=null; |
802 _outputState=NONE; | |
803 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
804 |
999 | 805 @Override |
813 | 806 public void resetBuffer() |
807 { | |
808 if (isCommitted()) | |
809 throw new IllegalStateException("Committed"); | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
810 _connection._generator.resetBuffer(); |
813 | 811 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
812 |
999 | 813 @Override |
813 | 814 public boolean isCommitted() |
815 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
816 return _connection._generator.isCommitted(); |
813 | 817 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
818 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
819 |
999 | 820 @Override |
813 | 821 public void setLocale(Locale locale) |
822 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
823 if (locale == null || isCommitted()) |
813 | 824 return; |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
825 |
813 | 826 _locale = locale; |
1022
3718afd99988
HttpHeaders uses StringCache
Franklin Schmidt <fschmidt@gmail.com>
parents:
1020
diff
changeset
|
827 _connection._responseFields.put(HttpHeaders.CONTENT_LANGUAGE,locale.toString().replace('_','-')); |
813 | 828 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
829 |
999 | 830 @Override |
813 | 831 public Locale getLocale() |
832 { | |
833 if (_locale==null) | |
834 return Locale.getDefault(); | |
835 return _locale; | |
836 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
837 |
813 | 838 /* ------------------------------------------------------------ */ |
839 /** | |
840 * @return The HTTP status code that has been set for this request. This will be <code>200<code> | |
841 * ({@link HttpServletResponse#SC_OK}), unless explicitly set through one of the <code>setStatus</code> methods. | |
842 */ | |
843 public int getStatus() | |
844 { | |
845 return _status; | |
846 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
847 |
813 | 848 /* ------------------------------------------------------------ */ |
849 /** | |
850 * @return The reason associated with the current {@link #getStatus() status}. This will be <code>null</code>, | |
851 * unless one of the <code>setStatus</code> methods have been called. | |
852 */ | |
853 public String getReason() | |
854 { | |
855 return _reason; | |
856 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
857 |
813 | 858 public void complete() |
859 throws IOException | |
860 { | |
861 _connection.completeResponse(); | |
862 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
863 |
813 | 864 /* ------------------------------------------------------------- */ |
865 /** | |
866 * @return the number of bytes actually written in response body | |
867 */ | |
868 public long getContentCount() | |
869 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
870 if (_connection==null) |
813 | 871 return -1; |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
872 return _connection._generator.getContentWritten(); |
813 | 873 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
874 |
813 | 875 public HttpFields getHttpFields() |
876 { | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
877 return _connection._responseFields; |
813 | 878 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
879 |
813 | 880 @Override |
881 public String toString() | |
882 { | |
883 return "HTTP/1.1 "+_status+" "+ (_reason==null?"":_reason) +System.getProperty("line.separator")+ | |
972
5ee36654b383
simplify AbstractHttpConnection
Franklin Schmidt <fschmidt@gmail.com>
parents:
911
diff
changeset
|
884 _connection._responseFields.toString(); |
813 | 885 } |
886 | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
887 } |