Mercurial Hosting > luan
comparison src/org/eclipse/jetty/server/Request.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 | 09d518d313b7 |
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; | |
20 | |
21 import java.io.BufferedReader; | |
22 import java.io.ByteArrayOutputStream; | |
23 import java.io.File; | |
24 import java.io.IOException; | |
25 import java.io.InputStream; | |
26 import java.io.InputStreamReader; | |
27 import java.io.UnsupportedEncodingException; | |
28 import java.net.InetAddress; | |
29 import java.nio.ByteBuffer; | |
30 import java.security.Principal; | |
31 import java.util.Collection; | |
32 import java.util.Collections; | |
33 import java.util.Enumeration; | |
34 import java.util.EventListener; | |
35 import java.util.HashMap; | |
36 import java.util.Iterator; | |
37 import java.util.List; | |
38 import java.util.Locale; | |
39 import java.util.Map; | |
40 import java.util.Map.Entry; | |
41 | |
42 import javax.servlet.AsyncContext; | |
43 import javax.servlet.AsyncEvent; | |
44 import javax.servlet.AsyncListener; | |
45 import javax.servlet.DispatcherType; | |
46 import javax.servlet.MultipartConfigElement; | |
47 import javax.servlet.RequestDispatcher; | |
48 import javax.servlet.ServletContext; | |
49 import javax.servlet.ServletException; | |
50 import javax.servlet.ServletInputStream; | |
51 import javax.servlet.ServletRequest; | |
52 import javax.servlet.ServletRequestAttributeEvent; | |
53 import javax.servlet.ServletRequestAttributeListener; | |
54 import javax.servlet.ServletRequestEvent; | |
55 import javax.servlet.ServletRequestListener; | |
56 import javax.servlet.ServletResponse; | |
57 import javax.servlet.http.Cookie; | |
58 import javax.servlet.http.HttpServletRequest; | |
59 import javax.servlet.http.HttpServletResponse; | |
60 import javax.servlet.http.HttpSession; | |
61 import javax.servlet.http.Part; | |
62 | |
63 import org.eclipse.jetty.continuation.Continuation; | |
64 import org.eclipse.jetty.continuation.ContinuationListener; | |
65 import org.eclipse.jetty.http.HttpCookie; | |
66 import org.eclipse.jetty.http.HttpFields; | |
67 import org.eclipse.jetty.http.HttpHeaders; | |
68 import org.eclipse.jetty.http.HttpMethods; | |
69 import org.eclipse.jetty.http.HttpParser; | |
70 import org.eclipse.jetty.http.HttpStatus; | |
71 import org.eclipse.jetty.http.HttpURI; | |
72 import org.eclipse.jetty.http.HttpVersions; | |
73 import org.eclipse.jetty.http.MimeTypes; | |
74 import org.eclipse.jetty.io.Buffer; | |
75 import org.eclipse.jetty.io.BufferUtil; | |
76 import org.eclipse.jetty.io.ByteArrayBuffer; | |
77 import org.eclipse.jetty.io.EndPoint; | |
78 import org.eclipse.jetty.io.nio.DirectNIOBuffer; | |
79 import org.eclipse.jetty.io.nio.IndirectNIOBuffer; | |
80 import org.eclipse.jetty.io.nio.NIOBuffer; | |
81 import org.eclipse.jetty.server.handler.ContextHandler; | |
82 import org.eclipse.jetty.server.handler.ContextHandler.Context; | |
83 import org.eclipse.jetty.util.Attributes; | |
84 import org.eclipse.jetty.util.AttributesMap; | |
85 import org.eclipse.jetty.util.IO; | |
86 import org.eclipse.jetty.util.LazyList; | |
87 import org.eclipse.jetty.util.MultiException; | |
88 import org.eclipse.jetty.util.MultiMap; | |
89 import org.eclipse.jetty.util.MultiPartInputStream; | |
90 import org.eclipse.jetty.util.StringUtil; | |
91 import org.eclipse.jetty.util.URIUtil; | |
92 import org.eclipse.jetty.util.UrlEncoded; | |
93 import org.eclipse.jetty.util.log.Log; | |
94 import org.eclipse.jetty.util.log.Logger; | |
95 | |
96 /* ------------------------------------------------------------ */ | |
97 /** | |
98 * Jetty Request. | |
99 * <p> | |
100 * Implements {@link javax.servlet.http.HttpServletRequest} from the <code>javax.servlet.http</code> package. | |
101 * </p> | |
102 * <p> | |
103 * The standard interface of mostly getters, is extended with setters so that the request is mutable by the handlers that it is passed to. This allows the | |
104 * request object to be as lightweight as possible and not actually implement any significant behavior. For example | |
105 * <ul> | |
106 * | |
107 * <li>The {@link Request#getContextPath()} method will return null, until the request has been passed to a {@link ContextHandler} which matches the | |
108 * {@link Request#getPathInfo()} with a context path and calls {@link Request#setContextPath(String)} as a result.</li> | |
109 * | |
110 * <li>the HTTP session methods will all return null sessions until such time as a request has been passed to a | |
111 * {@link org.eclipse.jetty.server.session.SessionHandler} which checks for session cookies and enables the ability to create new sessions.</li> | |
112 * | |
113 * <li>The {@link Request#getServletPath()} method will return null until the request has been passed to a <code>org.eclipse.jetty.servlet.ServletHandler</code> | |
114 * and the pathInfo matched against the servlet URL patterns and {@link Request#setServletPath(String)} called as a result.</li> | |
115 * </ul> | |
116 * | |
117 * A request instance is created for each {@link AbstractHttpConnection} accepted by the server and recycled for each HTTP request received via that connection. | |
118 * An effort is made to avoid reparsing headers and cookies that are likely to be the same for requests from the same connection. | |
119 * | |
120 * <p> | |
121 * The form content that a request can process is limited to protect from Denial of Service attacks. The size in bytes is limited by | |
122 * {@link ContextHandler#getMaxFormContentSize()} or if there is no context then the "org.eclipse.jetty.server.Request.maxFormContentSize" {@link Server} | |
123 * attribute. The number of parameters keys is limited by {@link ContextHandler#getMaxFormKeys()} or if there is no context then the | |
124 * "org.eclipse.jetty.server.Request.maxFormKeys" {@link Server} attribute. | |
125 * | |
126 * | |
127 */ | |
128 public class Request implements HttpServletRequest | |
129 { | |
130 public static final String __MULTIPART_CONFIG_ELEMENT = "org.eclipse.multipartConfig"; | |
131 public static final String __MULTIPART_INPUT_STREAM = "org.eclipse.multiPartInputStream"; | |
132 public static final String __MULTIPART_CONTEXT = "org.eclipse.multiPartContext"; | |
133 private static final Logger LOG = Log.getLogger(Request.class); | |
134 | |
135 private static final String __ASYNC_FWD = "org.eclipse.asyncfwd"; | |
136 private static final Collection __defaultLocale = Collections.singleton(Locale.getDefault()); | |
137 private static final int __NONE = 0, _STREAM = 1, __READER = 2; | |
138 | |
139 public static class MultiPartCleanerListener implements ServletRequestListener | |
140 { | |
141 | |
142 @Override | |
143 public void requestDestroyed(ServletRequestEvent sre) | |
144 { | |
145 //Clean up any tmp files created by MultiPartInputStream | |
146 MultiPartInputStream mpis = (MultiPartInputStream)sre.getServletRequest().getAttribute(__MULTIPART_INPUT_STREAM); | |
147 if (mpis != null) | |
148 { | |
149 ContextHandler.Context context = (ContextHandler.Context)sre.getServletRequest().getAttribute(__MULTIPART_CONTEXT); | |
150 | |
151 //Only do the cleanup if we are exiting from the context in which a servlet parsed the multipart files | |
152 if (context == sre.getServletContext()) | |
153 { | |
154 try | |
155 { | |
156 mpis.deleteParts(); | |
157 } | |
158 catch (MultiException e) | |
159 { | |
160 sre.getServletContext().log("Errors deleting multipart tmp files", e); | |
161 } | |
162 } | |
163 } | |
164 } | |
165 | |
166 @Override | |
167 public void requestInitialized(ServletRequestEvent sre) | |
168 { | |
169 //nothing to do, multipart config set up by ServletHolder.handle() | |
170 } | |
171 | |
172 } | |
173 | |
174 | |
175 /* ------------------------------------------------------------ */ | |
176 public static Request getRequest(HttpServletRequest request) | |
177 { | |
178 if (request instanceof Request) | |
179 return (Request)request; | |
180 | |
181 return AbstractHttpConnection.getCurrentConnection().getRequest(); | |
182 } | |
183 protected final AsyncContinuation _async = new AsyncContinuation(); | |
184 private boolean _asyncSupported = true; | |
185 private volatile Attributes _attributes; | |
186 private Authentication _authentication; | |
187 private MultiMap<String> _baseParameters; | |
188 private String _characterEncoding; | |
189 protected AbstractHttpConnection _connection; | |
190 private ContextHandler.Context _context; | |
191 private boolean _newContext; | |
192 private String _contextPath; | |
193 private CookieCutter _cookies; | |
194 private boolean _cookiesExtracted = false; | |
195 private DispatcherType _dispatcherType; | |
196 private boolean _dns = false; | |
197 private EndPoint _endp; | |
198 private boolean _handled = false; | |
199 private int _inputState = __NONE; | |
200 private String _method; | |
201 private MultiMap<String> _parameters; | |
202 private boolean _paramsExtracted; | |
203 private String _pathInfo; | |
204 private int _port; | |
205 private String _protocol = HttpVersions.HTTP_1_1; | |
206 private String _queryEncoding; | |
207 private String _queryString; | |
208 private BufferedReader _reader; | |
209 private String _readerEncoding; | |
210 private String _remoteAddr; | |
211 private String _remoteHost; | |
212 private Object _requestAttributeListeners; | |
213 private String _requestedSessionId; | |
214 private boolean _requestedSessionIdFromCookie = false; | |
215 private String _requestURI; | |
216 private Map<Object, HttpSession> _savedNewSessions; | |
217 private String _scheme = URIUtil.HTTP; | |
218 private UserIdentity.Scope _scope; | |
219 private String _serverName; | |
220 private String _servletPath; | |
221 private HttpSession _session; | |
222 private SessionManager _sessionManager; | |
223 private long _timeStamp; | |
224 private long _dispatchTime; | |
225 | |
226 private Buffer _timeStampBuffer; | |
227 private HttpURI _uri; | |
228 | |
229 private MultiPartInputStream _multiPartInputStream; //if the request is a multi-part mime | |
230 | |
231 /* ------------------------------------------------------------ */ | |
232 public Request() | |
233 { | |
234 } | |
235 | |
236 /* ------------------------------------------------------------ */ | |
237 public Request(AbstractHttpConnection connection) | |
238 { | |
239 setConnection(connection); | |
240 } | |
241 | |
242 /* ------------------------------------------------------------ */ | |
243 public void addEventListener(final EventListener listener) | |
244 { | |
245 if (listener instanceof ServletRequestAttributeListener) | |
246 _requestAttributeListeners = LazyList.add(_requestAttributeListeners,listener); | |
247 if (listener instanceof ContinuationListener) | |
248 throw new IllegalArgumentException(listener.getClass().toString()); | |
249 if (listener instanceof AsyncListener) | |
250 throw new IllegalArgumentException(listener.getClass().toString()); | |
251 } | |
252 | |
253 /* ------------------------------------------------------------ */ | |
254 /** | |
255 * Extract Parameters from query string and/or form _content. | |
256 */ | |
257 public void extractParameters() | |
258 { | |
259 if (_baseParameters == null) | |
260 _baseParameters = new MultiMap(16); | |
261 | |
262 if (_paramsExtracted) | |
263 { | |
264 if (_parameters == null) | |
265 _parameters = _baseParameters; | |
266 return; | |
267 } | |
268 | |
269 _paramsExtracted = true; | |
270 | |
271 try | |
272 { | |
273 // Handle query string | |
274 if (_uri != null && _uri.hasQuery()) | |
275 { | |
276 if (_queryEncoding == null) | |
277 _uri.decodeQueryTo(_baseParameters); | |
278 else | |
279 { | |
280 try | |
281 { | |
282 _uri.decodeQueryTo(_baseParameters,_queryEncoding); | |
283 } | |
284 catch (UnsupportedEncodingException e) | |
285 { | |
286 if (LOG.isDebugEnabled()) | |
287 LOG.warn(e); | |
288 else | |
289 LOG.warn(e.toString()); | |
290 } | |
291 } | |
292 } | |
293 | |
294 // handle any _content. | |
295 String encoding = getCharacterEncoding(); | |
296 String content_type = getContentType(); | |
297 if (content_type != null && content_type.length() > 0) | |
298 { | |
299 content_type = HttpFields.valueParameters(content_type,null); | |
300 | |
301 if (MimeTypes.FORM_ENCODED.equalsIgnoreCase(content_type) && _inputState == __NONE | |
302 && (HttpMethods.POST.equals(getMethod()) || HttpMethods.PUT.equals(getMethod()))) | |
303 { | |
304 int content_length = getContentLength(); | |
305 if (content_length != 0) | |
306 { | |
307 try | |
308 { | |
309 int maxFormContentSize = -1; | |
310 int maxFormKeys = -1; | |
311 | |
312 if (_context != null) | |
313 { | |
314 maxFormContentSize = _context.getContextHandler().getMaxFormContentSize(); | |
315 maxFormKeys = _context.getContextHandler().getMaxFormKeys(); | |
316 } | |
317 | |
318 if (maxFormContentSize < 0) | |
319 { | |
320 Object obj = _connection.getConnector().getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormContentSize"); | |
321 if (obj == null) | |
322 maxFormContentSize = 200000; | |
323 else if (obj instanceof Number) | |
324 { | |
325 Number size = (Number)obj; | |
326 maxFormContentSize = size.intValue(); | |
327 } | |
328 else if (obj instanceof String) | |
329 { | |
330 maxFormContentSize = Integer.valueOf((String)obj); | |
331 } | |
332 } | |
333 | |
334 if (maxFormKeys < 0) | |
335 { | |
336 Object obj = _connection.getConnector().getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormKeys"); | |
337 if (obj == null) | |
338 maxFormKeys = 1000; | |
339 else if (obj instanceof Number) | |
340 { | |
341 Number keys = (Number)obj; | |
342 maxFormKeys = keys.intValue(); | |
343 } | |
344 else if (obj instanceof String) | |
345 { | |
346 maxFormKeys = Integer.valueOf((String)obj); | |
347 } | |
348 } | |
349 | |
350 if (content_length > maxFormContentSize && maxFormContentSize > 0) | |
351 { | |
352 throw new IllegalStateException("Form too large " + content_length + ">" + maxFormContentSize); | |
353 } | |
354 InputStream in = getInputStream(); | |
355 | |
356 // Add form params to query params | |
357 UrlEncoded.decodeTo(in,_baseParameters,encoding,content_length < 0?maxFormContentSize:-1,maxFormKeys); | |
358 } | |
359 catch (IOException e) | |
360 { | |
361 if (LOG.isDebugEnabled()) | |
362 LOG.warn(e); | |
363 else | |
364 LOG.warn(e.toString()); | |
365 } | |
366 } | |
367 } | |
368 | |
369 } | |
370 | |
371 if (_parameters == null) | |
372 _parameters = _baseParameters; | |
373 else if (_parameters != _baseParameters) | |
374 { | |
375 // Merge parameters (needed if parameters extracted after a forward). | |
376 Iterator iter = _baseParameters.entrySet().iterator(); | |
377 while (iter.hasNext()) | |
378 { | |
379 Map.Entry entry = (Map.Entry)iter.next(); | |
380 String name = (String)entry.getKey(); | |
381 Object values = entry.getValue(); | |
382 for (int i = 0; i < LazyList.size(values); i++) | |
383 _parameters.add(name,LazyList.get(values,i)); | |
384 } | |
385 } | |
386 | |
387 if (content_type != null && content_type.length()>0 && content_type.startsWith("multipart/form-data") && getAttribute(__MULTIPART_CONFIG_ELEMENT)!=null) | |
388 { | |
389 try | |
390 { | |
391 getParts(); | |
392 } | |
393 catch (IOException e) | |
394 { | |
395 if (LOG.isDebugEnabled()) | |
396 LOG.warn(e); | |
397 else | |
398 LOG.warn(e.toString()); | |
399 } | |
400 catch (ServletException e) | |
401 { | |
402 if (LOG.isDebugEnabled()) | |
403 LOG.warn(e); | |
404 else | |
405 LOG.warn(e.toString()); | |
406 } | |
407 } | |
408 } | |
409 finally | |
410 { | |
411 // ensure params always set (even if empty) after extraction | |
412 if (_parameters == null) | |
413 _parameters = _baseParameters; | |
414 } | |
415 } | |
416 | |
417 /* ------------------------------------------------------------ */ | |
418 public AsyncContext getAsyncContext() | |
419 { | |
420 if (_async.isInitial() && !_async.isAsyncStarted()) | |
421 throw new IllegalStateException(_async.getStatusString()); | |
422 return _async; | |
423 } | |
424 | |
425 /* ------------------------------------------------------------ */ | |
426 public AsyncContinuation getAsyncContinuation() | |
427 { | |
428 return _async; | |
429 } | |
430 | |
431 /* ------------------------------------------------------------ */ | |
432 /* | |
433 * @see javax.servlet.ServletRequest#getAttribute(java.lang.String) | |
434 */ | |
435 public Object getAttribute(String name) | |
436 { | |
437 if ("org.eclipse.jetty.io.EndPoint.maxIdleTime".equalsIgnoreCase(name)) | |
438 return new Long(getConnection().getEndPoint().getMaxIdleTime()); | |
439 | |
440 Object attr = (_attributes == null)?null:_attributes.getAttribute(name); | |
441 if (attr == null && Continuation.ATTRIBUTE.equals(name)) | |
442 return _async; | |
443 return attr; | |
444 } | |
445 | |
446 /* ------------------------------------------------------------ */ | |
447 /* | |
448 * @see javax.servlet.ServletRequest#getAttributeNames() | |
449 */ | |
450 public Enumeration getAttributeNames() | |
451 { | |
452 if (_attributes == null) | |
453 return Collections.enumeration(Collections.EMPTY_LIST); | |
454 | |
455 return AttributesMap.getAttributeNamesCopy(_attributes); | |
456 } | |
457 | |
458 /* ------------------------------------------------------------ */ | |
459 /* | |
460 */ | |
461 public Attributes getAttributes() | |
462 { | |
463 if (_attributes == null) | |
464 _attributes = new AttributesMap(); | |
465 return _attributes; | |
466 } | |
467 | |
468 /* ------------------------------------------------------------ */ | |
469 /** | |
470 * Get the authentication. | |
471 * | |
472 * @return the authentication | |
473 */ | |
474 public Authentication getAuthentication() | |
475 { | |
476 return _authentication; | |
477 } | |
478 | |
479 /* ------------------------------------------------------------ */ | |
480 /* | |
481 * @see javax.servlet.http.HttpServletRequest#getAuthType() | |
482 */ | |
483 public String getAuthType() | |
484 { | |
485 if (_authentication instanceof Authentication.Deferred) | |
486 setAuthentication(((Authentication.Deferred)_authentication).authenticate(this)); | |
487 | |
488 if (_authentication instanceof Authentication.User) | |
489 return ((Authentication.User)_authentication).getAuthMethod(); | |
490 return null; | |
491 } | |
492 | |
493 /* ------------------------------------------------------------ */ | |
494 /* | |
495 * @see javax.servlet.ServletRequest#getCharacterEncoding() | |
496 */ | |
497 public String getCharacterEncoding() | |
498 { | |
499 return _characterEncoding; | |
500 } | |
501 | |
502 /* ------------------------------------------------------------ */ | |
503 /** | |
504 * @return Returns the connection. | |
505 */ | |
506 public AbstractHttpConnection getConnection() | |
507 { | |
508 return _connection; | |
509 } | |
510 | |
511 /* ------------------------------------------------------------ */ | |
512 /* | |
513 * @see javax.servlet.ServletRequest#getContentLength() | |
514 */ | |
515 public int getContentLength() | |
516 { | |
517 return (int)_connection.getRequestFields().getLongField(HttpHeaders.CONTENT_LENGTH_BUFFER); | |
518 } | |
519 | |
520 public long getContentRead() | |
521 { | |
522 if (_connection == null || _connection.getParser() == null) | |
523 return -1; | |
524 | |
525 return ((HttpParser)_connection.getParser()).getContentRead(); | |
526 } | |
527 | |
528 /* ------------------------------------------------------------ */ | |
529 /* | |
530 * @see javax.servlet.ServletRequest#getContentType() | |
531 */ | |
532 public String getContentType() | |
533 { | |
534 return _connection.getRequestFields().getStringField(HttpHeaders.CONTENT_TYPE_BUFFER); | |
535 } | |
536 | |
537 /* ------------------------------------------------------------ */ | |
538 /** | |
539 * @return The current {@link Context context} used for this request, or <code>null</code> if {@link #setContext} has not yet been called. | |
540 */ | |
541 public Context getContext() | |
542 { | |
543 return _context; | |
544 } | |
545 | |
546 /* ------------------------------------------------------------ */ | |
547 /* | |
548 * @see javax.servlet.http.HttpServletRequest#getContextPath() | |
549 */ | |
550 public String getContextPath() | |
551 { | |
552 return _contextPath; | |
553 } | |
554 | |
555 /* ------------------------------------------------------------ */ | |
556 /* | |
557 * @see javax.servlet.http.HttpServletRequest#getCookies() | |
558 */ | |
559 public Cookie[] getCookies() | |
560 { | |
561 if (_cookiesExtracted) | |
562 return _cookies == null?null:_cookies.getCookies(); | |
563 | |
564 _cookiesExtracted = true; | |
565 | |
566 Enumeration enm = _connection.getRequestFields().getValues(HttpHeaders.COOKIE_BUFFER); | |
567 | |
568 // Handle no cookies | |
569 if (enm != null) | |
570 { | |
571 if (_cookies == null) | |
572 _cookies = new CookieCutter(); | |
573 | |
574 while (enm.hasMoreElements()) | |
575 { | |
576 String c = (String)enm.nextElement(); | |
577 _cookies.addCookieField(c); | |
578 } | |
579 } | |
580 | |
581 return _cookies == null?null:_cookies.getCookies(); | |
582 } | |
583 | |
584 /* ------------------------------------------------------------ */ | |
585 /* | |
586 * @see javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String) | |
587 */ | |
588 public long getDateHeader(String name) | |
589 { | |
590 return _connection.getRequestFields().getDateField(name); | |
591 } | |
592 | |
593 /* ------------------------------------------------------------ */ | |
594 public DispatcherType getDispatcherType() | |
595 { | |
596 return _dispatcherType; | |
597 } | |
598 | |
599 /* ------------------------------------------------------------ */ | |
600 /* | |
601 * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String) | |
602 */ | |
603 public String getHeader(String name) | |
604 { | |
605 return _connection.getRequestFields().getStringField(name); | |
606 } | |
607 | |
608 /* ------------------------------------------------------------ */ | |
609 /* | |
610 * @see javax.servlet.http.HttpServletRequest#getHeaderNames() | |
611 */ | |
612 public Enumeration getHeaderNames() | |
613 { | |
614 return _connection.getRequestFields().getFieldNames(); | |
615 } | |
616 | |
617 /* ------------------------------------------------------------ */ | |
618 /* | |
619 * @see javax.servlet.http.HttpServletRequest#getHeaders(java.lang.String) | |
620 */ | |
621 public Enumeration getHeaders(String name) | |
622 { | |
623 Enumeration e = _connection.getRequestFields().getValues(name); | |
624 if (e == null) | |
625 return Collections.enumeration(Collections.EMPTY_LIST); | |
626 return e; | |
627 } | |
628 | |
629 /* ------------------------------------------------------------ */ | |
630 /** | |
631 * @return Returns the inputState. | |
632 */ | |
633 public int getInputState() | |
634 { | |
635 return _inputState; | |
636 } | |
637 | |
638 /* ------------------------------------------------------------ */ | |
639 /* | |
640 * @see javax.servlet.ServletRequest#getInputStream() | |
641 */ | |
642 public ServletInputStream getInputStream() throws IOException | |
643 { | |
644 if (_inputState != __NONE && _inputState != _STREAM) | |
645 throw new IllegalStateException("READER"); | |
646 _inputState = _STREAM; | |
647 return _connection.getInputStream(); | |
648 } | |
649 | |
650 /* ------------------------------------------------------------ */ | |
651 /* | |
652 * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String) | |
653 */ | |
654 public int getIntHeader(String name) | |
655 { | |
656 return (int)_connection.getRequestFields().getLongField(name); | |
657 } | |
658 | |
659 /* ------------------------------------------------------------ */ | |
660 /* | |
661 * @see javax.servlet.ServletRequest#getLocalAddr() | |
662 */ | |
663 public String getLocalAddr() | |
664 { | |
665 return _endp == null?null:_endp.getLocalAddr(); | |
666 } | |
667 | |
668 /* ------------------------------------------------------------ */ | |
669 /* | |
670 * @see javax.servlet.ServletRequest#getLocale() | |
671 */ | |
672 public Locale getLocale() | |
673 { | |
674 Enumeration enm = _connection.getRequestFields().getValues(HttpHeaders.ACCEPT_LANGUAGE,HttpFields.__separators); | |
675 | |
676 // handle no locale | |
677 if (enm == null || !enm.hasMoreElements()) | |
678 return Locale.getDefault(); | |
679 | |
680 // sort the list in quality order | |
681 List acceptLanguage = HttpFields.qualityList(enm); | |
682 if (acceptLanguage.size() == 0) | |
683 return Locale.getDefault(); | |
684 | |
685 int size = acceptLanguage.size(); | |
686 | |
687 if (size > 0) | |
688 { | |
689 String language = (String)acceptLanguage.get(0); | |
690 language = HttpFields.valueParameters(language,null); | |
691 String country = ""; | |
692 int dash = language.indexOf('-'); | |
693 if (dash > -1) | |
694 { | |
695 country = language.substring(dash + 1).trim(); | |
696 language = language.substring(0,dash).trim(); | |
697 } | |
698 return new Locale(language,country); | |
699 } | |
700 | |
701 return Locale.getDefault(); | |
702 } | |
703 | |
704 /* ------------------------------------------------------------ */ | |
705 /* | |
706 * @see javax.servlet.ServletRequest#getLocales() | |
707 */ | |
708 public Enumeration getLocales() | |
709 { | |
710 | |
711 Enumeration enm = _connection.getRequestFields().getValues(HttpHeaders.ACCEPT_LANGUAGE,HttpFields.__separators); | |
712 | |
713 // handle no locale | |
714 if (enm == null || !enm.hasMoreElements()) | |
715 return Collections.enumeration(__defaultLocale); | |
716 | |
717 // sort the list in quality order | |
718 List acceptLanguage = HttpFields.qualityList(enm); | |
719 | |
720 if (acceptLanguage.size() == 0) | |
721 return Collections.enumeration(__defaultLocale); | |
722 | |
723 Object langs = null; | |
724 int size = acceptLanguage.size(); | |
725 | |
726 // convert to locals | |
727 for (int i = 0; i < size; i++) | |
728 { | |
729 String language = (String)acceptLanguage.get(i); | |
730 language = HttpFields.valueParameters(language,null); | |
731 String country = ""; | |
732 int dash = language.indexOf('-'); | |
733 if (dash > -1) | |
734 { | |
735 country = language.substring(dash + 1).trim(); | |
736 language = language.substring(0,dash).trim(); | |
737 } | |
738 langs = LazyList.ensureSize(langs,size); | |
739 langs = LazyList.add(langs,new Locale(language,country)); | |
740 } | |
741 | |
742 if (LazyList.size(langs) == 0) | |
743 return Collections.enumeration(__defaultLocale); | |
744 | |
745 return Collections.enumeration(LazyList.getList(langs)); | |
746 } | |
747 | |
748 /* ------------------------------------------------------------ */ | |
749 /* | |
750 * @see javax.servlet.ServletRequest#getLocalName() | |
751 */ | |
752 public String getLocalName() | |
753 { | |
754 if (_endp == null) | |
755 return null; | |
756 if (_dns) | |
757 return _endp.getLocalHost(); | |
758 | |
759 String local = _endp.getLocalAddr(); | |
760 if (local != null && local.indexOf(':') >= 0) | |
761 local = "[" + local + "]"; | |
762 return local; | |
763 } | |
764 | |
765 /* ------------------------------------------------------------ */ | |
766 /* | |
767 * @see javax.servlet.ServletRequest#getLocalPort() | |
768 */ | |
769 public int getLocalPort() | |
770 { | |
771 return _endp == null?0:_endp.getLocalPort(); | |
772 } | |
773 | |
774 /* ------------------------------------------------------------ */ | |
775 /* | |
776 * @see javax.servlet.http.HttpServletRequest#getMethod() | |
777 */ | |
778 public String getMethod() | |
779 { | |
780 return _method; | |
781 } | |
782 | |
783 /* ------------------------------------------------------------ */ | |
784 /* | |
785 * @see javax.servlet.ServletRequest#getParameter(java.lang.String) | |
786 */ | |
787 public String getParameter(String name) | |
788 { | |
789 if (!_paramsExtracted) | |
790 extractParameters(); | |
791 return (String)_parameters.getValue(name,0); | |
792 } | |
793 | |
794 /* ------------------------------------------------------------ */ | |
795 /* | |
796 * @see javax.servlet.ServletRequest#getParameterMap() | |
797 */ | |
798 public Map getParameterMap() | |
799 { | |
800 if (!_paramsExtracted) | |
801 extractParameters(); | |
802 | |
803 return Collections.unmodifiableMap(_parameters.toStringArrayMap()); | |
804 } | |
805 | |
806 /* ------------------------------------------------------------ */ | |
807 /* | |
808 * @see javax.servlet.ServletRequest#getParameterNames() | |
809 */ | |
810 public Enumeration getParameterNames() | |
811 { | |
812 if (!_paramsExtracted) | |
813 extractParameters(); | |
814 return Collections.enumeration(_parameters.keySet()); | |
815 } | |
816 | |
817 /* ------------------------------------------------------------ */ | |
818 /** | |
819 * @return Returns the parameters. | |
820 */ | |
821 public MultiMap<String> getParameters() | |
822 { | |
823 return _parameters; | |
824 } | |
825 | |
826 /* ------------------------------------------------------------ */ | |
827 /* | |
828 * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String) | |
829 */ | |
830 public String[] getParameterValues(String name) | |
831 { | |
832 if (!_paramsExtracted) | |
833 extractParameters(); | |
834 List<Object> vals = _parameters.getValues(name); | |
835 if (vals == null) | |
836 return null; | |
837 return vals.toArray(new String[vals.size()]); | |
838 } | |
839 | |
840 /* ------------------------------------------------------------ */ | |
841 /* | |
842 * @see javax.servlet.http.HttpServletRequest#getPathInfo() | |
843 */ | |
844 public String getPathInfo() | |
845 { | |
846 return _pathInfo; | |
847 } | |
848 | |
849 /* ------------------------------------------------------------ */ | |
850 /* | |
851 * @see javax.servlet.http.HttpServletRequest#getPathTranslated() | |
852 */ | |
853 public String getPathTranslated() | |
854 { | |
855 if (_pathInfo == null || _context == null) | |
856 return null; | |
857 return _context.getRealPath(_pathInfo); | |
858 } | |
859 | |
860 /* ------------------------------------------------------------ */ | |
861 /* | |
862 * @see javax.servlet.ServletRequest#getProtocol() | |
863 */ | |
864 public String getProtocol() | |
865 { | |
866 return _protocol; | |
867 } | |
868 | |
869 /* ------------------------------------------------------------ */ | |
870 public String getQueryEncoding() | |
871 { | |
872 return _queryEncoding; | |
873 } | |
874 | |
875 /* ------------------------------------------------------------ */ | |
876 /* | |
877 * @see javax.servlet.http.HttpServletRequest#getQueryString() | |
878 */ | |
879 public String getQueryString() | |
880 { | |
881 if (_queryString == null && _uri != null) | |
882 { | |
883 if (_queryEncoding == null) | |
884 _queryString = _uri.getQuery(); | |
885 else | |
886 _queryString = _uri.getQuery(_queryEncoding); | |
887 } | |
888 return _queryString; | |
889 } | |
890 | |
891 /* ------------------------------------------------------------ */ | |
892 /* | |
893 * @see javax.servlet.ServletRequest#getReader() | |
894 */ | |
895 public BufferedReader getReader() throws IOException | |
896 { | |
897 if (_inputState != __NONE && _inputState != __READER) | |
898 throw new IllegalStateException("STREAMED"); | |
899 | |
900 if (_inputState == __READER) | |
901 return _reader; | |
902 | |
903 String encoding = getCharacterEncoding(); | |
904 if (encoding == null) | |
905 encoding = StringUtil.__ISO_8859_1; | |
906 | |
907 if (_reader == null || !encoding.equalsIgnoreCase(_readerEncoding)) | |
908 { | |
909 final ServletInputStream in = getInputStream(); | |
910 _readerEncoding = encoding; | |
911 _reader = new BufferedReader(new InputStreamReader(in,encoding)) | |
912 { | |
913 @Override | |
914 public void close() throws IOException | |
915 { | |
916 in.close(); | |
917 } | |
918 }; | |
919 } | |
920 _inputState = __READER; | |
921 return _reader; | |
922 } | |
923 | |
924 /* ------------------------------------------------------------ */ | |
925 /* | |
926 * @see javax.servlet.ServletRequest#getRealPath(java.lang.String) | |
927 */ | |
928 public String getRealPath(String path) | |
929 { | |
930 if (_context == null) | |
931 return null; | |
932 return _context.getRealPath(path); | |
933 } | |
934 | |
935 /* ------------------------------------------------------------ */ | |
936 /* | |
937 * @see javax.servlet.ServletRequest#getRemoteAddr() | |
938 */ | |
939 public String getRemoteAddr() | |
940 { | |
941 if (_remoteAddr != null) | |
942 return _remoteAddr; | |
943 return _endp == null?null:_endp.getRemoteAddr(); | |
944 } | |
945 | |
946 /* ------------------------------------------------------------ */ | |
947 /* | |
948 * @see javax.servlet.ServletRequest#getRemoteHost() | |
949 */ | |
950 public String getRemoteHost() | |
951 { | |
952 if (_dns) | |
953 { | |
954 if (_remoteHost != null) | |
955 { | |
956 return _remoteHost; | |
957 } | |
958 return _endp == null?null:_endp.getRemoteHost(); | |
959 } | |
960 return getRemoteAddr(); | |
961 } | |
962 | |
963 /* ------------------------------------------------------------ */ | |
964 /* | |
965 * @see javax.servlet.ServletRequest#getRemotePort() | |
966 */ | |
967 public int getRemotePort() | |
968 { | |
969 return _endp == null?0:_endp.getRemotePort(); | |
970 } | |
971 | |
972 /* ------------------------------------------------------------ */ | |
973 /* | |
974 * @see javax.servlet.http.HttpServletRequest#getRemoteUser() | |
975 */ | |
976 public String getRemoteUser() | |
977 { | |
978 Principal p = getUserPrincipal(); | |
979 if (p == null) | |
980 return null; | |
981 return p.getName(); | |
982 } | |
983 | |
984 /* ------------------------------------------------------------ */ | |
985 /* | |
986 * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String) | |
987 */ | |
988 public RequestDispatcher getRequestDispatcher(String path) | |
989 { | |
990 if (path == null || _context == null) | |
991 return null; | |
992 | |
993 // handle relative path | |
994 if (!path.startsWith("/")) | |
995 { | |
996 String relTo = URIUtil.addPaths(_servletPath,_pathInfo); | |
997 int slash = relTo.lastIndexOf("/"); | |
998 if (slash > 1) | |
999 relTo = relTo.substring(0,slash + 1); | |
1000 else | |
1001 relTo = "/"; | |
1002 path = URIUtil.addPaths(relTo,path); | |
1003 } | |
1004 | |
1005 return _context.getRequestDispatcher(path); | |
1006 } | |
1007 | |
1008 /* ------------------------------------------------------------ */ | |
1009 /* | |
1010 * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId() | |
1011 */ | |
1012 public String getRequestedSessionId() | |
1013 { | |
1014 return _requestedSessionId; | |
1015 } | |
1016 | |
1017 /* ------------------------------------------------------------ */ | |
1018 /* | |
1019 * @see javax.servlet.http.HttpServletRequest#getRequestURI() | |
1020 */ | |
1021 public String getRequestURI() | |
1022 { | |
1023 if (_requestURI == null && _uri != null) | |
1024 _requestURI = _uri.getPathAndParam(); | |
1025 return _requestURI; | |
1026 } | |
1027 | |
1028 /* ------------------------------------------------------------ */ | |
1029 /* | |
1030 * @see javax.servlet.http.HttpServletRequest#getRequestURL() | |
1031 */ | |
1032 public StringBuffer getRequestURL() | |
1033 { | |
1034 final StringBuffer url = new StringBuffer(48); | |
1035 synchronized (url) | |
1036 { | |
1037 String scheme = getScheme(); | |
1038 int port = getServerPort(); | |
1039 | |
1040 url.append(scheme); | |
1041 url.append("://"); | |
1042 url.append(getServerName()); | |
1043 if (_port > 0 && ((scheme.equalsIgnoreCase(URIUtil.HTTP) && port != 80) || (scheme.equalsIgnoreCase(URIUtil.HTTPS) && port != 443))) | |
1044 { | |
1045 url.append(':'); | |
1046 url.append(_port); | |
1047 } | |
1048 | |
1049 url.append(getRequestURI()); | |
1050 return url; | |
1051 } | |
1052 } | |
1053 | |
1054 /* ------------------------------------------------------------ */ | |
1055 public Response getResponse() | |
1056 { | |
1057 return _connection._response; | |
1058 } | |
1059 | |
1060 /* ------------------------------------------------------------ */ | |
1061 /** | |
1062 * Reconstructs the URL the client used to make the request. The returned URL contains a protocol, server name, port number, and, but it does not include a | |
1063 * path. | |
1064 * <p> | |
1065 * Because this method returns a <code>StringBuffer</code>, not a string, you can modify the URL easily, for example, to append path and query parameters. | |
1066 * | |
1067 * This method is useful for creating redirect messages and for reporting errors. | |
1068 * | |
1069 * @return "scheme://host:port" | |
1070 */ | |
1071 public StringBuilder getRootURL() | |
1072 { | |
1073 StringBuilder url = new StringBuilder(48); | |
1074 String scheme = getScheme(); | |
1075 int port = getServerPort(); | |
1076 | |
1077 url.append(scheme); | |
1078 url.append("://"); | |
1079 url.append(getServerName()); | |
1080 | |
1081 if (port > 0 && ((scheme.equalsIgnoreCase("http") && port != 80) || (scheme.equalsIgnoreCase("https") && port != 443))) | |
1082 { | |
1083 url.append(':'); | |
1084 url.append(port); | |
1085 } | |
1086 return url; | |
1087 } | |
1088 | |
1089 /* ------------------------------------------------------------ */ | |
1090 /* | |
1091 * @see javax.servlet.ServletRequest#getScheme() | |
1092 */ | |
1093 public String getScheme() | |
1094 { | |
1095 return _scheme; | |
1096 } | |
1097 | |
1098 /* ------------------------------------------------------------ */ | |
1099 /* | |
1100 * @see javax.servlet.ServletRequest#getServerName() | |
1101 */ | |
1102 public String getServerName() | |
1103 { | |
1104 // Return already determined host | |
1105 if (_serverName != null) | |
1106 return _serverName; | |
1107 | |
1108 if (_uri == null) | |
1109 throw new IllegalStateException("No uri"); | |
1110 | |
1111 // Return host from absolute URI | |
1112 _serverName = _uri.getHost(); | |
1113 _port = _uri.getPort(); | |
1114 if (_serverName != null) | |
1115 return _serverName; | |
1116 | |
1117 // Return host from header field | |
1118 Buffer hostPort = _connection.getRequestFields().get(HttpHeaders.HOST_BUFFER); | |
1119 if (hostPort != null) | |
1120 { | |
1121 loop: for (int i = hostPort.putIndex(); i-- > hostPort.getIndex();) | |
1122 { | |
1123 char ch = (char)(0xff & hostPort.peek(i)); | |
1124 switch (ch) | |
1125 { | |
1126 case ']': | |
1127 break loop; | |
1128 | |
1129 case ':': | |
1130 _serverName = BufferUtil.to8859_1_String(hostPort.peek(hostPort.getIndex(),i - hostPort.getIndex())); | |
1131 try | |
1132 { | |
1133 _port = BufferUtil.toInt(hostPort.peek(i + 1,hostPort.putIndex() - i - 1)); | |
1134 } | |
1135 catch (NumberFormatException e) | |
1136 { | |
1137 try | |
1138 { | |
1139 if (_connection != null) | |
1140 _connection._generator.sendError(HttpStatus.BAD_REQUEST_400,"Bad Host header",null,true); | |
1141 } | |
1142 catch (IOException e1) | |
1143 { | |
1144 throw new RuntimeException(e1); | |
1145 } | |
1146 } | |
1147 return _serverName; | |
1148 } | |
1149 } | |
1150 if (_serverName == null || _port < 0) | |
1151 { | |
1152 _serverName = BufferUtil.to8859_1_String(hostPort); | |
1153 _port = 0; | |
1154 } | |
1155 | |
1156 return _serverName; | |
1157 } | |
1158 | |
1159 // Return host from connection | |
1160 if (_connection != null) | |
1161 { | |
1162 _serverName = getLocalName(); | |
1163 _port = getLocalPort(); | |
1164 if (_serverName != null && !StringUtil.ALL_INTERFACES.equals(_serverName)) | |
1165 return _serverName; | |
1166 } | |
1167 | |
1168 // Return the local host | |
1169 try | |
1170 { | |
1171 _serverName = InetAddress.getLocalHost().getHostAddress(); | |
1172 } | |
1173 catch (java.net.UnknownHostException e) | |
1174 { | |
1175 LOG.ignore(e); | |
1176 } | |
1177 return _serverName; | |
1178 } | |
1179 | |
1180 /* ------------------------------------------------------------ */ | |
1181 /* | |
1182 * @see javax.servlet.ServletRequest#getServerPort() | |
1183 */ | |
1184 public int getServerPort() | |
1185 { | |
1186 if (_port <= 0) | |
1187 { | |
1188 if (_serverName == null) | |
1189 getServerName(); | |
1190 | |
1191 if (_port <= 0) | |
1192 { | |
1193 if (_serverName != null && _uri != null) | |
1194 _port = _uri.getPort(); | |
1195 else | |
1196 _port = _endp == null?0:_endp.getLocalPort(); | |
1197 } | |
1198 } | |
1199 | |
1200 if (_port <= 0) | |
1201 { | |
1202 if (getScheme().equalsIgnoreCase(URIUtil.HTTPS)) | |
1203 return 443; | |
1204 return 80; | |
1205 } | |
1206 return _port; | |
1207 } | |
1208 | |
1209 /* ------------------------------------------------------------ */ | |
1210 public ServletContext getServletContext() | |
1211 { | |
1212 return _context; | |
1213 } | |
1214 | |
1215 /* ------------------------------------------------------------ */ | |
1216 /* | |
1217 */ | |
1218 public String getServletName() | |
1219 { | |
1220 if (_scope != null) | |
1221 return _scope.getName(); | |
1222 return null; | |
1223 } | |
1224 | |
1225 /* ------------------------------------------------------------ */ | |
1226 /* | |
1227 * @see javax.servlet.http.HttpServletRequest#getServletPath() | |
1228 */ | |
1229 public String getServletPath() | |
1230 { | |
1231 if (_servletPath == null) | |
1232 _servletPath = ""; | |
1233 return _servletPath; | |
1234 } | |
1235 | |
1236 /* ------------------------------------------------------------ */ | |
1237 public ServletResponse getServletResponse() | |
1238 { | |
1239 return _connection.getResponse(); | |
1240 } | |
1241 | |
1242 /* ------------------------------------------------------------ */ | |
1243 /* | |
1244 * @see javax.servlet.http.HttpServletRequest#getSession() | |
1245 */ | |
1246 public HttpSession getSession() | |
1247 { | |
1248 return getSession(true); | |
1249 } | |
1250 | |
1251 /* ------------------------------------------------------------ */ | |
1252 /* | |
1253 * @see javax.servlet.http.HttpServletRequest#getSession(boolean) | |
1254 */ | |
1255 public HttpSession getSession(boolean create) | |
1256 { | |
1257 if (_session != null) | |
1258 { | |
1259 if (_sessionManager != null && !_sessionManager.isValid(_session)) | |
1260 _session = null; | |
1261 else | |
1262 return _session; | |
1263 } | |
1264 | |
1265 if (!create) | |
1266 return null; | |
1267 | |
1268 if (_sessionManager == null) | |
1269 throw new IllegalStateException("No SessionManager"); | |
1270 | |
1271 _session = _sessionManager.newHttpSession(this); | |
1272 HttpCookie cookie = _sessionManager.getSessionCookie(_session,getContextPath(),isSecure()); | |
1273 if (cookie != null) | |
1274 _connection.getResponse().addCookie(cookie); | |
1275 | |
1276 return _session; | |
1277 } | |
1278 | |
1279 /* ------------------------------------------------------------ */ | |
1280 /** | |
1281 * @return Returns the sessionManager. | |
1282 */ | |
1283 public SessionManager getSessionManager() | |
1284 { | |
1285 return _sessionManager; | |
1286 } | |
1287 | |
1288 /* ------------------------------------------------------------ */ | |
1289 /** | |
1290 * Get Request TimeStamp | |
1291 * | |
1292 * @return The time that the request was received. | |
1293 */ | |
1294 public long getTimeStamp() | |
1295 { | |
1296 return _timeStamp; | |
1297 } | |
1298 | |
1299 /* ------------------------------------------------------------ */ | |
1300 /** | |
1301 * Get Request TimeStamp | |
1302 * | |
1303 * @return The time that the request was received. | |
1304 */ | |
1305 public Buffer getTimeStampBuffer() | |
1306 { | |
1307 if (_timeStampBuffer == null && _timeStamp > 0) | |
1308 _timeStampBuffer = HttpFields.__dateCache.formatBuffer(_timeStamp); | |
1309 return _timeStampBuffer; | |
1310 } | |
1311 | |
1312 /* ------------------------------------------------------------ */ | |
1313 /** | |
1314 * @return Returns the uri. | |
1315 */ | |
1316 public HttpURI getUri() | |
1317 { | |
1318 return _uri; | |
1319 } | |
1320 | |
1321 /* ------------------------------------------------------------ */ | |
1322 public UserIdentity getUserIdentity() | |
1323 { | |
1324 if (_authentication instanceof Authentication.Deferred) | |
1325 setAuthentication(((Authentication.Deferred)_authentication).authenticate(this)); | |
1326 | |
1327 if (_authentication instanceof Authentication.User) | |
1328 return ((Authentication.User)_authentication).getUserIdentity(); | |
1329 return null; | |
1330 } | |
1331 | |
1332 /* ------------------------------------------------------------ */ | |
1333 /** | |
1334 * @return The resolved user Identity, which may be null if the {@link Authentication} is not {@link Authentication.User} (eg. | |
1335 * {@link Authentication.Deferred}). | |
1336 */ | |
1337 public UserIdentity getResolvedUserIdentity() | |
1338 { | |
1339 if (_authentication instanceof Authentication.User) | |
1340 return ((Authentication.User)_authentication).getUserIdentity(); | |
1341 return null; | |
1342 } | |
1343 | |
1344 /* ------------------------------------------------------------ */ | |
1345 public UserIdentity.Scope getUserIdentityScope() | |
1346 { | |
1347 return _scope; | |
1348 } | |
1349 | |
1350 /* ------------------------------------------------------------ */ | |
1351 /* | |
1352 * @see javax.servlet.http.HttpServletRequest#getUserPrincipal() | |
1353 */ | |
1354 public Principal getUserPrincipal() | |
1355 { | |
1356 if (_authentication instanceof Authentication.Deferred) | |
1357 setAuthentication(((Authentication.Deferred)_authentication).authenticate(this)); | |
1358 | |
1359 if (_authentication instanceof Authentication.User) | |
1360 { | |
1361 UserIdentity user = ((Authentication.User)_authentication).getUserIdentity(); | |
1362 return user.getUserPrincipal(); | |
1363 } | |
1364 | |
1365 return null; | |
1366 } | |
1367 | |
1368 /* ------------------------------------------------------------ */ | |
1369 /** | |
1370 * Get timestamp of the request dispatch | |
1371 * | |
1372 * @return timestamp | |
1373 */ | |
1374 public long getDispatchTime() | |
1375 { | |
1376 return _dispatchTime; | |
1377 } | |
1378 | |
1379 /* ------------------------------------------------------------ */ | |
1380 public boolean isHandled() | |
1381 { | |
1382 return _handled; | |
1383 } | |
1384 | |
1385 public boolean isAsyncStarted() | |
1386 { | |
1387 return _async.isAsyncStarted(); | |
1388 } | |
1389 | |
1390 | |
1391 /* ------------------------------------------------------------ */ | |
1392 public boolean isAsyncSupported() | |
1393 { | |
1394 return _asyncSupported; | |
1395 } | |
1396 | |
1397 /* ------------------------------------------------------------ */ | |
1398 /* | |
1399 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromCookie() | |
1400 */ | |
1401 public boolean isRequestedSessionIdFromCookie() | |
1402 { | |
1403 return _requestedSessionId != null && _requestedSessionIdFromCookie; | |
1404 } | |
1405 | |
1406 /* ------------------------------------------------------------ */ | |
1407 /* | |
1408 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromUrl() | |
1409 */ | |
1410 public boolean isRequestedSessionIdFromUrl() | |
1411 { | |
1412 return _requestedSessionId != null && !_requestedSessionIdFromCookie; | |
1413 } | |
1414 | |
1415 /* ------------------------------------------------------------ */ | |
1416 /* | |
1417 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromURL() | |
1418 */ | |
1419 public boolean isRequestedSessionIdFromURL() | |
1420 { | |
1421 return _requestedSessionId != null && !_requestedSessionIdFromCookie; | |
1422 } | |
1423 | |
1424 /* ------------------------------------------------------------ */ | |
1425 /* | |
1426 * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid() | |
1427 */ | |
1428 public boolean isRequestedSessionIdValid() | |
1429 { | |
1430 if (_requestedSessionId == null) | |
1431 return false; | |
1432 | |
1433 HttpSession session = getSession(false); | |
1434 return (session != null && _sessionManager.getSessionIdManager().getClusterId(_requestedSessionId).equals(_sessionManager.getClusterId(session))); | |
1435 } | |
1436 | |
1437 /* ------------------------------------------------------------ */ | |
1438 /* | |
1439 * @see javax.servlet.ServletRequest#isSecure() | |
1440 */ | |
1441 public boolean isSecure() | |
1442 { | |
1443 return _connection.isConfidential(this); | |
1444 } | |
1445 | |
1446 /* ------------------------------------------------------------ */ | |
1447 /* | |
1448 * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String) | |
1449 */ | |
1450 public boolean isUserInRole(String role) | |
1451 { | |
1452 if (_authentication instanceof Authentication.Deferred) | |
1453 setAuthentication(((Authentication.Deferred)_authentication).authenticate(this)); | |
1454 | |
1455 if (_authentication instanceof Authentication.User) | |
1456 return ((Authentication.User)_authentication).isUserInRole(_scope,role); | |
1457 return false; | |
1458 } | |
1459 | |
1460 /* ------------------------------------------------------------ */ | |
1461 public HttpSession recoverNewSession(Object key) | |
1462 { | |
1463 if (_savedNewSessions == null) | |
1464 return null; | |
1465 return _savedNewSessions.get(key); | |
1466 } | |
1467 | |
1468 /* ------------------------------------------------------------ */ | |
1469 protected void recycle() | |
1470 { | |
1471 if (_inputState == __READER) | |
1472 { | |
1473 try | |
1474 { | |
1475 int r = _reader.read(); | |
1476 while (r != -1) | |
1477 r = _reader.read(); | |
1478 } | |
1479 catch (Exception e) | |
1480 { | |
1481 LOG.ignore(e); | |
1482 _reader = null; | |
1483 } | |
1484 } | |
1485 | |
1486 setAuthentication(Authentication.NOT_CHECKED); | |
1487 _async.recycle(); | |
1488 _asyncSupported = true; | |
1489 _handled = false; | |
1490 if (_context != null) | |
1491 throw new IllegalStateException("Request in context!"); | |
1492 if (_attributes != null) | |
1493 _attributes.clearAttributes(); | |
1494 _characterEncoding = null; | |
1495 _contextPath = null; | |
1496 if (_cookies != null) | |
1497 _cookies.reset(); | |
1498 _cookiesExtracted = false; | |
1499 _context = null; | |
1500 _serverName = null; | |
1501 _method = null; | |
1502 _pathInfo = null; | |
1503 _port = 0; | |
1504 _protocol = HttpVersions.HTTP_1_1; | |
1505 _queryEncoding = null; | |
1506 _queryString = null; | |
1507 _requestedSessionId = null; | |
1508 _requestedSessionIdFromCookie = false; | |
1509 _session = null; | |
1510 _sessionManager = null; | |
1511 _requestURI = null; | |
1512 _scope = null; | |
1513 _scheme = URIUtil.HTTP; | |
1514 _servletPath = null; | |
1515 _timeStamp = 0; | |
1516 _timeStampBuffer = null; | |
1517 _uri = null; | |
1518 if (_baseParameters != null) | |
1519 _baseParameters.clear(); | |
1520 _parameters = null; | |
1521 _paramsExtracted = false; | |
1522 _inputState = __NONE; | |
1523 | |
1524 if (_savedNewSessions != null) | |
1525 _savedNewSessions.clear(); | |
1526 _savedNewSessions=null; | |
1527 _multiPartInputStream = null; | |
1528 } | |
1529 | |
1530 /* ------------------------------------------------------------ */ | |
1531 /* | |
1532 * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String) | |
1533 */ | |
1534 public void removeAttribute(String name) | |
1535 { | |
1536 Object old_value = _attributes == null?null:_attributes.getAttribute(name); | |
1537 | |
1538 if (_attributes != null) | |
1539 _attributes.removeAttribute(name); | |
1540 | |
1541 if (old_value != null) | |
1542 { | |
1543 if (_requestAttributeListeners != null) | |
1544 { | |
1545 final ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(_context,this,name,old_value); | |
1546 final int size = LazyList.size(_requestAttributeListeners); | |
1547 for (int i = 0; i < size; i++) | |
1548 { | |
1549 final EventListener listener = (ServletRequestAttributeListener)LazyList.get(_requestAttributeListeners,i); | |
1550 if (listener instanceof ServletRequestAttributeListener) | |
1551 { | |
1552 final ServletRequestAttributeListener l = (ServletRequestAttributeListener)listener; | |
1553 l.attributeRemoved(event); | |
1554 } | |
1555 } | |
1556 } | |
1557 } | |
1558 } | |
1559 | |
1560 /* ------------------------------------------------------------ */ | |
1561 public void removeEventListener(final EventListener listener) | |
1562 { | |
1563 _requestAttributeListeners = LazyList.remove(_requestAttributeListeners,listener); | |
1564 } | |
1565 | |
1566 /* ------------------------------------------------------------ */ | |
1567 public void saveNewSession(Object key, HttpSession session) | |
1568 { | |
1569 if (_savedNewSessions == null) | |
1570 _savedNewSessions = new HashMap<Object, HttpSession>(); | |
1571 _savedNewSessions.put(key,session); | |
1572 } | |
1573 | |
1574 /* ------------------------------------------------------------ */ | |
1575 public void setAsyncSupported(boolean supported) | |
1576 { | |
1577 _asyncSupported = supported; | |
1578 } | |
1579 | |
1580 /* ------------------------------------------------------------ */ | |
1581 /* | |
1582 * Set a request attribute. if the attribute name is "org.eclipse.jetty.server.server.Request.queryEncoding" then the value is also passed in a call to | |
1583 * {@link #setQueryEncoding}. <p> if the attribute name is "org.eclipse.jetty.server.server.ResponseBuffer", then the response buffer is flushed with @{link | |
1584 * #flushResponseBuffer} <p> if the attribute name is "org.eclipse.jetty.io.EndPoint.maxIdleTime", then the value is passed to the associated {@link | |
1585 * EndPoint#setMaxIdleTime}. | |
1586 * | |
1587 * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, java.lang.Object) | |
1588 */ | |
1589 public void setAttribute(String name, Object value) | |
1590 { | |
1591 Object old_value = _attributes == null?null:_attributes.getAttribute(name); | |
1592 | |
1593 if (name.startsWith("org.eclipse.jetty.")) | |
1594 { | |
1595 if ("org.eclipse.jetty.server.Request.queryEncoding".equals(name)) | |
1596 setQueryEncoding(value == null?null:value.toString()); | |
1597 else if ("org.eclipse.jetty.server.sendContent".equals(name)) | |
1598 { | |
1599 try | |
1600 { | |
1601 ((AbstractHttpConnection.Output)getServletResponse().getOutputStream()).sendContent(value); | |
1602 } | |
1603 catch (IOException e) | |
1604 { | |
1605 throw new RuntimeException(e); | |
1606 } | |
1607 } | |
1608 else if ("org.eclipse.jetty.server.ResponseBuffer".equals(name)) | |
1609 { | |
1610 try | |
1611 { | |
1612 final ByteBuffer byteBuffer = (ByteBuffer)value; | |
1613 synchronized (byteBuffer) | |
1614 { | |
1615 NIOBuffer buffer = byteBuffer.isDirect()?new DirectNIOBuffer(byteBuffer,true):new IndirectNIOBuffer(byteBuffer,true); | |
1616 ((AbstractHttpConnection.Output)getServletResponse().getOutputStream()).sendResponse(buffer); | |
1617 } | |
1618 } | |
1619 catch (IOException e) | |
1620 { | |
1621 throw new RuntimeException(e); | |
1622 } | |
1623 } | |
1624 else if ("org.eclipse.jetty.io.EndPoint.maxIdleTime".equalsIgnoreCase(name)) | |
1625 { | |
1626 try | |
1627 { | |
1628 getConnection().getEndPoint().setMaxIdleTime(Integer.valueOf(value.toString())); | |
1629 } | |
1630 catch (IOException e) | |
1631 { | |
1632 throw new RuntimeException(e); | |
1633 } | |
1634 } | |
1635 } | |
1636 | |
1637 if (_attributes == null) | |
1638 _attributes = new AttributesMap(); | |
1639 _attributes.setAttribute(name,value); | |
1640 | |
1641 if (_requestAttributeListeners != null) | |
1642 { | |
1643 final ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(_context,this,name,old_value == null?value:old_value); | |
1644 final int size = LazyList.size(_requestAttributeListeners); | |
1645 for (int i = 0; i < size; i++) | |
1646 { | |
1647 final EventListener listener = (ServletRequestAttributeListener)LazyList.get(_requestAttributeListeners,i); | |
1648 if (listener instanceof ServletRequestAttributeListener) | |
1649 { | |
1650 final ServletRequestAttributeListener l = (ServletRequestAttributeListener)listener; | |
1651 | |
1652 if (old_value == null) | |
1653 l.attributeAdded(event); | |
1654 else if (value == null) | |
1655 l.attributeRemoved(event); | |
1656 else | |
1657 l.attributeReplaced(event); | |
1658 } | |
1659 } | |
1660 } | |
1661 } | |
1662 | |
1663 /* ------------------------------------------------------------ */ | |
1664 /* | |
1665 */ | |
1666 public void setAttributes(Attributes attributes) | |
1667 { | |
1668 _attributes = attributes; | |
1669 } | |
1670 | |
1671 /* ------------------------------------------------------------ */ | |
1672 | |
1673 /* ------------------------------------------------------------ */ | |
1674 /** | |
1675 * Set the authentication. | |
1676 * | |
1677 * @param authentication | |
1678 * the authentication to set | |
1679 */ | |
1680 public void setAuthentication(Authentication authentication) | |
1681 { | |
1682 _authentication = authentication; | |
1683 } | |
1684 | |
1685 /* ------------------------------------------------------------ */ | |
1686 /* | |
1687 * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String) | |
1688 */ | |
1689 public void setCharacterEncoding(String encoding) throws UnsupportedEncodingException | |
1690 { | |
1691 if (_inputState != __NONE) | |
1692 return; | |
1693 | |
1694 _characterEncoding = encoding; | |
1695 | |
1696 // check encoding is supported | |
1697 if (!StringUtil.isUTF8(encoding)) | |
1698 // noinspection ResultOfMethodCallIgnored | |
1699 "".getBytes(encoding); | |
1700 } | |
1701 | |
1702 /* ------------------------------------------------------------ */ | |
1703 /* | |
1704 * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String) | |
1705 */ | |
1706 public void setCharacterEncodingUnchecked(String encoding) | |
1707 { | |
1708 _characterEncoding = encoding; | |
1709 } | |
1710 | |
1711 /* ------------------------------------------------------------ */ | |
1712 // final so we can safely call this from constructor | |
1713 protected final void setConnection(AbstractHttpConnection connection) | |
1714 { | |
1715 _connection = connection; | |
1716 _async.setConnection(connection); | |
1717 _endp = connection.getEndPoint(); | |
1718 _dns = connection.getResolveNames(); | |
1719 } | |
1720 | |
1721 /* ------------------------------------------------------------ */ | |
1722 /* | |
1723 * @see javax.servlet.ServletRequest#getContentType() | |
1724 */ | |
1725 public void setContentType(String contentType) | |
1726 { | |
1727 _connection.getRequestFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,contentType); | |
1728 | |
1729 } | |
1730 | |
1731 /* ------------------------------------------------------------ */ | |
1732 /** | |
1733 * Set request context | |
1734 * | |
1735 * @param context | |
1736 * context object | |
1737 */ | |
1738 public void setContext(Context context) | |
1739 { | |
1740 _newContext = _context != context; | |
1741 _context = context; | |
1742 } | |
1743 | |
1744 /* ------------------------------------------------------------ */ | |
1745 /** | |
1746 * @return True if this is the first call of {@link #takeNewContext()} since the last | |
1747 * {@link #setContext(org.eclipse.jetty.server.handler.ContextHandler.Context)} call. | |
1748 */ | |
1749 public boolean takeNewContext() | |
1750 { | |
1751 boolean nc = _newContext; | |
1752 _newContext = false; | |
1753 return nc; | |
1754 } | |
1755 | |
1756 /* ------------------------------------------------------------ */ | |
1757 /** | |
1758 * Sets the "context path" for this request | |
1759 * | |
1760 * @see HttpServletRequest#getContextPath() | |
1761 */ | |
1762 public void setContextPath(String contextPath) | |
1763 { | |
1764 _contextPath = contextPath; | |
1765 } | |
1766 | |
1767 /* ------------------------------------------------------------ */ | |
1768 /** | |
1769 * @param cookies | |
1770 * The cookies to set. | |
1771 */ | |
1772 public void setCookies(Cookie[] cookies) | |
1773 { | |
1774 if (_cookies == null) | |
1775 _cookies = new CookieCutter(); | |
1776 _cookies.setCookies(cookies); | |
1777 } | |
1778 | |
1779 /* ------------------------------------------------------------ */ | |
1780 public void setDispatcherType(DispatcherType type) | |
1781 { | |
1782 _dispatcherType = type; | |
1783 } | |
1784 | |
1785 /* ------------------------------------------------------------ */ | |
1786 public void setHandled(boolean h) | |
1787 { | |
1788 _handled = h; | |
1789 } | |
1790 | |
1791 /* ------------------------------------------------------------ */ | |
1792 /** | |
1793 * @param method | |
1794 * The method to set. | |
1795 */ | |
1796 public void setMethod(String method) | |
1797 { | |
1798 _method = method; | |
1799 } | |
1800 | |
1801 /* ------------------------------------------------------------ */ | |
1802 /** | |
1803 * @param parameters | |
1804 * The parameters to set. | |
1805 */ | |
1806 public void setParameters(MultiMap<String> parameters) | |
1807 { | |
1808 _parameters = (parameters == null)?_baseParameters:parameters; | |
1809 if (_paramsExtracted && _parameters == null) | |
1810 throw new IllegalStateException(); | |
1811 } | |
1812 | |
1813 /* ------------------------------------------------------------ */ | |
1814 /** | |
1815 * @param pathInfo | |
1816 * The pathInfo to set. | |
1817 */ | |
1818 public void setPathInfo(String pathInfo) | |
1819 { | |
1820 _pathInfo = pathInfo; | |
1821 } | |
1822 | |
1823 /* ------------------------------------------------------------ */ | |
1824 /** | |
1825 * @param protocol | |
1826 * The protocol to set. | |
1827 */ | |
1828 public void setProtocol(String protocol) | |
1829 { | |
1830 _protocol = protocol; | |
1831 } | |
1832 | |
1833 /* ------------------------------------------------------------ */ | |
1834 /** | |
1835 * Set the character encoding used for the query string. This call will effect the return of getQueryString and getParamaters. It must be called before any | |
1836 * geParameter methods. | |
1837 * | |
1838 * The request attribute "org.eclipse.jetty.server.server.Request.queryEncoding" may be set as an alternate method of calling setQueryEncoding. | |
1839 * | |
1840 * @param queryEncoding | |
1841 */ | |
1842 public void setQueryEncoding(String queryEncoding) | |
1843 { | |
1844 _queryEncoding = queryEncoding; | |
1845 _queryString = null; | |
1846 } | |
1847 | |
1848 /* ------------------------------------------------------------ */ | |
1849 /** | |
1850 * @param queryString | |
1851 * The queryString to set. | |
1852 */ | |
1853 public void setQueryString(String queryString) | |
1854 { | |
1855 _queryString = queryString; | |
1856 _queryEncoding = null; //assume utf-8 | |
1857 } | |
1858 | |
1859 /* ------------------------------------------------------------ */ | |
1860 /** | |
1861 * @param addr | |
1862 * The address to set. | |
1863 */ | |
1864 public void setRemoteAddr(String addr) | |
1865 { | |
1866 _remoteAddr = addr; | |
1867 } | |
1868 | |
1869 /* ------------------------------------------------------------ */ | |
1870 /** | |
1871 * @param host | |
1872 * The host to set. | |
1873 */ | |
1874 public void setRemoteHost(String host) | |
1875 { | |
1876 _remoteHost = host; | |
1877 } | |
1878 | |
1879 /* ------------------------------------------------------------ */ | |
1880 /** | |
1881 * @param requestedSessionId | |
1882 * The requestedSessionId to set. | |
1883 */ | |
1884 public void setRequestedSessionId(String requestedSessionId) | |
1885 { | |
1886 _requestedSessionId = requestedSessionId; | |
1887 } | |
1888 | |
1889 /* ------------------------------------------------------------ */ | |
1890 /** | |
1891 * @param requestedSessionIdCookie | |
1892 * The requestedSessionIdCookie to set. | |
1893 */ | |
1894 public void setRequestedSessionIdFromCookie(boolean requestedSessionIdCookie) | |
1895 { | |
1896 _requestedSessionIdFromCookie = requestedSessionIdCookie; | |
1897 } | |
1898 | |
1899 /* ------------------------------------------------------------ */ | |
1900 /** | |
1901 * @param requestURI | |
1902 * The requestURI to set. | |
1903 */ | |
1904 public void setRequestURI(String requestURI) | |
1905 { | |
1906 _requestURI = requestURI; | |
1907 } | |
1908 | |
1909 /* ------------------------------------------------------------ */ | |
1910 /** | |
1911 * @param scheme | |
1912 * The scheme to set. | |
1913 */ | |
1914 public void setScheme(String scheme) | |
1915 { | |
1916 _scheme = scheme; | |
1917 } | |
1918 | |
1919 /* ------------------------------------------------------------ */ | |
1920 /** | |
1921 * @param host | |
1922 * The host to set. | |
1923 */ | |
1924 public void setServerName(String host) | |
1925 { | |
1926 _serverName = host; | |
1927 } | |
1928 | |
1929 /* ------------------------------------------------------------ */ | |
1930 /** | |
1931 * @param port | |
1932 * The port to set. | |
1933 */ | |
1934 public void setServerPort(int port) | |
1935 { | |
1936 _port = port; | |
1937 } | |
1938 | |
1939 /* ------------------------------------------------------------ */ | |
1940 /** | |
1941 * @param servletPath | |
1942 * The servletPath to set. | |
1943 */ | |
1944 public void setServletPath(String servletPath) | |
1945 { | |
1946 _servletPath = servletPath; | |
1947 } | |
1948 | |
1949 /* ------------------------------------------------------------ */ | |
1950 /** | |
1951 * @param session | |
1952 * The session to set. | |
1953 */ | |
1954 public void setSession(HttpSession session) | |
1955 { | |
1956 _session = session; | |
1957 } | |
1958 | |
1959 /* ------------------------------------------------------------ */ | |
1960 /** | |
1961 * @param sessionManager | |
1962 * The sessionManager to set. | |
1963 */ | |
1964 public void setSessionManager(SessionManager sessionManager) | |
1965 { | |
1966 _sessionManager = sessionManager; | |
1967 } | |
1968 | |
1969 /* ------------------------------------------------------------ */ | |
1970 public void setTimeStamp(long ts) | |
1971 { | |
1972 _timeStamp = ts; | |
1973 } | |
1974 | |
1975 /* ------------------------------------------------------------ */ | |
1976 /** | |
1977 * @param uri | |
1978 * The uri to set. | |
1979 */ | |
1980 public void setUri(HttpURI uri) | |
1981 { | |
1982 _uri = uri; | |
1983 } | |
1984 | |
1985 /* ------------------------------------------------------------ */ | |
1986 public void setUserIdentityScope(UserIdentity.Scope scope) | |
1987 { | |
1988 _scope = scope; | |
1989 } | |
1990 | |
1991 /* ------------------------------------------------------------ */ | |
1992 /** | |
1993 * Set timetstamp of request dispatch | |
1994 * | |
1995 * @param value | |
1996 * timestamp | |
1997 */ | |
1998 public void setDispatchTime(long value) | |
1999 { | |
2000 _dispatchTime = value; | |
2001 } | |
2002 | |
2003 /* ------------------------------------------------------------ */ | |
2004 public AsyncContext startAsync() throws IllegalStateException | |
2005 { | |
2006 if (!_asyncSupported) | |
2007 throw new IllegalStateException("!asyncSupported"); | |
2008 _async.startAsync(); | |
2009 return _async; | |
2010 } | |
2011 | |
2012 /* ------------------------------------------------------------ */ | |
2013 public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException | |
2014 { | |
2015 if (!_asyncSupported) | |
2016 throw new IllegalStateException("!asyncSupported"); | |
2017 _async.startAsync(_context,servletRequest,servletResponse); | |
2018 return _async; | |
2019 } | |
2020 | |
2021 /* ------------------------------------------------------------ */ | |
2022 @Override | |
2023 public String toString() | |
2024 { | |
2025 return (_handled?"[":"(") + getMethod() + " " + _uri + (_handled?"]@":")@") + hashCode() + " " + super.toString(); | |
2026 } | |
2027 | |
2028 /* ------------------------------------------------------------ */ | |
2029 public boolean authenticate(HttpServletResponse response) throws IOException, ServletException | |
2030 { | |
2031 if (_authentication instanceof Authentication.Deferred) | |
2032 { | |
2033 setAuthentication(((Authentication.Deferred)_authentication).authenticate(this,response)); | |
2034 return !(_authentication instanceof Authentication.ResponseSent); | |
2035 } | |
2036 response.sendError(HttpStatus.UNAUTHORIZED_401); | |
2037 return false; | |
2038 } | |
2039 | |
2040 /* ------------------------------------------------------------ */ | |
2041 public Part getPart(String name) throws IOException, ServletException | |
2042 { | |
2043 getParts(); | |
2044 return _multiPartInputStream.getPart(name); | |
2045 } | |
2046 | |
2047 /* ------------------------------------------------------------ */ | |
2048 public Collection<Part> getParts() throws IOException, ServletException | |
2049 { | |
2050 if (getContentType() == null || !getContentType().startsWith("multipart/form-data")) | |
2051 throw new ServletException("Content-Type != multipart/form-data"); | |
2052 | |
2053 if (_multiPartInputStream == null) | |
2054 _multiPartInputStream = (MultiPartInputStream)getAttribute(__MULTIPART_INPUT_STREAM); | |
2055 | |
2056 if (_multiPartInputStream == null) | |
2057 { | |
2058 MultipartConfigElement config = (MultipartConfigElement)getAttribute(__MULTIPART_CONFIG_ELEMENT); | |
2059 | |
2060 if (config == null) | |
2061 throw new IllegalStateException("No multipart config for servlet"); | |
2062 | |
2063 _multiPartInputStream = new MultiPartInputStream(getInputStream(), | |
2064 getContentType(), config, | |
2065 (_context != null?(File)_context.getAttribute("javax.servlet.context.tempdir"):null)); | |
2066 | |
2067 setAttribute(__MULTIPART_INPUT_STREAM, _multiPartInputStream); | |
2068 setAttribute(__MULTIPART_CONTEXT, _context); | |
2069 Collection<Part> parts = _multiPartInputStream.getParts(); //causes parsing | |
2070 for (Part p:parts) | |
2071 { | |
2072 MultiPartInputStream.MultiPart mp = (MultiPartInputStream.MultiPart)p; | |
2073 if (mp.getContentDispositionFilename() == null) | |
2074 { | |
2075 //Servlet Spec 3.0 pg 23, parts without filenames must be put into init params | |
2076 String charset = null; | |
2077 if (mp.getContentType() != null) | |
2078 charset = MimeTypes.getCharsetFromContentType(new ByteArrayBuffer(mp.getContentType())); | |
2079 | |
2080 ByteArrayOutputStream os = null; | |
2081 InputStream is = mp.getInputStream(); //get the bytes regardless of being in memory or in temp file | |
2082 try | |
2083 { | |
2084 os = new ByteArrayOutputStream(); | |
2085 IO.copy(is, os); | |
2086 String content=new String(os.toByteArray(),charset==null?StringUtil.__UTF8:charset); | |
2087 getParameter(""); //cause params to be evaluated | |
2088 getParameters().add(mp.getName(), content); | |
2089 } | |
2090 finally | |
2091 { | |
2092 IO.close(os); | |
2093 IO.close(is); | |
2094 } | |
2095 } | |
2096 } | |
2097 } | |
2098 | |
2099 return _multiPartInputStream.getParts(); | |
2100 } | |
2101 | |
2102 /* ------------------------------------------------------------ */ | |
2103 public void login(String username, String password) throws ServletException | |
2104 { | |
2105 if (_authentication instanceof Authentication.Deferred) | |
2106 { | |
2107 _authentication=((Authentication.Deferred)_authentication).login(username,password,this); | |
2108 if (_authentication == null) | |
2109 throw new ServletException(); | |
2110 } | |
2111 else | |
2112 { | |
2113 throw new ServletException("Authenticated as "+_authentication); | |
2114 } | |
2115 } | |
2116 | |
2117 /* ------------------------------------------------------------ */ | |
2118 public void logout() throws ServletException | |
2119 { | |
2120 if (_authentication instanceof Authentication.User) | |
2121 ((Authentication.User)_authentication).logout(); | |
2122 _authentication=Authentication.UNAUTHENTICATED; | |
2123 } | |
2124 | |
2125 /* ------------------------------------------------------------ */ | |
2126 /** | |
2127 * Merge in a new query string. The query string is merged with the existing parameters and {@link #setParameters(MultiMap)} and | |
2128 * {@link #setQueryString(String)} are called with the result. The merge is according to the rules of the servlet dispatch forward method. | |
2129 * | |
2130 * @param query | |
2131 * The query string to merge into the request. | |
2132 */ | |
2133 public void mergeQueryString(String query) | |
2134 { | |
2135 // extract parameters from dispatch query | |
2136 MultiMap<String> parameters = new MultiMap<String>(); | |
2137 UrlEncoded.decodeTo(query,parameters, StringUtil.__UTF8); //have to assume UTF-8 because we can't know otherwise | |
2138 | |
2139 boolean merge_old_query = false; | |
2140 | |
2141 // Have we evaluated parameters | |
2142 if (!_paramsExtracted) | |
2143 extractParameters(); | |
2144 | |
2145 // Are there any existing parameters? | |
2146 if (_parameters != null && _parameters.size() > 0) | |
2147 { | |
2148 // Merge parameters; new parameters of the same name take precedence. | |
2149 Iterator<Entry<String, Object>> iter = _parameters.entrySet().iterator(); | |
2150 while (iter.hasNext()) | |
2151 { | |
2152 Map.Entry<String, Object> entry = iter.next(); | |
2153 String name = entry.getKey(); | |
2154 | |
2155 // If the names match, we will need to remake the query string | |
2156 if (parameters.containsKey(name)) | |
2157 merge_old_query = true; | |
2158 | |
2159 // Add the old values to the new parameter map | |
2160 Object values = entry.getValue(); | |
2161 for (int i = 0; i < LazyList.size(values); i++) | |
2162 parameters.add(name,LazyList.get(values,i)); | |
2163 } | |
2164 } | |
2165 | |
2166 if (_queryString != null && _queryString.length() > 0) | |
2167 { | |
2168 if (merge_old_query) | |
2169 { | |
2170 StringBuilder overridden_query_string = new StringBuilder(); | |
2171 MultiMap<String> overridden_old_query = new MultiMap<String>(); | |
2172 UrlEncoded.decodeTo(_queryString,overridden_old_query,getQueryEncoding());//decode using any queryencoding set for the request | |
2173 | |
2174 | |
2175 MultiMap<String> overridden_new_query = new MultiMap<String>(); | |
2176 UrlEncoded.decodeTo(query,overridden_new_query,StringUtil.__UTF8); //have to assume utf8 as we cannot know otherwise | |
2177 | |
2178 Iterator<Entry<String, Object>> iter = overridden_old_query.entrySet().iterator(); | |
2179 while (iter.hasNext()) | |
2180 { | |
2181 Map.Entry<String, Object> entry = iter.next(); | |
2182 String name = entry.getKey(); | |
2183 if (!overridden_new_query.containsKey(name)) | |
2184 { | |
2185 Object values = entry.getValue(); | |
2186 for (int i = 0; i < LazyList.size(values); i++) | |
2187 { | |
2188 overridden_query_string.append("&").append(name).append("=").append((Object)LazyList.get(values,i)); | |
2189 } | |
2190 } | |
2191 } | |
2192 | |
2193 query = query + overridden_query_string; | |
2194 } | |
2195 else | |
2196 { | |
2197 query = query + "&" + _queryString; | |
2198 } | |
2199 } | |
2200 | |
2201 setParameters(parameters); | |
2202 setQueryString(query); | |
2203 } | |
2204 } |