103928aee4356845252ac6b662d5c72c29903813eJake Slack//
203928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
303928aee4356845252ac6b662d5c72c29903813eJake Slack//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
403928aee4356845252ac6b662d5c72c29903813eJake Slack//  ------------------------------------------------------------------------
503928aee4356845252ac6b662d5c72c29903813eJake Slack//  All rights reserved. This program and the accompanying materials
603928aee4356845252ac6b662d5c72c29903813eJake Slack//  are made available under the terms of the Eclipse Public License v1.0
703928aee4356845252ac6b662d5c72c29903813eJake Slack//  and Apache License v2.0 which accompanies this distribution.
803928aee4356845252ac6b662d5c72c29903813eJake Slack//
903928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Eclipse Public License is available at
1003928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.eclipse.org/legal/epl-v10.html
1103928aee4356845252ac6b662d5c72c29903813eJake Slack//
1203928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Apache License v2.0 is available at
1303928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.opensource.org/licenses/apache2.0.php
1403928aee4356845252ac6b662d5c72c29903813eJake Slack//
1503928aee4356845252ac6b662d5c72c29903813eJake Slack//  You may elect to redistribute this code under either of these licenses.
1603928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
1703928aee4356845252ac6b662d5c72c29903813eJake Slack//
1803928aee4356845252ac6b662d5c72c29903813eJake Slack
1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.server;
2003928aee4356845252ac6b662d5c72c29903813eJake Slack
2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.BufferedReader;
2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.ByteArrayOutputStream;
2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.File;
2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.IOException;
2503928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.InputStream;
2603928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.InputStreamReader;
2703928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.UnsupportedEncodingException;
2803928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.net.InetAddress;
2903928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.nio.ByteBuffer;
3003928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.security.Principal;
3103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Collection;
3203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Collections;
3303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Enumeration;
3403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.EventListener;
3503928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.HashMap;
3603928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Iterator;
3703928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.List;
3803928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Locale;
3903928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Map;
4003928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.Map.Entry;
4103928aee4356845252ac6b662d5c72c29903813eJake Slack
4203928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.AsyncContext;
4303928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.AsyncEvent;
4403928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.AsyncListener;
4503928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.DispatcherType;
4603928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.MultipartConfigElement;
4703928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.RequestDispatcher;
4803928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletContext;
4903928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletException;
5003928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletInputStream;
5103928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletRequest;
5203928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletRequestAttributeEvent;
5303928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletRequestAttributeListener;
5403928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletRequestEvent;
5503928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletRequestListener;
5603928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.ServletResponse;
5703928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.Cookie;
5803928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpServletRequest;
5903928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpServletResponse;
6003928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.HttpSession;
6103928aee4356845252ac6b662d5c72c29903813eJake Slackimport javax.servlet.http.Part;
6203928aee4356845252ac6b662d5c72c29903813eJake Slack
6303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.continuation.Continuation;
6403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.continuation.ContinuationListener;
6503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpCookie;
6603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpFields;
6703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpHeaders;
6803928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpMethods;
6903928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpParser;
7003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpStatus;
7103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpURI;
7203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.HttpVersions;
7303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.http.MimeTypes;
7403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.Buffer;
7503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.BufferUtil;
7603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.ByteArrayBuffer;
7703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.EndPoint;
7803928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.nio.DirectNIOBuffer;
7903928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.nio.IndirectNIOBuffer;
8003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.nio.NIOBuffer;
8103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.handler.ContextHandler;
8203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.server.handler.ContextHandler.Context;
8303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.Attributes;
8403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.AttributesMap;
8503928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.IO;
8603928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.LazyList;
8703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.MultiException;
8803928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.MultiMap;
8903928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.MultiPartInputStream;
9003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.StringUtil;
9103928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.URIUtil;
9203928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.UrlEncoded;
9303928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Log;
9403928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Logger;
9503928aee4356845252ac6b662d5c72c29903813eJake Slack
9603928aee4356845252ac6b662d5c72c29903813eJake Slack/* ------------------------------------------------------------ */
9703928aee4356845252ac6b662d5c72c29903813eJake Slack/**
9803928aee4356845252ac6b662d5c72c29903813eJake Slack * Jetty Request.
9903928aee4356845252ac6b662d5c72c29903813eJake Slack * <p>
10003928aee4356845252ac6b662d5c72c29903813eJake Slack * Implements {@link javax.servlet.http.HttpServletRequest} from the <code>javax.servlet.http</code> package.
10103928aee4356845252ac6b662d5c72c29903813eJake Slack * </p>
10203928aee4356845252ac6b662d5c72c29903813eJake Slack * <p>
10303928aee4356845252ac6b662d5c72c29903813eJake Slack * 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
10403928aee4356845252ac6b662d5c72c29903813eJake Slack * request object to be as lightweight as possible and not actually implement any significant behavior. For example
10503928aee4356845252ac6b662d5c72c29903813eJake Slack * <ul>
10603928aee4356845252ac6b662d5c72c29903813eJake Slack *
10703928aee4356845252ac6b662d5c72c29903813eJake Slack * <li>The {@link Request#getContextPath()} method will return null, until the request has been passed to a {@link ContextHandler} which matches the
10803928aee4356845252ac6b662d5c72c29903813eJake Slack * {@link Request#getPathInfo()} with a context path and calls {@link Request#setContextPath(String)} as a result.</li>
10903928aee4356845252ac6b662d5c72c29903813eJake Slack *
11003928aee4356845252ac6b662d5c72c29903813eJake Slack * <li>the HTTP session methods will all return null sessions until such time as a request has been passed to a
11103928aee4356845252ac6b662d5c72c29903813eJake Slack * {@link org.eclipse.jetty.server.session.SessionHandler} which checks for session cookies and enables the ability to create new sessions.</li>
11203928aee4356845252ac6b662d5c72c29903813eJake Slack *
11303928aee4356845252ac6b662d5c72c29903813eJake Slack * <li>The {@link Request#getServletPath()} method will return null until the request has been passed to a <code>org.eclipse.jetty.servlet.ServletHandler</code>
11403928aee4356845252ac6b662d5c72c29903813eJake Slack * and the pathInfo matched against the servlet URL patterns and {@link Request#setServletPath(String)} called as a result.</li>
11503928aee4356845252ac6b662d5c72c29903813eJake Slack * </ul>
11603928aee4356845252ac6b662d5c72c29903813eJake Slack *
11703928aee4356845252ac6b662d5c72c29903813eJake Slack * A request instance is created for each {@link AbstractHttpConnection} accepted by the server and recycled for each HTTP request received via that connection.
11803928aee4356845252ac6b662d5c72c29903813eJake Slack * An effort is made to avoid reparsing headers and cookies that are likely to be the same for requests from the same connection.
11903928aee4356845252ac6b662d5c72c29903813eJake Slack *
12003928aee4356845252ac6b662d5c72c29903813eJake Slack * <p>
12103928aee4356845252ac6b662d5c72c29903813eJake Slack * The form content that a request can process is limited to protect from Denial of Service attacks. The size in bytes is limited by
12203928aee4356845252ac6b662d5c72c29903813eJake Slack * {@link ContextHandler#getMaxFormContentSize()} or if there is no context then the "org.eclipse.jetty.server.Request.maxFormContentSize" {@link Server}
12303928aee4356845252ac6b662d5c72c29903813eJake Slack * attribute. The number of parameters keys is limited by {@link ContextHandler#getMaxFormKeys()} or if there is no context then the
12403928aee4356845252ac6b662d5c72c29903813eJake Slack * "org.eclipse.jetty.server.Request.maxFormKeys" {@link Server} attribute.
12503928aee4356845252ac6b662d5c72c29903813eJake Slack *
12603928aee4356845252ac6b662d5c72c29903813eJake Slack *
12703928aee4356845252ac6b662d5c72c29903813eJake Slack */
12803928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class Request implements HttpServletRequest
12903928aee4356845252ac6b662d5c72c29903813eJake Slack{
13003928aee4356845252ac6b662d5c72c29903813eJake Slack    public static final String __MULTIPART_CONFIG_ELEMENT = "org.eclipse.multipartConfig";
13103928aee4356845252ac6b662d5c72c29903813eJake Slack    public static final String __MULTIPART_INPUT_STREAM = "org.eclipse.multiPartInputStream";
13203928aee4356845252ac6b662d5c72c29903813eJake Slack    public static final String __MULTIPART_CONTEXT = "org.eclipse.multiPartContext";
13303928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final Logger LOG = Log.getLogger(Request.class);
13403928aee4356845252ac6b662d5c72c29903813eJake Slack
13503928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final String __ASYNC_FWD = "org.eclipse.asyncfwd";
13603928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final Collection __defaultLocale = Collections.singleton(Locale.getDefault());
13703928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final int __NONE = 0, _STREAM = 1, __READER = 2;
13803928aee4356845252ac6b662d5c72c29903813eJake Slack
13903928aee4356845252ac6b662d5c72c29903813eJake Slack    public static class MultiPartCleanerListener implements ServletRequestListener
14003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
14103928aee4356845252ac6b662d5c72c29903813eJake Slack
14203928aee4356845252ac6b662d5c72c29903813eJake Slack        @Override
14303928aee4356845252ac6b662d5c72c29903813eJake Slack        public void requestDestroyed(ServletRequestEvent sre)
14403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
14503928aee4356845252ac6b662d5c72c29903813eJake Slack            //Clean up any tmp files created by MultiPartInputStream
14603928aee4356845252ac6b662d5c72c29903813eJake Slack            MultiPartInputStream mpis = (MultiPartInputStream)sre.getServletRequest().getAttribute(__MULTIPART_INPUT_STREAM);
14703928aee4356845252ac6b662d5c72c29903813eJake Slack            if (mpis != null)
14803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
14903928aee4356845252ac6b662d5c72c29903813eJake Slack                ContextHandler.Context context = (ContextHandler.Context)sre.getServletRequest().getAttribute(__MULTIPART_CONTEXT);
15003928aee4356845252ac6b662d5c72c29903813eJake Slack
15103928aee4356845252ac6b662d5c72c29903813eJake Slack                //Only do the cleanup if we are exiting from the context in which a servlet parsed the multipart files
15203928aee4356845252ac6b662d5c72c29903813eJake Slack                if (context == sre.getServletContext())
15303928aee4356845252ac6b662d5c72c29903813eJake Slack                {
15403928aee4356845252ac6b662d5c72c29903813eJake Slack                    try
15503928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
15603928aee4356845252ac6b662d5c72c29903813eJake Slack                        mpis.deleteParts();
15703928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
15803928aee4356845252ac6b662d5c72c29903813eJake Slack                    catch (MultiException e)
15903928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
16003928aee4356845252ac6b662d5c72c29903813eJake Slack                        sre.getServletContext().log("Errors deleting multipart tmp files", e);
16103928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
16203928aee4356845252ac6b662d5c72c29903813eJake Slack                }
16303928aee4356845252ac6b662d5c72c29903813eJake Slack            }
16403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
16503928aee4356845252ac6b662d5c72c29903813eJake Slack
16603928aee4356845252ac6b662d5c72c29903813eJake Slack        @Override
16703928aee4356845252ac6b662d5c72c29903813eJake Slack        public void requestInitialized(ServletRequestEvent sre)
16803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
16903928aee4356845252ac6b662d5c72c29903813eJake Slack            //nothing to do, multipart config set up by ServletHolder.handle()
17003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
17103928aee4356845252ac6b662d5c72c29903813eJake Slack
17203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
17303928aee4356845252ac6b662d5c72c29903813eJake Slack
17403928aee4356845252ac6b662d5c72c29903813eJake Slack
17503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
17603928aee4356845252ac6b662d5c72c29903813eJake Slack    public static Request getRequest(HttpServletRequest request)
17703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
17803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (request instanceof Request)
17903928aee4356845252ac6b662d5c72c29903813eJake Slack            return (Request)request;
18003928aee4356845252ac6b662d5c72c29903813eJake Slack
18103928aee4356845252ac6b662d5c72c29903813eJake Slack        return AbstractHttpConnection.getCurrentConnection().getRequest();
18203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
18303928aee4356845252ac6b662d5c72c29903813eJake Slack    protected final AsyncContinuation _async = new AsyncContinuation();
18403928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _asyncSupported = true;
18503928aee4356845252ac6b662d5c72c29903813eJake Slack    private volatile Attributes _attributes;
18603928aee4356845252ac6b662d5c72c29903813eJake Slack    private Authentication _authentication;
18703928aee4356845252ac6b662d5c72c29903813eJake Slack    private MultiMap<String> _baseParameters;
18803928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _characterEncoding;
18903928aee4356845252ac6b662d5c72c29903813eJake Slack    protected AbstractHttpConnection _connection;
19003928aee4356845252ac6b662d5c72c29903813eJake Slack    private ContextHandler.Context _context;
19103928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _newContext;
19203928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _contextPath;
19303928aee4356845252ac6b662d5c72c29903813eJake Slack    private CookieCutter _cookies;
19403928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _cookiesExtracted = false;
19503928aee4356845252ac6b662d5c72c29903813eJake Slack    private DispatcherType _dispatcherType;
19603928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _dns = false;
19703928aee4356845252ac6b662d5c72c29903813eJake Slack    private EndPoint _endp;
19803928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _handled = false;
19903928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _inputState = __NONE;
20003928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _method;
20103928aee4356845252ac6b662d5c72c29903813eJake Slack    private MultiMap<String> _parameters;
20203928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _paramsExtracted;
20303928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _pathInfo;
20403928aee4356845252ac6b662d5c72c29903813eJake Slack    private int _port;
20503928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _protocol = HttpVersions.HTTP_1_1;
20603928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _queryEncoding;
20703928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _queryString;
20803928aee4356845252ac6b662d5c72c29903813eJake Slack    private BufferedReader _reader;
20903928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _readerEncoding;
21003928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _remoteAddr;
21103928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _remoteHost;
21203928aee4356845252ac6b662d5c72c29903813eJake Slack    private Object _requestAttributeListeners;
21303928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _requestedSessionId;
21403928aee4356845252ac6b662d5c72c29903813eJake Slack    private boolean _requestedSessionIdFromCookie = false;
21503928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _requestURI;
21603928aee4356845252ac6b662d5c72c29903813eJake Slack    private Map<Object, HttpSession> _savedNewSessions;
21703928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _scheme = URIUtil.HTTP;
21803928aee4356845252ac6b662d5c72c29903813eJake Slack    private UserIdentity.Scope _scope;
21903928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _serverName;
22003928aee4356845252ac6b662d5c72c29903813eJake Slack    private String _servletPath;
22103928aee4356845252ac6b662d5c72c29903813eJake Slack    private HttpSession _session;
22203928aee4356845252ac6b662d5c72c29903813eJake Slack    private SessionManager _sessionManager;
22303928aee4356845252ac6b662d5c72c29903813eJake Slack    private long _timeStamp;
22403928aee4356845252ac6b662d5c72c29903813eJake Slack    private long _dispatchTime;
22503928aee4356845252ac6b662d5c72c29903813eJake Slack
22603928aee4356845252ac6b662d5c72c29903813eJake Slack    private Buffer _timeStampBuffer;
22703928aee4356845252ac6b662d5c72c29903813eJake Slack    private HttpURI _uri;
22803928aee4356845252ac6b662d5c72c29903813eJake Slack
22903928aee4356845252ac6b662d5c72c29903813eJake Slack    private MultiPartInputStream _multiPartInputStream; //if the request is a multi-part mime
23003928aee4356845252ac6b662d5c72c29903813eJake Slack
23103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
23203928aee4356845252ac6b662d5c72c29903813eJake Slack    public Request()
23303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
23403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
23503928aee4356845252ac6b662d5c72c29903813eJake Slack
23603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
23703928aee4356845252ac6b662d5c72c29903813eJake Slack    public Request(AbstractHttpConnection connection)
23803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
23903928aee4356845252ac6b662d5c72c29903813eJake Slack        setConnection(connection);
24003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
24103928aee4356845252ac6b662d5c72c29903813eJake Slack
24203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
24303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void addEventListener(final EventListener listener)
24403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
24503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (listener instanceof ServletRequestAttributeListener)
24603928aee4356845252ac6b662d5c72c29903813eJake Slack            _requestAttributeListeners = LazyList.add(_requestAttributeListeners,listener);
24703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (listener instanceof ContinuationListener)
24803928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalArgumentException(listener.getClass().toString());
24903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (listener instanceof AsyncListener)
25003928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalArgumentException(listener.getClass().toString());
25103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
25203928aee4356845252ac6b662d5c72c29903813eJake Slack
25303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
25403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
25503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Extract Parameters from query string and/or form _content.
25603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
25703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void extractParameters()
25803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
25903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_baseParameters == null)
26003928aee4356845252ac6b662d5c72c29903813eJake Slack            _baseParameters = new MultiMap(16);
26103928aee4356845252ac6b662d5c72c29903813eJake Slack
26203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_paramsExtracted)
26303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
26403928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_parameters == null)
26503928aee4356845252ac6b662d5c72c29903813eJake Slack                _parameters = _baseParameters;
26603928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
26703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
26803928aee4356845252ac6b662d5c72c29903813eJake Slack
26903928aee4356845252ac6b662d5c72c29903813eJake Slack        _paramsExtracted = true;
27003928aee4356845252ac6b662d5c72c29903813eJake Slack
27103928aee4356845252ac6b662d5c72c29903813eJake Slack        try
27203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
27303928aee4356845252ac6b662d5c72c29903813eJake Slack            // Handle query string
27403928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_uri != null && _uri.hasQuery())
27503928aee4356845252ac6b662d5c72c29903813eJake Slack            {
27603928aee4356845252ac6b662d5c72c29903813eJake Slack                if (_queryEncoding == null)
27703928aee4356845252ac6b662d5c72c29903813eJake Slack                    _uri.decodeQueryTo(_baseParameters);
27803928aee4356845252ac6b662d5c72c29903813eJake Slack                else
27903928aee4356845252ac6b662d5c72c29903813eJake Slack                {
28003928aee4356845252ac6b662d5c72c29903813eJake Slack                    try
28103928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
28203928aee4356845252ac6b662d5c72c29903813eJake Slack                        _uri.decodeQueryTo(_baseParameters,_queryEncoding);
28303928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
28403928aee4356845252ac6b662d5c72c29903813eJake Slack                    catch (UnsupportedEncodingException e)
28503928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
28603928aee4356845252ac6b662d5c72c29903813eJake Slack                        if (LOG.isDebugEnabled())
28703928aee4356845252ac6b662d5c72c29903813eJake Slack                            LOG.warn(e);
28803928aee4356845252ac6b662d5c72c29903813eJake Slack                        else
28903928aee4356845252ac6b662d5c72c29903813eJake Slack                            LOG.warn(e.toString());
29003928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
29103928aee4356845252ac6b662d5c72c29903813eJake Slack                }
29203928aee4356845252ac6b662d5c72c29903813eJake Slack            }
29303928aee4356845252ac6b662d5c72c29903813eJake Slack
29403928aee4356845252ac6b662d5c72c29903813eJake Slack            // handle any _content.
29503928aee4356845252ac6b662d5c72c29903813eJake Slack            String encoding = getCharacterEncoding();
29603928aee4356845252ac6b662d5c72c29903813eJake Slack            String content_type = getContentType();
29703928aee4356845252ac6b662d5c72c29903813eJake Slack            if (content_type != null && content_type.length() > 0)
29803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
29903928aee4356845252ac6b662d5c72c29903813eJake Slack                content_type = HttpFields.valueParameters(content_type,null);
30003928aee4356845252ac6b662d5c72c29903813eJake Slack
30103928aee4356845252ac6b662d5c72c29903813eJake Slack                if (MimeTypes.FORM_ENCODED.equalsIgnoreCase(content_type) && _inputState == __NONE
30203928aee4356845252ac6b662d5c72c29903813eJake Slack                        && (HttpMethods.POST.equals(getMethod()) || HttpMethods.PUT.equals(getMethod())))
30303928aee4356845252ac6b662d5c72c29903813eJake Slack                {
30403928aee4356845252ac6b662d5c72c29903813eJake Slack                    int content_length = getContentLength();
30503928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (content_length != 0)
30603928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
30703928aee4356845252ac6b662d5c72c29903813eJake Slack                        try
30803928aee4356845252ac6b662d5c72c29903813eJake Slack                        {
30903928aee4356845252ac6b662d5c72c29903813eJake Slack                            int maxFormContentSize = -1;
31003928aee4356845252ac6b662d5c72c29903813eJake Slack                            int maxFormKeys = -1;
31103928aee4356845252ac6b662d5c72c29903813eJake Slack
31203928aee4356845252ac6b662d5c72c29903813eJake Slack                            if (_context != null)
31303928aee4356845252ac6b662d5c72c29903813eJake Slack                            {
31403928aee4356845252ac6b662d5c72c29903813eJake Slack                                maxFormContentSize = _context.getContextHandler().getMaxFormContentSize();
31503928aee4356845252ac6b662d5c72c29903813eJake Slack                                maxFormKeys = _context.getContextHandler().getMaxFormKeys();
31603928aee4356845252ac6b662d5c72c29903813eJake Slack                            }
31703928aee4356845252ac6b662d5c72c29903813eJake Slack
31803928aee4356845252ac6b662d5c72c29903813eJake Slack                            if (maxFormContentSize < 0)
31903928aee4356845252ac6b662d5c72c29903813eJake Slack                            {
32003928aee4356845252ac6b662d5c72c29903813eJake Slack                                Object obj = _connection.getConnector().getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormContentSize");
32103928aee4356845252ac6b662d5c72c29903813eJake Slack                                if (obj == null)
32203928aee4356845252ac6b662d5c72c29903813eJake Slack                                    maxFormContentSize = 200000;
32303928aee4356845252ac6b662d5c72c29903813eJake Slack                                else if (obj instanceof Number)
32403928aee4356845252ac6b662d5c72c29903813eJake Slack                                {
32503928aee4356845252ac6b662d5c72c29903813eJake Slack                                    Number size = (Number)obj;
32603928aee4356845252ac6b662d5c72c29903813eJake Slack                                    maxFormContentSize = size.intValue();
32703928aee4356845252ac6b662d5c72c29903813eJake Slack                                }
32803928aee4356845252ac6b662d5c72c29903813eJake Slack                                else if (obj instanceof String)
32903928aee4356845252ac6b662d5c72c29903813eJake Slack                                {
33003928aee4356845252ac6b662d5c72c29903813eJake Slack                                    maxFormContentSize = Integer.valueOf((String)obj);
33103928aee4356845252ac6b662d5c72c29903813eJake Slack                                }
33203928aee4356845252ac6b662d5c72c29903813eJake Slack                            }
33303928aee4356845252ac6b662d5c72c29903813eJake Slack
33403928aee4356845252ac6b662d5c72c29903813eJake Slack                            if (maxFormKeys < 0)
33503928aee4356845252ac6b662d5c72c29903813eJake Slack                            {
33603928aee4356845252ac6b662d5c72c29903813eJake Slack                                Object obj = _connection.getConnector().getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormKeys");
33703928aee4356845252ac6b662d5c72c29903813eJake Slack                                if (obj == null)
33803928aee4356845252ac6b662d5c72c29903813eJake Slack                                    maxFormKeys = 1000;
33903928aee4356845252ac6b662d5c72c29903813eJake Slack                                else if (obj instanceof Number)
34003928aee4356845252ac6b662d5c72c29903813eJake Slack                                {
34103928aee4356845252ac6b662d5c72c29903813eJake Slack                                    Number keys = (Number)obj;
34203928aee4356845252ac6b662d5c72c29903813eJake Slack                                    maxFormKeys = keys.intValue();
34303928aee4356845252ac6b662d5c72c29903813eJake Slack                                }
34403928aee4356845252ac6b662d5c72c29903813eJake Slack                                else if (obj instanceof String)
34503928aee4356845252ac6b662d5c72c29903813eJake Slack                                {
34603928aee4356845252ac6b662d5c72c29903813eJake Slack                                    maxFormKeys = Integer.valueOf((String)obj);
34703928aee4356845252ac6b662d5c72c29903813eJake Slack                                }
34803928aee4356845252ac6b662d5c72c29903813eJake Slack                            }
34903928aee4356845252ac6b662d5c72c29903813eJake Slack
35003928aee4356845252ac6b662d5c72c29903813eJake Slack                            if (content_length > maxFormContentSize && maxFormContentSize > 0)
35103928aee4356845252ac6b662d5c72c29903813eJake Slack                            {
35203928aee4356845252ac6b662d5c72c29903813eJake Slack                                throw new IllegalStateException("Form too large " + content_length + ">" + maxFormContentSize);
35303928aee4356845252ac6b662d5c72c29903813eJake Slack                            }
35403928aee4356845252ac6b662d5c72c29903813eJake Slack                            InputStream in = getInputStream();
35503928aee4356845252ac6b662d5c72c29903813eJake Slack
35603928aee4356845252ac6b662d5c72c29903813eJake Slack                            // Add form params to query params
35703928aee4356845252ac6b662d5c72c29903813eJake Slack                            UrlEncoded.decodeTo(in,_baseParameters,encoding,content_length < 0?maxFormContentSize:-1,maxFormKeys);
35803928aee4356845252ac6b662d5c72c29903813eJake Slack                        }
35903928aee4356845252ac6b662d5c72c29903813eJake Slack                        catch (IOException e)
36003928aee4356845252ac6b662d5c72c29903813eJake Slack                        {
36103928aee4356845252ac6b662d5c72c29903813eJake Slack                            if (LOG.isDebugEnabled())
36203928aee4356845252ac6b662d5c72c29903813eJake Slack                                LOG.warn(e);
36303928aee4356845252ac6b662d5c72c29903813eJake Slack                            else
36403928aee4356845252ac6b662d5c72c29903813eJake Slack                                LOG.warn(e.toString());
36503928aee4356845252ac6b662d5c72c29903813eJake Slack                        }
36603928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
36703928aee4356845252ac6b662d5c72c29903813eJake Slack                }
36803928aee4356845252ac6b662d5c72c29903813eJake Slack
36903928aee4356845252ac6b662d5c72c29903813eJake Slack            }
37003928aee4356845252ac6b662d5c72c29903813eJake Slack
37103928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_parameters == null)
37203928aee4356845252ac6b662d5c72c29903813eJake Slack                _parameters = _baseParameters;
37303928aee4356845252ac6b662d5c72c29903813eJake Slack            else if (_parameters != _baseParameters)
37403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
37503928aee4356845252ac6b662d5c72c29903813eJake Slack                // Merge parameters (needed if parameters extracted after a forward).
37603928aee4356845252ac6b662d5c72c29903813eJake Slack                Iterator iter = _baseParameters.entrySet().iterator();
37703928aee4356845252ac6b662d5c72c29903813eJake Slack                while (iter.hasNext())
37803928aee4356845252ac6b662d5c72c29903813eJake Slack                {
37903928aee4356845252ac6b662d5c72c29903813eJake Slack                    Map.Entry entry = (Map.Entry)iter.next();
38003928aee4356845252ac6b662d5c72c29903813eJake Slack                    String name = (String)entry.getKey();
38103928aee4356845252ac6b662d5c72c29903813eJake Slack                    Object values = entry.getValue();
38203928aee4356845252ac6b662d5c72c29903813eJake Slack                    for (int i = 0; i < LazyList.size(values); i++)
38303928aee4356845252ac6b662d5c72c29903813eJake Slack                        _parameters.add(name,LazyList.get(values,i));
38403928aee4356845252ac6b662d5c72c29903813eJake Slack                }
38503928aee4356845252ac6b662d5c72c29903813eJake Slack            }
38603928aee4356845252ac6b662d5c72c29903813eJake Slack
38703928aee4356845252ac6b662d5c72c29903813eJake Slack            if (content_type != null && content_type.length()>0 && content_type.startsWith("multipart/form-data") && getAttribute(__MULTIPART_CONFIG_ELEMENT)!=null)
38803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
38903928aee4356845252ac6b662d5c72c29903813eJake Slack                try
39003928aee4356845252ac6b662d5c72c29903813eJake Slack                {
39103928aee4356845252ac6b662d5c72c29903813eJake Slack                    getParts();
39203928aee4356845252ac6b662d5c72c29903813eJake Slack                }
39303928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (IOException e)
39403928aee4356845252ac6b662d5c72c29903813eJake Slack                {
39503928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (LOG.isDebugEnabled())
39603928aee4356845252ac6b662d5c72c29903813eJake Slack                        LOG.warn(e);
39703928aee4356845252ac6b662d5c72c29903813eJake Slack                    else
39803928aee4356845252ac6b662d5c72c29903813eJake Slack                        LOG.warn(e.toString());
39903928aee4356845252ac6b662d5c72c29903813eJake Slack                }
40003928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (ServletException e)
40103928aee4356845252ac6b662d5c72c29903813eJake Slack                {
40203928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (LOG.isDebugEnabled())
40303928aee4356845252ac6b662d5c72c29903813eJake Slack                        LOG.warn(e);
40403928aee4356845252ac6b662d5c72c29903813eJake Slack                    else
40503928aee4356845252ac6b662d5c72c29903813eJake Slack                        LOG.warn(e.toString());
40603928aee4356845252ac6b662d5c72c29903813eJake Slack                }
40703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
40803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
40903928aee4356845252ac6b662d5c72c29903813eJake Slack        finally
41003928aee4356845252ac6b662d5c72c29903813eJake Slack        {
41103928aee4356845252ac6b662d5c72c29903813eJake Slack            // ensure params always set (even if empty) after extraction
41203928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_parameters == null)
41303928aee4356845252ac6b662d5c72c29903813eJake Slack                _parameters = _baseParameters;
41403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
41503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
41603928aee4356845252ac6b662d5c72c29903813eJake Slack
41703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
41803928aee4356845252ac6b662d5c72c29903813eJake Slack    public AsyncContext getAsyncContext()
41903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
42003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_async.isInitial() && !_async.isAsyncStarted())
42103928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException(_async.getStatusString());
42203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _async;
42303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
42403928aee4356845252ac6b662d5c72c29903813eJake Slack
42503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
42603928aee4356845252ac6b662d5c72c29903813eJake Slack    public AsyncContinuation getAsyncContinuation()
42703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
42803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _async;
42903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
43003928aee4356845252ac6b662d5c72c29903813eJake Slack
43103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
43203928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
43303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
43403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
43503928aee4356845252ac6b662d5c72c29903813eJake Slack    public Object getAttribute(String name)
43603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
43703928aee4356845252ac6b662d5c72c29903813eJake Slack        if ("org.eclipse.jetty.io.EndPoint.maxIdleTime".equalsIgnoreCase(name))
43803928aee4356845252ac6b662d5c72c29903813eJake Slack            return new Long(getConnection().getEndPoint().getMaxIdleTime());
43903928aee4356845252ac6b662d5c72c29903813eJake Slack
44003928aee4356845252ac6b662d5c72c29903813eJake Slack        Object attr = (_attributes == null)?null:_attributes.getAttribute(name);
44103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (attr == null && Continuation.ATTRIBUTE.equals(name))
44203928aee4356845252ac6b662d5c72c29903813eJake Slack            return _async;
44303928aee4356845252ac6b662d5c72c29903813eJake Slack        return attr;
44403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
44503928aee4356845252ac6b662d5c72c29903813eJake Slack
44603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
44703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
44803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getAttributeNames()
44903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
45003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Enumeration getAttributeNames()
45103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
45203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_attributes == null)
45303928aee4356845252ac6b662d5c72c29903813eJake Slack            return Collections.enumeration(Collections.EMPTY_LIST);
45403928aee4356845252ac6b662d5c72c29903813eJake Slack
45503928aee4356845252ac6b662d5c72c29903813eJake Slack        return AttributesMap.getAttributeNamesCopy(_attributes);
45603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
45703928aee4356845252ac6b662d5c72c29903813eJake Slack
45803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
45903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
46003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
46103928aee4356845252ac6b662d5c72c29903813eJake Slack    public Attributes getAttributes()
46203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
46303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_attributes == null)
46403928aee4356845252ac6b662d5c72c29903813eJake Slack            _attributes = new AttributesMap();
46503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _attributes;
46603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
46703928aee4356845252ac6b662d5c72c29903813eJake Slack
46803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
46903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
47003928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get the authentication.
47103928aee4356845252ac6b662d5c72c29903813eJake Slack     *
47203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return the authentication
47303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
47403928aee4356845252ac6b662d5c72c29903813eJake Slack    public Authentication getAuthentication()
47503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
47603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _authentication;
47703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
47803928aee4356845252ac6b662d5c72c29903813eJake Slack
47903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
48003928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
48103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getAuthType()
48203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
48303928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getAuthType()
48403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
48503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.Deferred)
48603928aee4356845252ac6b662d5c72c29903813eJake Slack            setAuthentication(((Authentication.Deferred)_authentication).authenticate(this));
48703928aee4356845252ac6b662d5c72c29903813eJake Slack
48803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.User)
48903928aee4356845252ac6b662d5c72c29903813eJake Slack            return ((Authentication.User)_authentication).getAuthMethod();
49003928aee4356845252ac6b662d5c72c29903813eJake Slack        return null;
49103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
49203928aee4356845252ac6b662d5c72c29903813eJake Slack
49303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
49403928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
49503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getCharacterEncoding()
49603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
49703928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getCharacterEncoding()
49803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
49903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _characterEncoding;
50003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
50103928aee4356845252ac6b662d5c72c29903813eJake Slack
50203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
50303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
50403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the connection.
50503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
50603928aee4356845252ac6b662d5c72c29903813eJake Slack    public AbstractHttpConnection getConnection()
50703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
50803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection;
50903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
51003928aee4356845252ac6b662d5c72c29903813eJake Slack
51103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
51203928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
51303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getContentLength()
51403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
51503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getContentLength()
51603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
51703928aee4356845252ac6b662d5c72c29903813eJake Slack        return (int)_connection.getRequestFields().getLongField(HttpHeaders.CONTENT_LENGTH_BUFFER);
51803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
51903928aee4356845252ac6b662d5c72c29903813eJake Slack
52003928aee4356845252ac6b662d5c72c29903813eJake Slack    public long getContentRead()
52103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
52203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_connection == null || _connection.getParser() == null)
52303928aee4356845252ac6b662d5c72c29903813eJake Slack            return -1;
52403928aee4356845252ac6b662d5c72c29903813eJake Slack
52503928aee4356845252ac6b662d5c72c29903813eJake Slack        return ((HttpParser)_connection.getParser()).getContentRead();
52603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
52703928aee4356845252ac6b662d5c72c29903813eJake Slack
52803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
52903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
53003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getContentType()
53103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
53203928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getContentType()
53303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
53403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection.getRequestFields().getStringField(HttpHeaders.CONTENT_TYPE_BUFFER);
53503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
53603928aee4356845252ac6b662d5c72c29903813eJake Slack
53703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
53803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
53903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return The current {@link Context context} used for this request, or <code>null</code> if {@link #setContext} has not yet been called.
54003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
54103928aee4356845252ac6b662d5c72c29903813eJake Slack    public Context getContext()
54203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
54303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _context;
54403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
54503928aee4356845252ac6b662d5c72c29903813eJake Slack
54603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
54703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
54803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getContextPath()
54903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
55003928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getContextPath()
55103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
55203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _contextPath;
55303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
55403928aee4356845252ac6b662d5c72c29903813eJake Slack
55503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
55603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
55703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getCookies()
55803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
55903928aee4356845252ac6b662d5c72c29903813eJake Slack    public Cookie[] getCookies()
56003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
56103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_cookiesExtracted)
56203928aee4356845252ac6b662d5c72c29903813eJake Slack            return _cookies == null?null:_cookies.getCookies();
56303928aee4356845252ac6b662d5c72c29903813eJake Slack
56403928aee4356845252ac6b662d5c72c29903813eJake Slack        _cookiesExtracted = true;
56503928aee4356845252ac6b662d5c72c29903813eJake Slack
56603928aee4356845252ac6b662d5c72c29903813eJake Slack        Enumeration enm = _connection.getRequestFields().getValues(HttpHeaders.COOKIE_BUFFER);
56703928aee4356845252ac6b662d5c72c29903813eJake Slack
56803928aee4356845252ac6b662d5c72c29903813eJake Slack        // Handle no cookies
56903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (enm != null)
57003928aee4356845252ac6b662d5c72c29903813eJake Slack        {
57103928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_cookies == null)
57203928aee4356845252ac6b662d5c72c29903813eJake Slack                _cookies = new CookieCutter();
57303928aee4356845252ac6b662d5c72c29903813eJake Slack
57403928aee4356845252ac6b662d5c72c29903813eJake Slack            while (enm.hasMoreElements())
57503928aee4356845252ac6b662d5c72c29903813eJake Slack            {
57603928aee4356845252ac6b662d5c72c29903813eJake Slack                String c = (String)enm.nextElement();
57703928aee4356845252ac6b662d5c72c29903813eJake Slack                _cookies.addCookieField(c);
57803928aee4356845252ac6b662d5c72c29903813eJake Slack            }
57903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
58003928aee4356845252ac6b662d5c72c29903813eJake Slack
58103928aee4356845252ac6b662d5c72c29903813eJake Slack        return _cookies == null?null:_cookies.getCookies();
58203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
58303928aee4356845252ac6b662d5c72c29903813eJake Slack
58403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
58503928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
58603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String)
58703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
58803928aee4356845252ac6b662d5c72c29903813eJake Slack    public long getDateHeader(String name)
58903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
59003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection.getRequestFields().getDateField(name);
59103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
59203928aee4356845252ac6b662d5c72c29903813eJake Slack
59303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
59403928aee4356845252ac6b662d5c72c29903813eJake Slack    public DispatcherType getDispatcherType()
59503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
59603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _dispatcherType;
59703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
59803928aee4356845252ac6b662d5c72c29903813eJake Slack
59903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
60003928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
60103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String)
60203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
60303928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getHeader(String name)
60403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
60503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection.getRequestFields().getStringField(name);
60603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
60703928aee4356845252ac6b662d5c72c29903813eJake Slack
60803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
60903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
61003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getHeaderNames()
61103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
61203928aee4356845252ac6b662d5c72c29903813eJake Slack    public Enumeration getHeaderNames()
61303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
61403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection.getRequestFields().getFieldNames();
61503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
61603928aee4356845252ac6b662d5c72c29903813eJake Slack
61703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
61803928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
61903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getHeaders(java.lang.String)
62003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
62103928aee4356845252ac6b662d5c72c29903813eJake Slack    public Enumeration getHeaders(String name)
62203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
62303928aee4356845252ac6b662d5c72c29903813eJake Slack        Enumeration e = _connection.getRequestFields().getValues(name);
62403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (e == null)
62503928aee4356845252ac6b662d5c72c29903813eJake Slack            return Collections.enumeration(Collections.EMPTY_LIST);
62603928aee4356845252ac6b662d5c72c29903813eJake Slack        return e;
62703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
62803928aee4356845252ac6b662d5c72c29903813eJake Slack
62903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
63003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
63103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the inputState.
63203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
63303928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getInputState()
63403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
63503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _inputState;
63603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
63703928aee4356845252ac6b662d5c72c29903813eJake Slack
63803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
63903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
64003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getInputStream()
64103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
64203928aee4356845252ac6b662d5c72c29903813eJake Slack    public ServletInputStream getInputStream() throws IOException
64303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
64403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_inputState != __NONE && _inputState != _STREAM)
64503928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException("READER");
64603928aee4356845252ac6b662d5c72c29903813eJake Slack        _inputState = _STREAM;
64703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection.getInputStream();
64803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
64903928aee4356845252ac6b662d5c72c29903813eJake Slack
65003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
65103928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
65203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String)
65303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
65403928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getIntHeader(String name)
65503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
65603928aee4356845252ac6b662d5c72c29903813eJake Slack        return (int)_connection.getRequestFields().getLongField(name);
65703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
65803928aee4356845252ac6b662d5c72c29903813eJake Slack
65903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
66003928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
66103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getLocalAddr()
66203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
66303928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getLocalAddr()
66403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
66503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _endp == null?null:_endp.getLocalAddr();
66603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
66703928aee4356845252ac6b662d5c72c29903813eJake Slack
66803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
66903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
67003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getLocale()
67103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
67203928aee4356845252ac6b662d5c72c29903813eJake Slack    public Locale getLocale()
67303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
67403928aee4356845252ac6b662d5c72c29903813eJake Slack        Enumeration enm = _connection.getRequestFields().getValues(HttpHeaders.ACCEPT_LANGUAGE,HttpFields.__separators);
67503928aee4356845252ac6b662d5c72c29903813eJake Slack
67603928aee4356845252ac6b662d5c72c29903813eJake Slack        // handle no locale
67703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (enm == null || !enm.hasMoreElements())
67803928aee4356845252ac6b662d5c72c29903813eJake Slack            return Locale.getDefault();
67903928aee4356845252ac6b662d5c72c29903813eJake Slack
68003928aee4356845252ac6b662d5c72c29903813eJake Slack        // sort the list in quality order
68103928aee4356845252ac6b662d5c72c29903813eJake Slack        List acceptLanguage = HttpFields.qualityList(enm);
68203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (acceptLanguage.size() == 0)
68303928aee4356845252ac6b662d5c72c29903813eJake Slack            return Locale.getDefault();
68403928aee4356845252ac6b662d5c72c29903813eJake Slack
68503928aee4356845252ac6b662d5c72c29903813eJake Slack        int size = acceptLanguage.size();
68603928aee4356845252ac6b662d5c72c29903813eJake Slack
68703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (size > 0)
68803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
68903928aee4356845252ac6b662d5c72c29903813eJake Slack            String language = (String)acceptLanguage.get(0);
69003928aee4356845252ac6b662d5c72c29903813eJake Slack            language = HttpFields.valueParameters(language,null);
69103928aee4356845252ac6b662d5c72c29903813eJake Slack            String country = "";
69203928aee4356845252ac6b662d5c72c29903813eJake Slack            int dash = language.indexOf('-');
69303928aee4356845252ac6b662d5c72c29903813eJake Slack            if (dash > -1)
69403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
69503928aee4356845252ac6b662d5c72c29903813eJake Slack                country = language.substring(dash + 1).trim();
69603928aee4356845252ac6b662d5c72c29903813eJake Slack                language = language.substring(0,dash).trim();
69703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
69803928aee4356845252ac6b662d5c72c29903813eJake Slack            return new Locale(language,country);
69903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
70003928aee4356845252ac6b662d5c72c29903813eJake Slack
70103928aee4356845252ac6b662d5c72c29903813eJake Slack        return Locale.getDefault();
70203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
70303928aee4356845252ac6b662d5c72c29903813eJake Slack
70403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
70503928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
70603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getLocales()
70703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
70803928aee4356845252ac6b662d5c72c29903813eJake Slack    public Enumeration getLocales()
70903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
71003928aee4356845252ac6b662d5c72c29903813eJake Slack
71103928aee4356845252ac6b662d5c72c29903813eJake Slack        Enumeration enm = _connection.getRequestFields().getValues(HttpHeaders.ACCEPT_LANGUAGE,HttpFields.__separators);
71203928aee4356845252ac6b662d5c72c29903813eJake Slack
71303928aee4356845252ac6b662d5c72c29903813eJake Slack        // handle no locale
71403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (enm == null || !enm.hasMoreElements())
71503928aee4356845252ac6b662d5c72c29903813eJake Slack            return Collections.enumeration(__defaultLocale);
71603928aee4356845252ac6b662d5c72c29903813eJake Slack
71703928aee4356845252ac6b662d5c72c29903813eJake Slack        // sort the list in quality order
71803928aee4356845252ac6b662d5c72c29903813eJake Slack        List acceptLanguage = HttpFields.qualityList(enm);
71903928aee4356845252ac6b662d5c72c29903813eJake Slack
72003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (acceptLanguage.size() == 0)
72103928aee4356845252ac6b662d5c72c29903813eJake Slack            return Collections.enumeration(__defaultLocale);
72203928aee4356845252ac6b662d5c72c29903813eJake Slack
72303928aee4356845252ac6b662d5c72c29903813eJake Slack        Object langs = null;
72403928aee4356845252ac6b662d5c72c29903813eJake Slack        int size = acceptLanguage.size();
72503928aee4356845252ac6b662d5c72c29903813eJake Slack
72603928aee4356845252ac6b662d5c72c29903813eJake Slack        // convert to locals
72703928aee4356845252ac6b662d5c72c29903813eJake Slack        for (int i = 0; i < size; i++)
72803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
72903928aee4356845252ac6b662d5c72c29903813eJake Slack            String language = (String)acceptLanguage.get(i);
73003928aee4356845252ac6b662d5c72c29903813eJake Slack            language = HttpFields.valueParameters(language,null);
73103928aee4356845252ac6b662d5c72c29903813eJake Slack            String country = "";
73203928aee4356845252ac6b662d5c72c29903813eJake Slack            int dash = language.indexOf('-');
73303928aee4356845252ac6b662d5c72c29903813eJake Slack            if (dash > -1)
73403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
73503928aee4356845252ac6b662d5c72c29903813eJake Slack                country = language.substring(dash + 1).trim();
73603928aee4356845252ac6b662d5c72c29903813eJake Slack                language = language.substring(0,dash).trim();
73703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
73803928aee4356845252ac6b662d5c72c29903813eJake Slack            langs = LazyList.ensureSize(langs,size);
73903928aee4356845252ac6b662d5c72c29903813eJake Slack            langs = LazyList.add(langs,new Locale(language,country));
74003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
74103928aee4356845252ac6b662d5c72c29903813eJake Slack
74203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (LazyList.size(langs) == 0)
74303928aee4356845252ac6b662d5c72c29903813eJake Slack            return Collections.enumeration(__defaultLocale);
74403928aee4356845252ac6b662d5c72c29903813eJake Slack
74503928aee4356845252ac6b662d5c72c29903813eJake Slack        return Collections.enumeration(LazyList.getList(langs));
74603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
74703928aee4356845252ac6b662d5c72c29903813eJake Slack
74803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
74903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
75003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getLocalName()
75103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
75203928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getLocalName()
75303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
75403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_endp == null)
75503928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
75603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_dns)
75703928aee4356845252ac6b662d5c72c29903813eJake Slack            return _endp.getLocalHost();
75803928aee4356845252ac6b662d5c72c29903813eJake Slack
75903928aee4356845252ac6b662d5c72c29903813eJake Slack        String local = _endp.getLocalAddr();
76003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (local != null && local.indexOf(':') >= 0)
76103928aee4356845252ac6b662d5c72c29903813eJake Slack            local = "[" + local + "]";
76203928aee4356845252ac6b662d5c72c29903813eJake Slack        return local;
76303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
76403928aee4356845252ac6b662d5c72c29903813eJake Slack
76503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
76603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
76703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getLocalPort()
76803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
76903928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getLocalPort()
77003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
77103928aee4356845252ac6b662d5c72c29903813eJake Slack        return _endp == null?0:_endp.getLocalPort();
77203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
77303928aee4356845252ac6b662d5c72c29903813eJake Slack
77403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
77503928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
77603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getMethod()
77703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
77803928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getMethod()
77903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
78003928aee4356845252ac6b662d5c72c29903813eJake Slack        return _method;
78103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
78203928aee4356845252ac6b662d5c72c29903813eJake Slack
78303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
78403928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
78503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
78603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
78703928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getParameter(String name)
78803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
78903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!_paramsExtracted)
79003928aee4356845252ac6b662d5c72c29903813eJake Slack            extractParameters();
79103928aee4356845252ac6b662d5c72c29903813eJake Slack        return (String)_parameters.getValue(name,0);
79203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
79303928aee4356845252ac6b662d5c72c29903813eJake Slack
79403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
79503928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
79603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getParameterMap()
79703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
79803928aee4356845252ac6b662d5c72c29903813eJake Slack    public Map getParameterMap()
79903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
80003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!_paramsExtracted)
80103928aee4356845252ac6b662d5c72c29903813eJake Slack            extractParameters();
80203928aee4356845252ac6b662d5c72c29903813eJake Slack
80303928aee4356845252ac6b662d5c72c29903813eJake Slack        return Collections.unmodifiableMap(_parameters.toStringArrayMap());
80403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
80503928aee4356845252ac6b662d5c72c29903813eJake Slack
80603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
80703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
80803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getParameterNames()
80903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
81003928aee4356845252ac6b662d5c72c29903813eJake Slack    public Enumeration getParameterNames()
81103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
81203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!_paramsExtracted)
81303928aee4356845252ac6b662d5c72c29903813eJake Slack            extractParameters();
81403928aee4356845252ac6b662d5c72c29903813eJake Slack        return Collections.enumeration(_parameters.keySet());
81503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
81603928aee4356845252ac6b662d5c72c29903813eJake Slack
81703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
81803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
81903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the parameters.
82003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
82103928aee4356845252ac6b662d5c72c29903813eJake Slack    public MultiMap<String> getParameters()
82203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
82303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _parameters;
82403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
82503928aee4356845252ac6b662d5c72c29903813eJake Slack
82603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
82703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
82803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
82903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
83003928aee4356845252ac6b662d5c72c29903813eJake Slack    public String[] getParameterValues(String name)
83103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
83203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!_paramsExtracted)
83303928aee4356845252ac6b662d5c72c29903813eJake Slack            extractParameters();
83403928aee4356845252ac6b662d5c72c29903813eJake Slack        List<Object> vals = _parameters.getValues(name);
83503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (vals == null)
83603928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
83703928aee4356845252ac6b662d5c72c29903813eJake Slack        return vals.toArray(new String[vals.size()]);
83803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
83903928aee4356845252ac6b662d5c72c29903813eJake Slack
84003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
84103928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
84203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getPathInfo()
84303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
84403928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getPathInfo()
84503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
84603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _pathInfo;
84703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
84803928aee4356845252ac6b662d5c72c29903813eJake Slack
84903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
85003928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
85103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getPathTranslated()
85203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
85303928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getPathTranslated()
85403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
85503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_pathInfo == null || _context == null)
85603928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
85703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _context.getRealPath(_pathInfo);
85803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
85903928aee4356845252ac6b662d5c72c29903813eJake Slack
86003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
86103928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
86203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getProtocol()
86303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
86403928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getProtocol()
86503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
86603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _protocol;
86703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
86803928aee4356845252ac6b662d5c72c29903813eJake Slack
86903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
87003928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getQueryEncoding()
87103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
87203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _queryEncoding;
87303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
87403928aee4356845252ac6b662d5c72c29903813eJake Slack
87503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
87603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
87703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getQueryString()
87803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
87903928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getQueryString()
88003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
88103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_queryString == null && _uri != null)
88203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
88303928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_queryEncoding == null)
88403928aee4356845252ac6b662d5c72c29903813eJake Slack                _queryString = _uri.getQuery();
88503928aee4356845252ac6b662d5c72c29903813eJake Slack            else
88603928aee4356845252ac6b662d5c72c29903813eJake Slack                _queryString = _uri.getQuery(_queryEncoding);
88703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
88803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _queryString;
88903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
89003928aee4356845252ac6b662d5c72c29903813eJake Slack
89103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
89203928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
89303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getReader()
89403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
89503928aee4356845252ac6b662d5c72c29903813eJake Slack    public BufferedReader getReader() throws IOException
89603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
89703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_inputState != __NONE && _inputState != __READER)
89803928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException("STREAMED");
89903928aee4356845252ac6b662d5c72c29903813eJake Slack
90003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_inputState == __READER)
90103928aee4356845252ac6b662d5c72c29903813eJake Slack            return _reader;
90203928aee4356845252ac6b662d5c72c29903813eJake Slack
90303928aee4356845252ac6b662d5c72c29903813eJake Slack        String encoding = getCharacterEncoding();
90403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (encoding == null)
90503928aee4356845252ac6b662d5c72c29903813eJake Slack            encoding = StringUtil.__ISO_8859_1;
90603928aee4356845252ac6b662d5c72c29903813eJake Slack
90703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_reader == null || !encoding.equalsIgnoreCase(_readerEncoding))
90803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
90903928aee4356845252ac6b662d5c72c29903813eJake Slack            final ServletInputStream in = getInputStream();
91003928aee4356845252ac6b662d5c72c29903813eJake Slack            _readerEncoding = encoding;
91103928aee4356845252ac6b662d5c72c29903813eJake Slack            _reader = new BufferedReader(new InputStreamReader(in,encoding))
91203928aee4356845252ac6b662d5c72c29903813eJake Slack            {
91303928aee4356845252ac6b662d5c72c29903813eJake Slack                @Override
91403928aee4356845252ac6b662d5c72c29903813eJake Slack                public void close() throws IOException
91503928aee4356845252ac6b662d5c72c29903813eJake Slack                {
91603928aee4356845252ac6b662d5c72c29903813eJake Slack                    in.close();
91703928aee4356845252ac6b662d5c72c29903813eJake Slack                }
91803928aee4356845252ac6b662d5c72c29903813eJake Slack            };
91903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
92003928aee4356845252ac6b662d5c72c29903813eJake Slack        _inputState = __READER;
92103928aee4356845252ac6b662d5c72c29903813eJake Slack        return _reader;
92203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
92303928aee4356845252ac6b662d5c72c29903813eJake Slack
92403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
92503928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
92603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
92703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
92803928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getRealPath(String path)
92903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
93003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_context == null)
93103928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
93203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _context.getRealPath(path);
93303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
93403928aee4356845252ac6b662d5c72c29903813eJake Slack
93503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
93603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
93703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getRemoteAddr()
93803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
93903928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getRemoteAddr()
94003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
94103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_remoteAddr != null)
94203928aee4356845252ac6b662d5c72c29903813eJake Slack            return _remoteAddr;
94303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _endp == null?null:_endp.getRemoteAddr();
94403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
94503928aee4356845252ac6b662d5c72c29903813eJake Slack
94603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
94703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
94803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getRemoteHost()
94903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
95003928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getRemoteHost()
95103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
95203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_dns)
95303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
95403928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_remoteHost != null)
95503928aee4356845252ac6b662d5c72c29903813eJake Slack            {
95603928aee4356845252ac6b662d5c72c29903813eJake Slack                return _remoteHost;
95703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
95803928aee4356845252ac6b662d5c72c29903813eJake Slack            return _endp == null?null:_endp.getRemoteHost();
95903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
96003928aee4356845252ac6b662d5c72c29903813eJake Slack        return getRemoteAddr();
96103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
96203928aee4356845252ac6b662d5c72c29903813eJake Slack
96303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
96403928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
96503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getRemotePort()
96603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
96703928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getRemotePort()
96803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
96903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _endp == null?0:_endp.getRemotePort();
97003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
97103928aee4356845252ac6b662d5c72c29903813eJake Slack
97203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
97303928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
97403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
97503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
97603928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getRemoteUser()
97703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
97803928aee4356845252ac6b662d5c72c29903813eJake Slack        Principal p = getUserPrincipal();
97903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (p == null)
98003928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
98103928aee4356845252ac6b662d5c72c29903813eJake Slack        return p.getName();
98203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
98303928aee4356845252ac6b662d5c72c29903813eJake Slack
98403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
98503928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
98603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
98703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
98803928aee4356845252ac6b662d5c72c29903813eJake Slack    public RequestDispatcher getRequestDispatcher(String path)
98903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
99003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (path == null || _context == null)
99103928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
99203928aee4356845252ac6b662d5c72c29903813eJake Slack
99303928aee4356845252ac6b662d5c72c29903813eJake Slack        // handle relative path
99403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!path.startsWith("/"))
99503928aee4356845252ac6b662d5c72c29903813eJake Slack        {
99603928aee4356845252ac6b662d5c72c29903813eJake Slack            String relTo = URIUtil.addPaths(_servletPath,_pathInfo);
99703928aee4356845252ac6b662d5c72c29903813eJake Slack            int slash = relTo.lastIndexOf("/");
99803928aee4356845252ac6b662d5c72c29903813eJake Slack            if (slash > 1)
99903928aee4356845252ac6b662d5c72c29903813eJake Slack                relTo = relTo.substring(0,slash + 1);
100003928aee4356845252ac6b662d5c72c29903813eJake Slack            else
100103928aee4356845252ac6b662d5c72c29903813eJake Slack                relTo = "/";
100203928aee4356845252ac6b662d5c72c29903813eJake Slack            path = URIUtil.addPaths(relTo,path);
100303928aee4356845252ac6b662d5c72c29903813eJake Slack        }
100403928aee4356845252ac6b662d5c72c29903813eJake Slack
100503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _context.getRequestDispatcher(path);
100603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
100703928aee4356845252ac6b662d5c72c29903813eJake Slack
100803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
100903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
101003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId()
101103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
101203928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getRequestedSessionId()
101303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
101403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _requestedSessionId;
101503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
101603928aee4356845252ac6b662d5c72c29903813eJake Slack
101703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
101803928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
101903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getRequestURI()
102003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
102103928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getRequestURI()
102203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
102303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_requestURI == null && _uri != null)
102403928aee4356845252ac6b662d5c72c29903813eJake Slack            _requestURI = _uri.getPathAndParam();
102503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _requestURI;
102603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
102703928aee4356845252ac6b662d5c72c29903813eJake Slack
102803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
102903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
103003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getRequestURL()
103103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
103203928aee4356845252ac6b662d5c72c29903813eJake Slack    public StringBuffer getRequestURL()
103303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
103403928aee4356845252ac6b662d5c72c29903813eJake Slack        final StringBuffer url = new StringBuffer(48);
103503928aee4356845252ac6b662d5c72c29903813eJake Slack        synchronized (url)
103603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
103703928aee4356845252ac6b662d5c72c29903813eJake Slack            String scheme = getScheme();
103803928aee4356845252ac6b662d5c72c29903813eJake Slack            int port = getServerPort();
103903928aee4356845252ac6b662d5c72c29903813eJake Slack
104003928aee4356845252ac6b662d5c72c29903813eJake Slack            url.append(scheme);
104103928aee4356845252ac6b662d5c72c29903813eJake Slack            url.append("://");
104203928aee4356845252ac6b662d5c72c29903813eJake Slack            url.append(getServerName());
104303928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_port > 0 && ((scheme.equalsIgnoreCase(URIUtil.HTTP) && port != 80) || (scheme.equalsIgnoreCase(URIUtil.HTTPS) && port != 443)))
104403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
104503928aee4356845252ac6b662d5c72c29903813eJake Slack                url.append(':');
104603928aee4356845252ac6b662d5c72c29903813eJake Slack                url.append(_port);
104703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
104803928aee4356845252ac6b662d5c72c29903813eJake Slack
104903928aee4356845252ac6b662d5c72c29903813eJake Slack            url.append(getRequestURI());
105003928aee4356845252ac6b662d5c72c29903813eJake Slack            return url;
105103928aee4356845252ac6b662d5c72c29903813eJake Slack        }
105203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
105303928aee4356845252ac6b662d5c72c29903813eJake Slack
105403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
105503928aee4356845252ac6b662d5c72c29903813eJake Slack    public Response getResponse()
105603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
105703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection._response;
105803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
105903928aee4356845252ac6b662d5c72c29903813eJake Slack
106003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
106103928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
106203928aee4356845252ac6b662d5c72c29903813eJake Slack     * 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
106303928aee4356845252ac6b662d5c72c29903813eJake Slack     * path.
106403928aee4356845252ac6b662d5c72c29903813eJake Slack     * <p>
106503928aee4356845252ac6b662d5c72c29903813eJake Slack     * 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.
106603928aee4356845252ac6b662d5c72c29903813eJake Slack     *
106703928aee4356845252ac6b662d5c72c29903813eJake Slack     * This method is useful for creating redirect messages and for reporting errors.
106803928aee4356845252ac6b662d5c72c29903813eJake Slack     *
106903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return "scheme://host:port"
107003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
107103928aee4356845252ac6b662d5c72c29903813eJake Slack    public StringBuilder getRootURL()
107203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
107303928aee4356845252ac6b662d5c72c29903813eJake Slack        StringBuilder url = new StringBuilder(48);
107403928aee4356845252ac6b662d5c72c29903813eJake Slack        String scheme = getScheme();
107503928aee4356845252ac6b662d5c72c29903813eJake Slack        int port = getServerPort();
107603928aee4356845252ac6b662d5c72c29903813eJake Slack
107703928aee4356845252ac6b662d5c72c29903813eJake Slack        url.append(scheme);
107803928aee4356845252ac6b662d5c72c29903813eJake Slack        url.append("://");
107903928aee4356845252ac6b662d5c72c29903813eJake Slack        url.append(getServerName());
108003928aee4356845252ac6b662d5c72c29903813eJake Slack
108103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (port > 0 && ((scheme.equalsIgnoreCase("http") && port != 80) || (scheme.equalsIgnoreCase("https") && port != 443)))
108203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
108303928aee4356845252ac6b662d5c72c29903813eJake Slack            url.append(':');
108403928aee4356845252ac6b662d5c72c29903813eJake Slack            url.append(port);
108503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
108603928aee4356845252ac6b662d5c72c29903813eJake Slack        return url;
108703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
108803928aee4356845252ac6b662d5c72c29903813eJake Slack
108903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
109003928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
109103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getScheme()
109203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
109303928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getScheme()
109403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
109503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _scheme;
109603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
109703928aee4356845252ac6b662d5c72c29903813eJake Slack
109803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
109903928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
110003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getServerName()
110103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
110203928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getServerName()
110303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
110403928aee4356845252ac6b662d5c72c29903813eJake Slack        // Return already determined host
110503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_serverName != null)
110603928aee4356845252ac6b662d5c72c29903813eJake Slack            return _serverName;
110703928aee4356845252ac6b662d5c72c29903813eJake Slack
110803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_uri == null)
110903928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException("No uri");
111003928aee4356845252ac6b662d5c72c29903813eJake Slack
111103928aee4356845252ac6b662d5c72c29903813eJake Slack        // Return host from absolute URI
111203928aee4356845252ac6b662d5c72c29903813eJake Slack        _serverName = _uri.getHost();
111303928aee4356845252ac6b662d5c72c29903813eJake Slack        _port = _uri.getPort();
111403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_serverName != null)
111503928aee4356845252ac6b662d5c72c29903813eJake Slack            return _serverName;
111603928aee4356845252ac6b662d5c72c29903813eJake Slack
111703928aee4356845252ac6b662d5c72c29903813eJake Slack        // Return host from header field
111803928aee4356845252ac6b662d5c72c29903813eJake Slack        Buffer hostPort = _connection.getRequestFields().get(HttpHeaders.HOST_BUFFER);
111903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (hostPort != null)
112003928aee4356845252ac6b662d5c72c29903813eJake Slack        {
112103928aee4356845252ac6b662d5c72c29903813eJake Slack            loop: for (int i = hostPort.putIndex(); i-- > hostPort.getIndex();)
112203928aee4356845252ac6b662d5c72c29903813eJake Slack            {
112303928aee4356845252ac6b662d5c72c29903813eJake Slack                char ch = (char)(0xff & hostPort.peek(i));
112403928aee4356845252ac6b662d5c72c29903813eJake Slack                switch (ch)
112503928aee4356845252ac6b662d5c72c29903813eJake Slack                {
112603928aee4356845252ac6b662d5c72c29903813eJake Slack                    case ']':
112703928aee4356845252ac6b662d5c72c29903813eJake Slack                        break loop;
112803928aee4356845252ac6b662d5c72c29903813eJake Slack
112903928aee4356845252ac6b662d5c72c29903813eJake Slack                    case ':':
113003928aee4356845252ac6b662d5c72c29903813eJake Slack                        _serverName = BufferUtil.to8859_1_String(hostPort.peek(hostPort.getIndex(),i - hostPort.getIndex()));
113103928aee4356845252ac6b662d5c72c29903813eJake Slack                        try
113203928aee4356845252ac6b662d5c72c29903813eJake Slack                        {
113303928aee4356845252ac6b662d5c72c29903813eJake Slack                            _port = BufferUtil.toInt(hostPort.peek(i + 1,hostPort.putIndex() - i - 1));
113403928aee4356845252ac6b662d5c72c29903813eJake Slack                        }
113503928aee4356845252ac6b662d5c72c29903813eJake Slack                        catch (NumberFormatException e)
113603928aee4356845252ac6b662d5c72c29903813eJake Slack                        {
113703928aee4356845252ac6b662d5c72c29903813eJake Slack                            try
113803928aee4356845252ac6b662d5c72c29903813eJake Slack                            {
113903928aee4356845252ac6b662d5c72c29903813eJake Slack                                if (_connection != null)
114003928aee4356845252ac6b662d5c72c29903813eJake Slack                                    _connection._generator.sendError(HttpStatus.BAD_REQUEST_400,"Bad Host header",null,true);
114103928aee4356845252ac6b662d5c72c29903813eJake Slack                            }
114203928aee4356845252ac6b662d5c72c29903813eJake Slack                            catch (IOException e1)
114303928aee4356845252ac6b662d5c72c29903813eJake Slack                            {
114403928aee4356845252ac6b662d5c72c29903813eJake Slack                                throw new RuntimeException(e1);
114503928aee4356845252ac6b662d5c72c29903813eJake Slack                            }
114603928aee4356845252ac6b662d5c72c29903813eJake Slack                        }
114703928aee4356845252ac6b662d5c72c29903813eJake Slack                        return _serverName;
114803928aee4356845252ac6b662d5c72c29903813eJake Slack                }
114903928aee4356845252ac6b662d5c72c29903813eJake Slack            }
115003928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_serverName == null || _port < 0)
115103928aee4356845252ac6b662d5c72c29903813eJake Slack            {
115203928aee4356845252ac6b662d5c72c29903813eJake Slack                _serverName = BufferUtil.to8859_1_String(hostPort);
115303928aee4356845252ac6b662d5c72c29903813eJake Slack                _port = 0;
115403928aee4356845252ac6b662d5c72c29903813eJake Slack            }
115503928aee4356845252ac6b662d5c72c29903813eJake Slack
115603928aee4356845252ac6b662d5c72c29903813eJake Slack            return _serverName;
115703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
115803928aee4356845252ac6b662d5c72c29903813eJake Slack
115903928aee4356845252ac6b662d5c72c29903813eJake Slack        // Return host from connection
116003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_connection != null)
116103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
116203928aee4356845252ac6b662d5c72c29903813eJake Slack            _serverName = getLocalName();
116303928aee4356845252ac6b662d5c72c29903813eJake Slack            _port = getLocalPort();
116403928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_serverName != null && !StringUtil.ALL_INTERFACES.equals(_serverName))
116503928aee4356845252ac6b662d5c72c29903813eJake Slack                return _serverName;
116603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
116703928aee4356845252ac6b662d5c72c29903813eJake Slack
116803928aee4356845252ac6b662d5c72c29903813eJake Slack        // Return the local host
116903928aee4356845252ac6b662d5c72c29903813eJake Slack        try
117003928aee4356845252ac6b662d5c72c29903813eJake Slack        {
117103928aee4356845252ac6b662d5c72c29903813eJake Slack            _serverName = InetAddress.getLocalHost().getHostAddress();
117203928aee4356845252ac6b662d5c72c29903813eJake Slack        }
117303928aee4356845252ac6b662d5c72c29903813eJake Slack        catch (java.net.UnknownHostException e)
117403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
117503928aee4356845252ac6b662d5c72c29903813eJake Slack            LOG.ignore(e);
117603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
117703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _serverName;
117803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
117903928aee4356845252ac6b662d5c72c29903813eJake Slack
118003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
118103928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
118203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getServerPort()
118303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
118403928aee4356845252ac6b662d5c72c29903813eJake Slack    public int getServerPort()
118503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
118603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_port <= 0)
118703928aee4356845252ac6b662d5c72c29903813eJake Slack        {
118803928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_serverName == null)
118903928aee4356845252ac6b662d5c72c29903813eJake Slack                getServerName();
119003928aee4356845252ac6b662d5c72c29903813eJake Slack
119103928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_port <= 0)
119203928aee4356845252ac6b662d5c72c29903813eJake Slack            {
119303928aee4356845252ac6b662d5c72c29903813eJake Slack                if (_serverName != null && _uri != null)
119403928aee4356845252ac6b662d5c72c29903813eJake Slack                    _port = _uri.getPort();
119503928aee4356845252ac6b662d5c72c29903813eJake Slack                else
119603928aee4356845252ac6b662d5c72c29903813eJake Slack                    _port = _endp == null?0:_endp.getLocalPort();
119703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
119803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
119903928aee4356845252ac6b662d5c72c29903813eJake Slack
120003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_port <= 0)
120103928aee4356845252ac6b662d5c72c29903813eJake Slack        {
120203928aee4356845252ac6b662d5c72c29903813eJake Slack            if (getScheme().equalsIgnoreCase(URIUtil.HTTPS))
120303928aee4356845252ac6b662d5c72c29903813eJake Slack                return 443;
120403928aee4356845252ac6b662d5c72c29903813eJake Slack            return 80;
120503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
120603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _port;
120703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
120803928aee4356845252ac6b662d5c72c29903813eJake Slack
120903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
121003928aee4356845252ac6b662d5c72c29903813eJake Slack    public ServletContext getServletContext()
121103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
121203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _context;
121303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
121403928aee4356845252ac6b662d5c72c29903813eJake Slack
121503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
121603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
121703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
121803928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getServletName()
121903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
122003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_scope != null)
122103928aee4356845252ac6b662d5c72c29903813eJake Slack            return _scope.getName();
122203928aee4356845252ac6b662d5c72c29903813eJake Slack        return null;
122303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
122403928aee4356845252ac6b662d5c72c29903813eJake Slack
122503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
122603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
122703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getServletPath()
122803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
122903928aee4356845252ac6b662d5c72c29903813eJake Slack    public String getServletPath()
123003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
123103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_servletPath == null)
123203928aee4356845252ac6b662d5c72c29903813eJake Slack            _servletPath = "";
123303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _servletPath;
123403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
123503928aee4356845252ac6b662d5c72c29903813eJake Slack
123603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
123703928aee4356845252ac6b662d5c72c29903813eJake Slack    public ServletResponse getServletResponse()
123803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
123903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection.getResponse();
124003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
124103928aee4356845252ac6b662d5c72c29903813eJake Slack
124203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
124303928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
124403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getSession()
124503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
124603928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpSession getSession()
124703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
124803928aee4356845252ac6b662d5c72c29903813eJake Slack        return getSession(true);
124903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
125003928aee4356845252ac6b662d5c72c29903813eJake Slack
125103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
125203928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
125303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
125403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
125503928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpSession getSession(boolean create)
125603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
125703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_session != null)
125803928aee4356845252ac6b662d5c72c29903813eJake Slack        {
125903928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_sessionManager != null && !_sessionManager.isValid(_session))
126003928aee4356845252ac6b662d5c72c29903813eJake Slack                _session = null;
126103928aee4356845252ac6b662d5c72c29903813eJake Slack            else
126203928aee4356845252ac6b662d5c72c29903813eJake Slack                return _session;
126303928aee4356845252ac6b662d5c72c29903813eJake Slack        }
126403928aee4356845252ac6b662d5c72c29903813eJake Slack
126503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!create)
126603928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
126703928aee4356845252ac6b662d5c72c29903813eJake Slack
126803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_sessionManager == null)
126903928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException("No SessionManager");
127003928aee4356845252ac6b662d5c72c29903813eJake Slack
127103928aee4356845252ac6b662d5c72c29903813eJake Slack        _session = _sessionManager.newHttpSession(this);
127203928aee4356845252ac6b662d5c72c29903813eJake Slack        HttpCookie cookie = _sessionManager.getSessionCookie(_session,getContextPath(),isSecure());
127303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (cookie != null)
127403928aee4356845252ac6b662d5c72c29903813eJake Slack            _connection.getResponse().addCookie(cookie);
127503928aee4356845252ac6b662d5c72c29903813eJake Slack
127603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _session;
127703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
127803928aee4356845252ac6b662d5c72c29903813eJake Slack
127903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
128003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
128103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the sessionManager.
128203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
128303928aee4356845252ac6b662d5c72c29903813eJake Slack    public SessionManager getSessionManager()
128403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
128503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _sessionManager;
128603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
128703928aee4356845252ac6b662d5c72c29903813eJake Slack
128803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
128903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
129003928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get Request TimeStamp
129103928aee4356845252ac6b662d5c72c29903813eJake Slack     *
129203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return The time that the request was received.
129303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
129403928aee4356845252ac6b662d5c72c29903813eJake Slack    public long getTimeStamp()
129503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
129603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _timeStamp;
129703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
129803928aee4356845252ac6b662d5c72c29903813eJake Slack
129903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
130003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
130103928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get Request TimeStamp
130203928aee4356845252ac6b662d5c72c29903813eJake Slack     *
130303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return The time that the request was received.
130403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
130503928aee4356845252ac6b662d5c72c29903813eJake Slack    public Buffer getTimeStampBuffer()
130603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
130703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_timeStampBuffer == null && _timeStamp > 0)
130803928aee4356845252ac6b662d5c72c29903813eJake Slack            _timeStampBuffer = HttpFields.__dateCache.formatBuffer(_timeStamp);
130903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _timeStampBuffer;
131003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
131103928aee4356845252ac6b662d5c72c29903813eJake Slack
131203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
131303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
131403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return Returns the uri.
131503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
131603928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpURI getUri()
131703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
131803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _uri;
131903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
132003928aee4356845252ac6b662d5c72c29903813eJake Slack
132103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
132203928aee4356845252ac6b662d5c72c29903813eJake Slack    public UserIdentity getUserIdentity()
132303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
132403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.Deferred)
132503928aee4356845252ac6b662d5c72c29903813eJake Slack            setAuthentication(((Authentication.Deferred)_authentication).authenticate(this));
132603928aee4356845252ac6b662d5c72c29903813eJake Slack
132703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.User)
132803928aee4356845252ac6b662d5c72c29903813eJake Slack            return ((Authentication.User)_authentication).getUserIdentity();
132903928aee4356845252ac6b662d5c72c29903813eJake Slack        return null;
133003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
133103928aee4356845252ac6b662d5c72c29903813eJake Slack
133203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
133303928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
133403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return The resolved user Identity, which may be null if the {@link Authentication} is not {@link Authentication.User} (eg.
133503928aee4356845252ac6b662d5c72c29903813eJake Slack     *         {@link Authentication.Deferred}).
133603928aee4356845252ac6b662d5c72c29903813eJake Slack     */
133703928aee4356845252ac6b662d5c72c29903813eJake Slack    public UserIdentity getResolvedUserIdentity()
133803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
133903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.User)
134003928aee4356845252ac6b662d5c72c29903813eJake Slack            return ((Authentication.User)_authentication).getUserIdentity();
134103928aee4356845252ac6b662d5c72c29903813eJake Slack        return null;
134203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
134303928aee4356845252ac6b662d5c72c29903813eJake Slack
134403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
134503928aee4356845252ac6b662d5c72c29903813eJake Slack    public UserIdentity.Scope getUserIdentityScope()
134603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
134703928aee4356845252ac6b662d5c72c29903813eJake Slack        return _scope;
134803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
134903928aee4356845252ac6b662d5c72c29903813eJake Slack
135003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
135103928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
135203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
135303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
135403928aee4356845252ac6b662d5c72c29903813eJake Slack    public Principal getUserPrincipal()
135503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
135603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.Deferred)
135703928aee4356845252ac6b662d5c72c29903813eJake Slack            setAuthentication(((Authentication.Deferred)_authentication).authenticate(this));
135803928aee4356845252ac6b662d5c72c29903813eJake Slack
135903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.User)
136003928aee4356845252ac6b662d5c72c29903813eJake Slack        {
136103928aee4356845252ac6b662d5c72c29903813eJake Slack            UserIdentity user = ((Authentication.User)_authentication).getUserIdentity();
136203928aee4356845252ac6b662d5c72c29903813eJake Slack            return user.getUserPrincipal();
136303928aee4356845252ac6b662d5c72c29903813eJake Slack        }
136403928aee4356845252ac6b662d5c72c29903813eJake Slack
136503928aee4356845252ac6b662d5c72c29903813eJake Slack        return null;
136603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
136703928aee4356845252ac6b662d5c72c29903813eJake Slack
136803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
136903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
137003928aee4356845252ac6b662d5c72c29903813eJake Slack     * Get timestamp of the request dispatch
137103928aee4356845252ac6b662d5c72c29903813eJake Slack     *
137203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return timestamp
137303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
137403928aee4356845252ac6b662d5c72c29903813eJake Slack    public long getDispatchTime()
137503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
137603928aee4356845252ac6b662d5c72c29903813eJake Slack        return _dispatchTime;
137703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
137803928aee4356845252ac6b662d5c72c29903813eJake Slack
137903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
138003928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isHandled()
138103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
138203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _handled;
138303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
138403928aee4356845252ac6b662d5c72c29903813eJake Slack
138503928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isAsyncStarted()
138603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
138703928aee4356845252ac6b662d5c72c29903813eJake Slack       return _async.isAsyncStarted();
138803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
138903928aee4356845252ac6b662d5c72c29903813eJake Slack
139003928aee4356845252ac6b662d5c72c29903813eJake Slack
139103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
139203928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isAsyncSupported()
139303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
139403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _asyncSupported;
139503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
139603928aee4356845252ac6b662d5c72c29903813eJake Slack
139703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
139803928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
139903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromCookie()
140003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
140103928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isRequestedSessionIdFromCookie()
140203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
140303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _requestedSessionId != null && _requestedSessionIdFromCookie;
140403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
140503928aee4356845252ac6b662d5c72c29903813eJake Slack
140603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
140703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
140803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromUrl()
140903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
141003928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isRequestedSessionIdFromUrl()
141103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
141203928aee4356845252ac6b662d5c72c29903813eJake Slack        return _requestedSessionId != null && !_requestedSessionIdFromCookie;
141303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
141403928aee4356845252ac6b662d5c72c29903813eJake Slack
141503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
141603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
141703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromURL()
141803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
141903928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isRequestedSessionIdFromURL()
142003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
142103928aee4356845252ac6b662d5c72c29903813eJake Slack        return _requestedSessionId != null && !_requestedSessionIdFromCookie;
142203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
142303928aee4356845252ac6b662d5c72c29903813eJake Slack
142403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
142503928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
142603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid()
142703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
142803928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isRequestedSessionIdValid()
142903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
143003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_requestedSessionId == null)
143103928aee4356845252ac6b662d5c72c29903813eJake Slack            return false;
143203928aee4356845252ac6b662d5c72c29903813eJake Slack
143303928aee4356845252ac6b662d5c72c29903813eJake Slack        HttpSession session = getSession(false);
143403928aee4356845252ac6b662d5c72c29903813eJake Slack        return (session != null && _sessionManager.getSessionIdManager().getClusterId(_requestedSessionId).equals(_sessionManager.getClusterId(session)));
143503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
143603928aee4356845252ac6b662d5c72c29903813eJake Slack
143703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
143803928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
143903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#isSecure()
144003928aee4356845252ac6b662d5c72c29903813eJake Slack     */
144103928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isSecure()
144203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
144303928aee4356845252ac6b662d5c72c29903813eJake Slack        return _connection.isConfidential(this);
144403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
144503928aee4356845252ac6b662d5c72c29903813eJake Slack
144603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
144703928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
144803928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String)
144903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
145003928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean isUserInRole(String role)
145103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
145203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.Deferred)
145303928aee4356845252ac6b662d5c72c29903813eJake Slack            setAuthentication(((Authentication.Deferred)_authentication).authenticate(this));
145403928aee4356845252ac6b662d5c72c29903813eJake Slack
145503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.User)
145603928aee4356845252ac6b662d5c72c29903813eJake Slack            return ((Authentication.User)_authentication).isUserInRole(_scope,role);
145703928aee4356845252ac6b662d5c72c29903813eJake Slack        return false;
145803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
145903928aee4356845252ac6b662d5c72c29903813eJake Slack
146003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
146103928aee4356845252ac6b662d5c72c29903813eJake Slack    public HttpSession recoverNewSession(Object key)
146203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
146303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_savedNewSessions == null)
146403928aee4356845252ac6b662d5c72c29903813eJake Slack            return null;
146503928aee4356845252ac6b662d5c72c29903813eJake Slack        return _savedNewSessions.get(key);
146603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
146703928aee4356845252ac6b662d5c72c29903813eJake Slack
146803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
146903928aee4356845252ac6b662d5c72c29903813eJake Slack    protected void recycle()
147003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
147103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_inputState == __READER)
147203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
147303928aee4356845252ac6b662d5c72c29903813eJake Slack            try
147403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
147503928aee4356845252ac6b662d5c72c29903813eJake Slack                int r = _reader.read();
147603928aee4356845252ac6b662d5c72c29903813eJake Slack                while (r != -1)
147703928aee4356845252ac6b662d5c72c29903813eJake Slack                    r = _reader.read();
147803928aee4356845252ac6b662d5c72c29903813eJake Slack            }
147903928aee4356845252ac6b662d5c72c29903813eJake Slack            catch (Exception e)
148003928aee4356845252ac6b662d5c72c29903813eJake Slack            {
148103928aee4356845252ac6b662d5c72c29903813eJake Slack                LOG.ignore(e);
148203928aee4356845252ac6b662d5c72c29903813eJake Slack                _reader = null;
148303928aee4356845252ac6b662d5c72c29903813eJake Slack            }
148403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
148503928aee4356845252ac6b662d5c72c29903813eJake Slack
148603928aee4356845252ac6b662d5c72c29903813eJake Slack        setAuthentication(Authentication.NOT_CHECKED);
148703928aee4356845252ac6b662d5c72c29903813eJake Slack        _async.recycle();
148803928aee4356845252ac6b662d5c72c29903813eJake Slack        _asyncSupported = true;
148903928aee4356845252ac6b662d5c72c29903813eJake Slack        _handled = false;
149003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_context != null)
149103928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException("Request in context!");
149203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_attributes != null)
149303928aee4356845252ac6b662d5c72c29903813eJake Slack            _attributes.clearAttributes();
149403928aee4356845252ac6b662d5c72c29903813eJake Slack        _characterEncoding = null;
149503928aee4356845252ac6b662d5c72c29903813eJake Slack        _contextPath = null;
149603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_cookies != null)
149703928aee4356845252ac6b662d5c72c29903813eJake Slack            _cookies.reset();
149803928aee4356845252ac6b662d5c72c29903813eJake Slack        _cookiesExtracted = false;
149903928aee4356845252ac6b662d5c72c29903813eJake Slack        _context = null;
150003928aee4356845252ac6b662d5c72c29903813eJake Slack        _serverName = null;
150103928aee4356845252ac6b662d5c72c29903813eJake Slack        _method = null;
150203928aee4356845252ac6b662d5c72c29903813eJake Slack        _pathInfo = null;
150303928aee4356845252ac6b662d5c72c29903813eJake Slack        _port = 0;
150403928aee4356845252ac6b662d5c72c29903813eJake Slack        _protocol = HttpVersions.HTTP_1_1;
150503928aee4356845252ac6b662d5c72c29903813eJake Slack        _queryEncoding = null;
150603928aee4356845252ac6b662d5c72c29903813eJake Slack        _queryString = null;
150703928aee4356845252ac6b662d5c72c29903813eJake Slack        _requestedSessionId = null;
150803928aee4356845252ac6b662d5c72c29903813eJake Slack        _requestedSessionIdFromCookie = false;
150903928aee4356845252ac6b662d5c72c29903813eJake Slack        _session = null;
151003928aee4356845252ac6b662d5c72c29903813eJake Slack        _sessionManager = null;
151103928aee4356845252ac6b662d5c72c29903813eJake Slack        _requestURI = null;
151203928aee4356845252ac6b662d5c72c29903813eJake Slack        _scope = null;
151303928aee4356845252ac6b662d5c72c29903813eJake Slack        _scheme = URIUtil.HTTP;
151403928aee4356845252ac6b662d5c72c29903813eJake Slack        _servletPath = null;
151503928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeStamp = 0;
151603928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeStampBuffer = null;
151703928aee4356845252ac6b662d5c72c29903813eJake Slack        _uri = null;
151803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_baseParameters != null)
151903928aee4356845252ac6b662d5c72c29903813eJake Slack            _baseParameters.clear();
152003928aee4356845252ac6b662d5c72c29903813eJake Slack        _parameters = null;
152103928aee4356845252ac6b662d5c72c29903813eJake Slack        _paramsExtracted = false;
152203928aee4356845252ac6b662d5c72c29903813eJake Slack        _inputState = __NONE;
152303928aee4356845252ac6b662d5c72c29903813eJake Slack
152403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_savedNewSessions != null)
152503928aee4356845252ac6b662d5c72c29903813eJake Slack            _savedNewSessions.clear();
152603928aee4356845252ac6b662d5c72c29903813eJake Slack        _savedNewSessions=null;
152703928aee4356845252ac6b662d5c72c29903813eJake Slack        _multiPartInputStream = null;
152803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
152903928aee4356845252ac6b662d5c72c29903813eJake Slack
153003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
153103928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
153203928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
153303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
153403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void removeAttribute(String name)
153503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
153603928aee4356845252ac6b662d5c72c29903813eJake Slack        Object old_value = _attributes == null?null:_attributes.getAttribute(name);
153703928aee4356845252ac6b662d5c72c29903813eJake Slack
153803928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_attributes != null)
153903928aee4356845252ac6b662d5c72c29903813eJake Slack            _attributes.removeAttribute(name);
154003928aee4356845252ac6b662d5c72c29903813eJake Slack
154103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (old_value != null)
154203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
154303928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_requestAttributeListeners != null)
154403928aee4356845252ac6b662d5c72c29903813eJake Slack            {
154503928aee4356845252ac6b662d5c72c29903813eJake Slack                final ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(_context,this,name,old_value);
154603928aee4356845252ac6b662d5c72c29903813eJake Slack                final int size = LazyList.size(_requestAttributeListeners);
154703928aee4356845252ac6b662d5c72c29903813eJake Slack                for (int i = 0; i < size; i++)
154803928aee4356845252ac6b662d5c72c29903813eJake Slack                {
154903928aee4356845252ac6b662d5c72c29903813eJake Slack                    final EventListener listener = (ServletRequestAttributeListener)LazyList.get(_requestAttributeListeners,i);
155003928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (listener instanceof ServletRequestAttributeListener)
155103928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
155203928aee4356845252ac6b662d5c72c29903813eJake Slack                        final ServletRequestAttributeListener l = (ServletRequestAttributeListener)listener;
155303928aee4356845252ac6b662d5c72c29903813eJake Slack                        l.attributeRemoved(event);
155403928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
155503928aee4356845252ac6b662d5c72c29903813eJake Slack                }
155603928aee4356845252ac6b662d5c72c29903813eJake Slack            }
155703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
155803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
155903928aee4356845252ac6b662d5c72c29903813eJake Slack
156003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
156103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void removeEventListener(final EventListener listener)
156203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
156303928aee4356845252ac6b662d5c72c29903813eJake Slack        _requestAttributeListeners = LazyList.remove(_requestAttributeListeners,listener);
156403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
156503928aee4356845252ac6b662d5c72c29903813eJake Slack
156603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
156703928aee4356845252ac6b662d5c72c29903813eJake Slack    public void saveNewSession(Object key, HttpSession session)
156803928aee4356845252ac6b662d5c72c29903813eJake Slack    {
156903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_savedNewSessions == null)
157003928aee4356845252ac6b662d5c72c29903813eJake Slack            _savedNewSessions = new HashMap<Object, HttpSession>();
157103928aee4356845252ac6b662d5c72c29903813eJake Slack        _savedNewSessions.put(key,session);
157203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
157303928aee4356845252ac6b662d5c72c29903813eJake Slack
157403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
157503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setAsyncSupported(boolean supported)
157603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
157703928aee4356845252ac6b662d5c72c29903813eJake Slack        _asyncSupported = supported;
157803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
157903928aee4356845252ac6b662d5c72c29903813eJake Slack
158003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
158103928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
158203928aee4356845252ac6b662d5c72c29903813eJake Slack     * 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
158303928aee4356845252ac6b662d5c72c29903813eJake Slack     * {@link #setQueryEncoding}. <p> if the attribute name is "org.eclipse.jetty.server.server.ResponseBuffer", then the response buffer is flushed with @{link
158403928aee4356845252ac6b662d5c72c29903813eJake Slack     * #flushResponseBuffer} <p> if the attribute name is "org.eclipse.jetty.io.EndPoint.maxIdleTime", then the value is passed to the associated {@link
158503928aee4356845252ac6b662d5c72c29903813eJake Slack     * EndPoint#setMaxIdleTime}.
158603928aee4356845252ac6b662d5c72c29903813eJake Slack     *
158703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, java.lang.Object)
158803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
158903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setAttribute(String name, Object value)
159003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
159103928aee4356845252ac6b662d5c72c29903813eJake Slack        Object old_value = _attributes == null?null:_attributes.getAttribute(name);
159203928aee4356845252ac6b662d5c72c29903813eJake Slack
159303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (name.startsWith("org.eclipse.jetty."))
159403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
159503928aee4356845252ac6b662d5c72c29903813eJake Slack            if ("org.eclipse.jetty.server.Request.queryEncoding".equals(name))
159603928aee4356845252ac6b662d5c72c29903813eJake Slack                setQueryEncoding(value == null?null:value.toString());
159703928aee4356845252ac6b662d5c72c29903813eJake Slack            else if ("org.eclipse.jetty.server.sendContent".equals(name))
159803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
159903928aee4356845252ac6b662d5c72c29903813eJake Slack                try
160003928aee4356845252ac6b662d5c72c29903813eJake Slack                {
160103928aee4356845252ac6b662d5c72c29903813eJake Slack                    ((AbstractHttpConnection.Output)getServletResponse().getOutputStream()).sendContent(value);
160203928aee4356845252ac6b662d5c72c29903813eJake Slack                }
160303928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (IOException e)
160403928aee4356845252ac6b662d5c72c29903813eJake Slack                {
160503928aee4356845252ac6b662d5c72c29903813eJake Slack                    throw new RuntimeException(e);
160603928aee4356845252ac6b662d5c72c29903813eJake Slack                }
160703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
160803928aee4356845252ac6b662d5c72c29903813eJake Slack            else if ("org.eclipse.jetty.server.ResponseBuffer".equals(name))
160903928aee4356845252ac6b662d5c72c29903813eJake Slack            {
161003928aee4356845252ac6b662d5c72c29903813eJake Slack                try
161103928aee4356845252ac6b662d5c72c29903813eJake Slack                {
161203928aee4356845252ac6b662d5c72c29903813eJake Slack                    final ByteBuffer byteBuffer = (ByteBuffer)value;
161303928aee4356845252ac6b662d5c72c29903813eJake Slack                    synchronized (byteBuffer)
161403928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
161503928aee4356845252ac6b662d5c72c29903813eJake Slack                        NIOBuffer buffer = byteBuffer.isDirect()?new DirectNIOBuffer(byteBuffer,true):new IndirectNIOBuffer(byteBuffer,true);
161603928aee4356845252ac6b662d5c72c29903813eJake Slack                        ((AbstractHttpConnection.Output)getServletResponse().getOutputStream()).sendResponse(buffer);
161703928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
161803928aee4356845252ac6b662d5c72c29903813eJake Slack                }
161903928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (IOException e)
162003928aee4356845252ac6b662d5c72c29903813eJake Slack                {
162103928aee4356845252ac6b662d5c72c29903813eJake Slack                    throw new RuntimeException(e);
162203928aee4356845252ac6b662d5c72c29903813eJake Slack                }
162303928aee4356845252ac6b662d5c72c29903813eJake Slack            }
162403928aee4356845252ac6b662d5c72c29903813eJake Slack            else if ("org.eclipse.jetty.io.EndPoint.maxIdleTime".equalsIgnoreCase(name))
162503928aee4356845252ac6b662d5c72c29903813eJake Slack            {
162603928aee4356845252ac6b662d5c72c29903813eJake Slack                try
162703928aee4356845252ac6b662d5c72c29903813eJake Slack                {
162803928aee4356845252ac6b662d5c72c29903813eJake Slack                    getConnection().getEndPoint().setMaxIdleTime(Integer.valueOf(value.toString()));
162903928aee4356845252ac6b662d5c72c29903813eJake Slack                }
163003928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (IOException e)
163103928aee4356845252ac6b662d5c72c29903813eJake Slack                {
163203928aee4356845252ac6b662d5c72c29903813eJake Slack                    throw new RuntimeException(e);
163303928aee4356845252ac6b662d5c72c29903813eJake Slack                }
163403928aee4356845252ac6b662d5c72c29903813eJake Slack            }
163503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
163603928aee4356845252ac6b662d5c72c29903813eJake Slack
163703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_attributes == null)
163803928aee4356845252ac6b662d5c72c29903813eJake Slack            _attributes = new AttributesMap();
163903928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes.setAttribute(name,value);
164003928aee4356845252ac6b662d5c72c29903813eJake Slack
164103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_requestAttributeListeners != null)
164203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
164303928aee4356845252ac6b662d5c72c29903813eJake Slack            final ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(_context,this,name,old_value == null?value:old_value);
164403928aee4356845252ac6b662d5c72c29903813eJake Slack            final int size = LazyList.size(_requestAttributeListeners);
164503928aee4356845252ac6b662d5c72c29903813eJake Slack            for (int i = 0; i < size; i++)
164603928aee4356845252ac6b662d5c72c29903813eJake Slack            {
164703928aee4356845252ac6b662d5c72c29903813eJake Slack                final EventListener listener = (ServletRequestAttributeListener)LazyList.get(_requestAttributeListeners,i);
164803928aee4356845252ac6b662d5c72c29903813eJake Slack                if (listener instanceof ServletRequestAttributeListener)
164903928aee4356845252ac6b662d5c72c29903813eJake Slack                {
165003928aee4356845252ac6b662d5c72c29903813eJake Slack                    final ServletRequestAttributeListener l = (ServletRequestAttributeListener)listener;
165103928aee4356845252ac6b662d5c72c29903813eJake Slack
165203928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (old_value == null)
165303928aee4356845252ac6b662d5c72c29903813eJake Slack                        l.attributeAdded(event);
165403928aee4356845252ac6b662d5c72c29903813eJake Slack                    else if (value == null)
165503928aee4356845252ac6b662d5c72c29903813eJake Slack                        l.attributeRemoved(event);
165603928aee4356845252ac6b662d5c72c29903813eJake Slack                    else
165703928aee4356845252ac6b662d5c72c29903813eJake Slack                        l.attributeReplaced(event);
165803928aee4356845252ac6b662d5c72c29903813eJake Slack                }
165903928aee4356845252ac6b662d5c72c29903813eJake Slack            }
166003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
166103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
166203928aee4356845252ac6b662d5c72c29903813eJake Slack
166303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
166403928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
166503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
166603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setAttributes(Attributes attributes)
166703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
166803928aee4356845252ac6b662d5c72c29903813eJake Slack        _attributes = attributes;
166903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
167003928aee4356845252ac6b662d5c72c29903813eJake Slack
167103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
167203928aee4356845252ac6b662d5c72c29903813eJake Slack
167303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
167403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
167503928aee4356845252ac6b662d5c72c29903813eJake Slack     * Set the authentication.
167603928aee4356845252ac6b662d5c72c29903813eJake Slack     *
167703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param authentication
167803928aee4356845252ac6b662d5c72c29903813eJake Slack     *            the authentication to set
167903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
168003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setAuthentication(Authentication authentication)
168103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
168203928aee4356845252ac6b662d5c72c29903813eJake Slack        _authentication = authentication;
168303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
168403928aee4356845252ac6b662d5c72c29903813eJake Slack
168503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
168603928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
168703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
168803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
168903928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setCharacterEncoding(String encoding) throws UnsupportedEncodingException
169003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
169103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_inputState != __NONE)
169203928aee4356845252ac6b662d5c72c29903813eJake Slack            return;
169303928aee4356845252ac6b662d5c72c29903813eJake Slack
169403928aee4356845252ac6b662d5c72c29903813eJake Slack        _characterEncoding = encoding;
169503928aee4356845252ac6b662d5c72c29903813eJake Slack
169603928aee4356845252ac6b662d5c72c29903813eJake Slack        // check encoding is supported
169703928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!StringUtil.isUTF8(encoding))
169803928aee4356845252ac6b662d5c72c29903813eJake Slack            // noinspection ResultOfMethodCallIgnored
169903928aee4356845252ac6b662d5c72c29903813eJake Slack            "".getBytes(encoding);
170003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
170103928aee4356845252ac6b662d5c72c29903813eJake Slack
170203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
170303928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
170403928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
170503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
170603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setCharacterEncodingUnchecked(String encoding)
170703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
170803928aee4356845252ac6b662d5c72c29903813eJake Slack        _characterEncoding = encoding;
170903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
171003928aee4356845252ac6b662d5c72c29903813eJake Slack
171103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
171203928aee4356845252ac6b662d5c72c29903813eJake Slack    // final so we can safely call this from constructor
171303928aee4356845252ac6b662d5c72c29903813eJake Slack    protected final void setConnection(AbstractHttpConnection connection)
171403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
171503928aee4356845252ac6b662d5c72c29903813eJake Slack        _connection = connection;
171603928aee4356845252ac6b662d5c72c29903813eJake Slack        _async.setConnection(connection);
171703928aee4356845252ac6b662d5c72c29903813eJake Slack        _endp = connection.getEndPoint();
171803928aee4356845252ac6b662d5c72c29903813eJake Slack        _dns = connection.getResolveNames();
171903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
172003928aee4356845252ac6b662d5c72c29903813eJake Slack
172103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
172203928aee4356845252ac6b662d5c72c29903813eJake Slack    /*
172303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see javax.servlet.ServletRequest#getContentType()
172403928aee4356845252ac6b662d5c72c29903813eJake Slack     */
172503928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setContentType(String contentType)
172603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
172703928aee4356845252ac6b662d5c72c29903813eJake Slack        _connection.getRequestFields().put(HttpHeaders.CONTENT_TYPE_BUFFER,contentType);
172803928aee4356845252ac6b662d5c72c29903813eJake Slack
172903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
173003928aee4356845252ac6b662d5c72c29903813eJake Slack
173103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
173203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
173303928aee4356845252ac6b662d5c72c29903813eJake Slack     * Set request context
173403928aee4356845252ac6b662d5c72c29903813eJake Slack     *
173503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param context
173603928aee4356845252ac6b662d5c72c29903813eJake Slack     *            context object
173703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
173803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setContext(Context context)
173903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
174003928aee4356845252ac6b662d5c72c29903813eJake Slack        _newContext = _context != context;
174103928aee4356845252ac6b662d5c72c29903813eJake Slack        _context = context;
174203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
174303928aee4356845252ac6b662d5c72c29903813eJake Slack
174403928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
174503928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
174603928aee4356845252ac6b662d5c72c29903813eJake Slack     * @return True if this is the first call of {@link #takeNewContext()} since the last
174703928aee4356845252ac6b662d5c72c29903813eJake Slack     *         {@link #setContext(org.eclipse.jetty.server.handler.ContextHandler.Context)} call.
174803928aee4356845252ac6b662d5c72c29903813eJake Slack     */
174903928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean takeNewContext()
175003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
175103928aee4356845252ac6b662d5c72c29903813eJake Slack        boolean nc = _newContext;
175203928aee4356845252ac6b662d5c72c29903813eJake Slack        _newContext = false;
175303928aee4356845252ac6b662d5c72c29903813eJake Slack        return nc;
175403928aee4356845252ac6b662d5c72c29903813eJake Slack    }
175503928aee4356845252ac6b662d5c72c29903813eJake Slack
175603928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
175703928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
175803928aee4356845252ac6b662d5c72c29903813eJake Slack     * Sets the "context path" for this request
175903928aee4356845252ac6b662d5c72c29903813eJake Slack     *
176003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @see HttpServletRequest#getContextPath()
176103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
176203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setContextPath(String contextPath)
176303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
176403928aee4356845252ac6b662d5c72c29903813eJake Slack        _contextPath = contextPath;
176503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
176603928aee4356845252ac6b662d5c72c29903813eJake Slack
176703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
176803928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
176903928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param cookies
177003928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The cookies to set.
177103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
177203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setCookies(Cookie[] cookies)
177303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
177403928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_cookies == null)
177503928aee4356845252ac6b662d5c72c29903813eJake Slack            _cookies = new CookieCutter();
177603928aee4356845252ac6b662d5c72c29903813eJake Slack        _cookies.setCookies(cookies);
177703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
177803928aee4356845252ac6b662d5c72c29903813eJake Slack
177903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
178003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setDispatcherType(DispatcherType type)
178103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
178203928aee4356845252ac6b662d5c72c29903813eJake Slack        _dispatcherType = type;
178303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
178403928aee4356845252ac6b662d5c72c29903813eJake Slack
178503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
178603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setHandled(boolean h)
178703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
178803928aee4356845252ac6b662d5c72c29903813eJake Slack        _handled = h;
178903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
179003928aee4356845252ac6b662d5c72c29903813eJake Slack
179103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
179203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
179303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param method
179403928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The method to set.
179503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
179603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setMethod(String method)
179703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
179803928aee4356845252ac6b662d5c72c29903813eJake Slack        _method = method;
179903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
180003928aee4356845252ac6b662d5c72c29903813eJake Slack
180103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
180203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
180303928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param parameters
180403928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The parameters to set.
180503928aee4356845252ac6b662d5c72c29903813eJake Slack     */
180603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setParameters(MultiMap<String> parameters)
180703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
180803928aee4356845252ac6b662d5c72c29903813eJake Slack        _parameters = (parameters == null)?_baseParameters:parameters;
180903928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_paramsExtracted && _parameters == null)
181003928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException();
181103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
181203928aee4356845252ac6b662d5c72c29903813eJake Slack
181303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
181403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
181503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param pathInfo
181603928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The pathInfo to set.
181703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
181803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setPathInfo(String pathInfo)
181903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
182003928aee4356845252ac6b662d5c72c29903813eJake Slack        _pathInfo = pathInfo;
182103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
182203928aee4356845252ac6b662d5c72c29903813eJake Slack
182303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
182403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
182503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param protocol
182603928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The protocol to set.
182703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
182803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setProtocol(String protocol)
182903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
183003928aee4356845252ac6b662d5c72c29903813eJake Slack        _protocol = protocol;
183103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
183203928aee4356845252ac6b662d5c72c29903813eJake Slack
183303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
183403928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
183503928aee4356845252ac6b662d5c72c29903813eJake Slack     * 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
183603928aee4356845252ac6b662d5c72c29903813eJake Slack     * geParameter methods.
183703928aee4356845252ac6b662d5c72c29903813eJake Slack     *
183803928aee4356845252ac6b662d5c72c29903813eJake Slack     * The request attribute "org.eclipse.jetty.server.server.Request.queryEncoding" may be set as an alternate method of calling setQueryEncoding.
183903928aee4356845252ac6b662d5c72c29903813eJake Slack     *
184003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param queryEncoding
184103928aee4356845252ac6b662d5c72c29903813eJake Slack     */
184203928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setQueryEncoding(String queryEncoding)
184303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
184403928aee4356845252ac6b662d5c72c29903813eJake Slack        _queryEncoding = queryEncoding;
184503928aee4356845252ac6b662d5c72c29903813eJake Slack        _queryString = null;
184603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
184703928aee4356845252ac6b662d5c72c29903813eJake Slack
184803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
184903928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
185003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param queryString
185103928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The queryString to set.
185203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
185303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setQueryString(String queryString)
185403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
185503928aee4356845252ac6b662d5c72c29903813eJake Slack        _queryString = queryString;
185603928aee4356845252ac6b662d5c72c29903813eJake Slack        _queryEncoding = null; //assume utf-8
185703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
185803928aee4356845252ac6b662d5c72c29903813eJake Slack
185903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
186003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
186103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param addr
186203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The address to set.
186303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
186403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRemoteAddr(String addr)
186503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
186603928aee4356845252ac6b662d5c72c29903813eJake Slack        _remoteAddr = addr;
186703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
186803928aee4356845252ac6b662d5c72c29903813eJake Slack
186903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
187003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
187103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param host
187203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The host to set.
187303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
187403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRemoteHost(String host)
187503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
187603928aee4356845252ac6b662d5c72c29903813eJake Slack        _remoteHost = host;
187703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
187803928aee4356845252ac6b662d5c72c29903813eJake Slack
187903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
188003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
188103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param requestedSessionId
188203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The requestedSessionId to set.
188303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
188403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRequestedSessionId(String requestedSessionId)
188503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
188603928aee4356845252ac6b662d5c72c29903813eJake Slack        _requestedSessionId = requestedSessionId;
188703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
188803928aee4356845252ac6b662d5c72c29903813eJake Slack
188903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
189003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
189103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param requestedSessionIdCookie
189203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The requestedSessionIdCookie to set.
189303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
189403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRequestedSessionIdFromCookie(boolean requestedSessionIdCookie)
189503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
189603928aee4356845252ac6b662d5c72c29903813eJake Slack        _requestedSessionIdFromCookie = requestedSessionIdCookie;
189703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
189803928aee4356845252ac6b662d5c72c29903813eJake Slack
189903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
190003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
190103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param requestURI
190203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The requestURI to set.
190303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
190403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setRequestURI(String requestURI)
190503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
190603928aee4356845252ac6b662d5c72c29903813eJake Slack        _requestURI = requestURI;
190703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
190803928aee4356845252ac6b662d5c72c29903813eJake Slack
190903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
191003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
191103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param scheme
191203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The scheme to set.
191303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
191403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setScheme(String scheme)
191503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
191603928aee4356845252ac6b662d5c72c29903813eJake Slack        _scheme = scheme;
191703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
191803928aee4356845252ac6b662d5c72c29903813eJake Slack
191903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
192003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
192103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param host
192203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The host to set.
192303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
192403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setServerName(String host)
192503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
192603928aee4356845252ac6b662d5c72c29903813eJake Slack        _serverName = host;
192703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
192803928aee4356845252ac6b662d5c72c29903813eJake Slack
192903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
193003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
193103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param port
193203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The port to set.
193303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
193403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setServerPort(int port)
193503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
193603928aee4356845252ac6b662d5c72c29903813eJake Slack        _port = port;
193703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
193803928aee4356845252ac6b662d5c72c29903813eJake Slack
193903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
194003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
194103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param servletPath
194203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The servletPath to set.
194303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
194403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setServletPath(String servletPath)
194503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
194603928aee4356845252ac6b662d5c72c29903813eJake Slack        _servletPath = servletPath;
194703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
194803928aee4356845252ac6b662d5c72c29903813eJake Slack
194903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
195003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
195103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param session
195203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The session to set.
195303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
195403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setSession(HttpSession session)
195503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
195603928aee4356845252ac6b662d5c72c29903813eJake Slack        _session = session;
195703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
195803928aee4356845252ac6b662d5c72c29903813eJake Slack
195903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
196003928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
196103928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param sessionManager
196203928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The sessionManager to set.
196303928aee4356845252ac6b662d5c72c29903813eJake Slack     */
196403928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setSessionManager(SessionManager sessionManager)
196503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
196603928aee4356845252ac6b662d5c72c29903813eJake Slack        _sessionManager = sessionManager;
196703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
196803928aee4356845252ac6b662d5c72c29903813eJake Slack
196903928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
197003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setTimeStamp(long ts)
197103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
197203928aee4356845252ac6b662d5c72c29903813eJake Slack        _timeStamp = ts;
197303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
197403928aee4356845252ac6b662d5c72c29903813eJake Slack
197503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
197603928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
197703928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param uri
197803928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The uri to set.
197903928aee4356845252ac6b662d5c72c29903813eJake Slack     */
198003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setUri(HttpURI uri)
198103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
198203928aee4356845252ac6b662d5c72c29903813eJake Slack        _uri = uri;
198303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
198403928aee4356845252ac6b662d5c72c29903813eJake Slack
198503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
198603928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setUserIdentityScope(UserIdentity.Scope scope)
198703928aee4356845252ac6b662d5c72c29903813eJake Slack    {
198803928aee4356845252ac6b662d5c72c29903813eJake Slack        _scope = scope;
198903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
199003928aee4356845252ac6b662d5c72c29903813eJake Slack
199103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
199203928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
199303928aee4356845252ac6b662d5c72c29903813eJake Slack     * Set timetstamp of request dispatch
199403928aee4356845252ac6b662d5c72c29903813eJake Slack     *
199503928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param value
199603928aee4356845252ac6b662d5c72c29903813eJake Slack     *            timestamp
199703928aee4356845252ac6b662d5c72c29903813eJake Slack     */
199803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void setDispatchTime(long value)
199903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
200003928aee4356845252ac6b662d5c72c29903813eJake Slack        _dispatchTime = value;
200103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
200203928aee4356845252ac6b662d5c72c29903813eJake Slack
200303928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
200403928aee4356845252ac6b662d5c72c29903813eJake Slack    public AsyncContext startAsync() throws IllegalStateException
200503928aee4356845252ac6b662d5c72c29903813eJake Slack    {
200603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!_asyncSupported)
200703928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException("!asyncSupported");
200803928aee4356845252ac6b662d5c72c29903813eJake Slack        _async.startAsync();
200903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _async;
201003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
201103928aee4356845252ac6b662d5c72c29903813eJake Slack
201203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
201303928aee4356845252ac6b662d5c72c29903813eJake Slack    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException
201403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
201503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!_asyncSupported)
201603928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new IllegalStateException("!asyncSupported");
201703928aee4356845252ac6b662d5c72c29903813eJake Slack        _async.startAsync(_context,servletRequest,servletResponse);
201803928aee4356845252ac6b662d5c72c29903813eJake Slack        return _async;
201903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
202003928aee4356845252ac6b662d5c72c29903813eJake Slack
202103928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
202203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
202303928aee4356845252ac6b662d5c72c29903813eJake Slack    public String toString()
202403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
202503928aee4356845252ac6b662d5c72c29903813eJake Slack        return (_handled?"[":"(") + getMethod() + " " + _uri + (_handled?"]@":")@") + hashCode() + " " + super.toString();
202603928aee4356845252ac6b662d5c72c29903813eJake Slack    }
202703928aee4356845252ac6b662d5c72c29903813eJake Slack
202803928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
202903928aee4356845252ac6b662d5c72c29903813eJake Slack    public boolean authenticate(HttpServletResponse response) throws IOException, ServletException
203003928aee4356845252ac6b662d5c72c29903813eJake Slack    {
203103928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.Deferred)
203203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
203303928aee4356845252ac6b662d5c72c29903813eJake Slack            setAuthentication(((Authentication.Deferred)_authentication).authenticate(this,response));
203403928aee4356845252ac6b662d5c72c29903813eJake Slack            return !(_authentication instanceof Authentication.ResponseSent);
203503928aee4356845252ac6b662d5c72c29903813eJake Slack        }
203603928aee4356845252ac6b662d5c72c29903813eJake Slack        response.sendError(HttpStatus.UNAUTHORIZED_401);
203703928aee4356845252ac6b662d5c72c29903813eJake Slack        return false;
203803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
203903928aee4356845252ac6b662d5c72c29903813eJake Slack
204003928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
204103928aee4356845252ac6b662d5c72c29903813eJake Slack    public Part getPart(String name) throws IOException, ServletException
204203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
204303928aee4356845252ac6b662d5c72c29903813eJake Slack        getParts();
204403928aee4356845252ac6b662d5c72c29903813eJake Slack        return _multiPartInputStream.getPart(name);
204503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
204603928aee4356845252ac6b662d5c72c29903813eJake Slack
204703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
204803928aee4356845252ac6b662d5c72c29903813eJake Slack    public Collection<Part> getParts() throws IOException, ServletException
204903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
205003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (getContentType() == null || !getContentType().startsWith("multipart/form-data"))
205103928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new ServletException("Content-Type != multipart/form-data");
205203928aee4356845252ac6b662d5c72c29903813eJake Slack
205303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_multiPartInputStream == null)
205403928aee4356845252ac6b662d5c72c29903813eJake Slack            _multiPartInputStream = (MultiPartInputStream)getAttribute(__MULTIPART_INPUT_STREAM);
205503928aee4356845252ac6b662d5c72c29903813eJake Slack
205603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_multiPartInputStream == null)
205703928aee4356845252ac6b662d5c72c29903813eJake Slack        {
205803928aee4356845252ac6b662d5c72c29903813eJake Slack            MultipartConfigElement config = (MultipartConfigElement)getAttribute(__MULTIPART_CONFIG_ELEMENT);
205903928aee4356845252ac6b662d5c72c29903813eJake Slack
206003928aee4356845252ac6b662d5c72c29903813eJake Slack            if (config == null)
206103928aee4356845252ac6b662d5c72c29903813eJake Slack                throw new IllegalStateException("No multipart config for servlet");
206203928aee4356845252ac6b662d5c72c29903813eJake Slack
206303928aee4356845252ac6b662d5c72c29903813eJake Slack            _multiPartInputStream = new MultiPartInputStream(getInputStream(),
206403928aee4356845252ac6b662d5c72c29903813eJake Slack                                                             getContentType(), config,
206503928aee4356845252ac6b662d5c72c29903813eJake Slack                                                             (_context != null?(File)_context.getAttribute("javax.servlet.context.tempdir"):null));
206603928aee4356845252ac6b662d5c72c29903813eJake Slack
206703928aee4356845252ac6b662d5c72c29903813eJake Slack            setAttribute(__MULTIPART_INPUT_STREAM, _multiPartInputStream);
206803928aee4356845252ac6b662d5c72c29903813eJake Slack            setAttribute(__MULTIPART_CONTEXT, _context);
206903928aee4356845252ac6b662d5c72c29903813eJake Slack            Collection<Part> parts = _multiPartInputStream.getParts(); //causes parsing
207003928aee4356845252ac6b662d5c72c29903813eJake Slack            for (Part p:parts)
207103928aee4356845252ac6b662d5c72c29903813eJake Slack            {
207203928aee4356845252ac6b662d5c72c29903813eJake Slack                MultiPartInputStream.MultiPart mp = (MultiPartInputStream.MultiPart)p;
207303928aee4356845252ac6b662d5c72c29903813eJake Slack                if (mp.getContentDispositionFilename() == null)
207403928aee4356845252ac6b662d5c72c29903813eJake Slack                {
207503928aee4356845252ac6b662d5c72c29903813eJake Slack                    //Servlet Spec 3.0 pg 23, parts without filenames must be put into init params
207603928aee4356845252ac6b662d5c72c29903813eJake Slack                    String charset = null;
207703928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (mp.getContentType() != null)
207803928aee4356845252ac6b662d5c72c29903813eJake Slack                        charset = MimeTypes.getCharsetFromContentType(new ByteArrayBuffer(mp.getContentType()));
207903928aee4356845252ac6b662d5c72c29903813eJake Slack
208003928aee4356845252ac6b662d5c72c29903813eJake Slack                    ByteArrayOutputStream os = null;
208103928aee4356845252ac6b662d5c72c29903813eJake Slack                    InputStream is = mp.getInputStream(); //get the bytes regardless of being in memory or in temp file
208203928aee4356845252ac6b662d5c72c29903813eJake Slack                    try
208303928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
208403928aee4356845252ac6b662d5c72c29903813eJake Slack                        os = new ByteArrayOutputStream();
208503928aee4356845252ac6b662d5c72c29903813eJake Slack                        IO.copy(is, os);
208603928aee4356845252ac6b662d5c72c29903813eJake Slack                        String content=new String(os.toByteArray(),charset==null?StringUtil.__UTF8:charset);
208703928aee4356845252ac6b662d5c72c29903813eJake Slack                        getParameter(""); //cause params to be evaluated
208803928aee4356845252ac6b662d5c72c29903813eJake Slack                        getParameters().add(mp.getName(), content);
208903928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
209003928aee4356845252ac6b662d5c72c29903813eJake Slack                    finally
209103928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
209203928aee4356845252ac6b662d5c72c29903813eJake Slack                        IO.close(os);
209303928aee4356845252ac6b662d5c72c29903813eJake Slack                        IO.close(is);
209403928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
209503928aee4356845252ac6b662d5c72c29903813eJake Slack                }
209603928aee4356845252ac6b662d5c72c29903813eJake Slack            }
209703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
209803928aee4356845252ac6b662d5c72c29903813eJake Slack
209903928aee4356845252ac6b662d5c72c29903813eJake Slack        return _multiPartInputStream.getParts();
210003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
210103928aee4356845252ac6b662d5c72c29903813eJake Slack
210203928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
210303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void login(String username, String password) throws ServletException
210403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
210503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.Deferred)
210603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
210703928aee4356845252ac6b662d5c72c29903813eJake Slack            _authentication=((Authentication.Deferred)_authentication).login(username,password,this);
210803928aee4356845252ac6b662d5c72c29903813eJake Slack            if (_authentication == null)
210903928aee4356845252ac6b662d5c72c29903813eJake Slack                throw new ServletException();
211003928aee4356845252ac6b662d5c72c29903813eJake Slack        }
211103928aee4356845252ac6b662d5c72c29903813eJake Slack        else
211203928aee4356845252ac6b662d5c72c29903813eJake Slack        {
211303928aee4356845252ac6b662d5c72c29903813eJake Slack            throw new ServletException("Authenticated as "+_authentication);
211403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
211503928aee4356845252ac6b662d5c72c29903813eJake Slack    }
211603928aee4356845252ac6b662d5c72c29903813eJake Slack
211703928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
211803928aee4356845252ac6b662d5c72c29903813eJake Slack    public void logout() throws ServletException
211903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
212003928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_authentication instanceof Authentication.User)
212103928aee4356845252ac6b662d5c72c29903813eJake Slack            ((Authentication.User)_authentication).logout();
212203928aee4356845252ac6b662d5c72c29903813eJake Slack        _authentication=Authentication.UNAUTHENTICATED;
212303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
212403928aee4356845252ac6b662d5c72c29903813eJake Slack
212503928aee4356845252ac6b662d5c72c29903813eJake Slack    /* ------------------------------------------------------------ */
212603928aee4356845252ac6b662d5c72c29903813eJake Slack    /**
212703928aee4356845252ac6b662d5c72c29903813eJake Slack     * Merge in a new query string. The query string is merged with the existing parameters and {@link #setParameters(MultiMap)} and
212803928aee4356845252ac6b662d5c72c29903813eJake Slack     * {@link #setQueryString(String)} are called with the result. The merge is according to the rules of the servlet dispatch forward method.
212903928aee4356845252ac6b662d5c72c29903813eJake Slack     *
213003928aee4356845252ac6b662d5c72c29903813eJake Slack     * @param query
213103928aee4356845252ac6b662d5c72c29903813eJake Slack     *            The query string to merge into the request.
213203928aee4356845252ac6b662d5c72c29903813eJake Slack     */
213303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void mergeQueryString(String query)
213403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
213503928aee4356845252ac6b662d5c72c29903813eJake Slack        // extract parameters from dispatch query
213603928aee4356845252ac6b662d5c72c29903813eJake Slack        MultiMap<String> parameters = new MultiMap<String>();
213703928aee4356845252ac6b662d5c72c29903813eJake Slack        UrlEncoded.decodeTo(query,parameters, StringUtil.__UTF8); //have to assume UTF-8 because we can't know otherwise
213803928aee4356845252ac6b662d5c72c29903813eJake Slack
213903928aee4356845252ac6b662d5c72c29903813eJake Slack        boolean merge_old_query = false;
214003928aee4356845252ac6b662d5c72c29903813eJake Slack
214103928aee4356845252ac6b662d5c72c29903813eJake Slack        // Have we evaluated parameters
214203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (!_paramsExtracted)
214303928aee4356845252ac6b662d5c72c29903813eJake Slack            extractParameters();
214403928aee4356845252ac6b662d5c72c29903813eJake Slack
214503928aee4356845252ac6b662d5c72c29903813eJake Slack        // Are there any existing parameters?
214603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_parameters != null && _parameters.size() > 0)
214703928aee4356845252ac6b662d5c72c29903813eJake Slack        {
214803928aee4356845252ac6b662d5c72c29903813eJake Slack            // Merge parameters; new parameters of the same name take precedence.
214903928aee4356845252ac6b662d5c72c29903813eJake Slack            Iterator<Entry<String, Object>> iter = _parameters.entrySet().iterator();
215003928aee4356845252ac6b662d5c72c29903813eJake Slack            while (iter.hasNext())
215103928aee4356845252ac6b662d5c72c29903813eJake Slack            {
215203928aee4356845252ac6b662d5c72c29903813eJake Slack                Map.Entry<String, Object> entry = iter.next();
215303928aee4356845252ac6b662d5c72c29903813eJake Slack                String name = entry.getKey();
215403928aee4356845252ac6b662d5c72c29903813eJake Slack
215503928aee4356845252ac6b662d5c72c29903813eJake Slack                // If the names match, we will need to remake the query string
215603928aee4356845252ac6b662d5c72c29903813eJake Slack                if (parameters.containsKey(name))
215703928aee4356845252ac6b662d5c72c29903813eJake Slack                    merge_old_query = true;
215803928aee4356845252ac6b662d5c72c29903813eJake Slack
215903928aee4356845252ac6b662d5c72c29903813eJake Slack                // Add the old values to the new parameter map
216003928aee4356845252ac6b662d5c72c29903813eJake Slack                Object values = entry.getValue();
216103928aee4356845252ac6b662d5c72c29903813eJake Slack                for (int i = 0; i < LazyList.size(values); i++)
216203928aee4356845252ac6b662d5c72c29903813eJake Slack                    parameters.add(name,LazyList.get(values,i));
216303928aee4356845252ac6b662d5c72c29903813eJake Slack            }
216403928aee4356845252ac6b662d5c72c29903813eJake Slack        }
216503928aee4356845252ac6b662d5c72c29903813eJake Slack
216603928aee4356845252ac6b662d5c72c29903813eJake Slack        if (_queryString != null && _queryString.length() > 0)
216703928aee4356845252ac6b662d5c72c29903813eJake Slack        {
216803928aee4356845252ac6b662d5c72c29903813eJake Slack            if (merge_old_query)
216903928aee4356845252ac6b662d5c72c29903813eJake Slack            {
217003928aee4356845252ac6b662d5c72c29903813eJake Slack                StringBuilder overridden_query_string = new StringBuilder();
217103928aee4356845252ac6b662d5c72c29903813eJake Slack                MultiMap<String> overridden_old_query = new MultiMap<String>();
217203928aee4356845252ac6b662d5c72c29903813eJake Slack                UrlEncoded.decodeTo(_queryString,overridden_old_query,getQueryEncoding());//decode using any queryencoding set for the request
217303928aee4356845252ac6b662d5c72c29903813eJake Slack
217403928aee4356845252ac6b662d5c72c29903813eJake Slack
217503928aee4356845252ac6b662d5c72c29903813eJake Slack                MultiMap<String> overridden_new_query = new MultiMap<String>();
217603928aee4356845252ac6b662d5c72c29903813eJake Slack                UrlEncoded.decodeTo(query,overridden_new_query,StringUtil.__UTF8); //have to assume utf8 as we cannot know otherwise
217703928aee4356845252ac6b662d5c72c29903813eJake Slack
217803928aee4356845252ac6b662d5c72c29903813eJake Slack                Iterator<Entry<String, Object>> iter = overridden_old_query.entrySet().iterator();
217903928aee4356845252ac6b662d5c72c29903813eJake Slack                while (iter.hasNext())
218003928aee4356845252ac6b662d5c72c29903813eJake Slack                {
218103928aee4356845252ac6b662d5c72c29903813eJake Slack                    Map.Entry<String, Object> entry = iter.next();
218203928aee4356845252ac6b662d5c72c29903813eJake Slack                    String name = entry.getKey();
218303928aee4356845252ac6b662d5c72c29903813eJake Slack                    if (!overridden_new_query.containsKey(name))
218403928aee4356845252ac6b662d5c72c29903813eJake Slack                    {
218503928aee4356845252ac6b662d5c72c29903813eJake Slack                        Object values = entry.getValue();
218603928aee4356845252ac6b662d5c72c29903813eJake Slack                        for (int i = 0; i < LazyList.size(values); i++)
218703928aee4356845252ac6b662d5c72c29903813eJake Slack                        {
2188806b0b93225bdf4a36d560351642126100e1950eNeil Fuller                            overridden_query_string.append("&").append(name).append("=").append(LazyList.<String>get(values,i));
218903928aee4356845252ac6b662d5c72c29903813eJake Slack                        }
219003928aee4356845252ac6b662d5c72c29903813eJake Slack                    }
219103928aee4356845252ac6b662d5c72c29903813eJake Slack                }
219203928aee4356845252ac6b662d5c72c29903813eJake Slack
219303928aee4356845252ac6b662d5c72c29903813eJake Slack                query = query + overridden_query_string;
219403928aee4356845252ac6b662d5c72c29903813eJake Slack            }
219503928aee4356845252ac6b662d5c72c29903813eJake Slack            else
219603928aee4356845252ac6b662d5c72c29903813eJake Slack            {
219703928aee4356845252ac6b662d5c72c29903813eJake Slack                query = query + "&" + _queryString;
219803928aee4356845252ac6b662d5c72c29903813eJake Slack            }
219903928aee4356845252ac6b662d5c72c29903813eJake Slack        }
220003928aee4356845252ac6b662d5c72c29903813eJake Slack
220103928aee4356845252ac6b662d5c72c29903813eJake Slack        setParameters(parameters);
220203928aee4356845252ac6b662d5c72c29903813eJake Slack        setQueryString(query);
220303928aee4356845252ac6b662d5c72c29903813eJake Slack    }
220403928aee4356845252ac6b662d5c72c29903813eJake Slack}
2205