All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.lightbody.bmp.proxy.jetty.jetty.servlet.ServletHttpRequest Maven / Gradle / Ivy

// ========================================================================
// $Id: ServletHttpRequest.java,v 1.65 2005/08/13 00:01:27 gregwilkins Exp $
// Copyright 200-2004 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at 
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================


package net.lightbody.bmp.proxy.jetty.jetty.servlet;

import net.lightbody.bmp.proxy.jetty.http.HttpConnection;
import net.lightbody.bmp.proxy.jetty.http.HttpFields;
import net.lightbody.bmp.proxy.jetty.http.HttpInputStream;
import net.lightbody.bmp.proxy.jetty.http.HttpRequest;
import net.lightbody.bmp.proxy.jetty.http.SecurityConstraint;
import net.lightbody.bmp.proxy.jetty.util.LazyList;
import net.lightbody.bmp.proxy.jetty.util.LogSupport;
import net.lightbody.bmp.proxy.jetty.util.Resource;
import net.lightbody.bmp.proxy.jetty.util.StringUtil;
import net.lightbody.bmp.proxy.jetty.util.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestWrapper;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.Map;

/**
 * Servlet Request Wrapper.
 * This class wraps a Jetty HTTP request as a 2.2 Servlet request.
 * 

* Note that this wrapper is not synchronized and if a request is to be operated on by multiple threads, * then higher level synchronizations may be required. * * @author Greg Wilkins (gregw) * @version $Id: ServletHttpRequest.java,v 1.65 2005/08/13 00:01:27 gregwilkins Exp $ */ public class ServletHttpRequest implements HttpServletRequest { public static final String __SESSIONID_NOT_CHECKED = "not checked", __SESSIONID_URL = "url", __SESSIONID_COOKIE = "cookie", __SESSIONID_NONE = "none"; private static final Enumeration __emptyEnum = Collections.enumeration(Collections.EMPTY_LIST); private static final Collection __defaultLocale = Collections.singleton(Locale.getDefault()); private final Logger log = LoggerFactory.getLogger(ServletHttpRequest.class); private final HttpRequest _httpRequest; private ServletHandler _servletHandler; private ServletHttpResponse _servletHttpResponse; private String _contextPath = null; private String _servletPath = null; private String _pathInfo = null; private String _query = null; private String _pathTranslated = null; private String _requestedSessionId = null; private HttpSession _session = null; private String _sessionIdState = __SESSIONID_NOT_CHECKED; private ServletIn _in = null; private BufferedReader _reader = null; private int _inputState = 0; private ServletHolder _servletHolder; private String _pathInContext; /** * Constructor. */ public ServletHttpRequest(ServletHandler servletHandler, String pathInContext, HttpRequest request) { _servletHandler = servletHandler; _pathInContext = pathInContext; _contextPath = _servletHandler.getHttpContext().getContextPath(); if (_contextPath.length() <= 1) { _contextPath = ""; } _httpRequest = request; } /** * Unwrap a ServletRequest. * * @param request * @return The core ServletHttpRequest which must be the underlying request object * @see javax.servlet.ServletRequestWrapper * @see javax.servlet.http.HttpServletRequestWrapper */ public static ServletHttpRequest unwrap(ServletRequest request) { while (!(request instanceof ServletHttpRequest)) { if (request instanceof ServletRequestWrapper) { ServletRequestWrapper wrapper = (ServletRequestWrapper) request; request = wrapper.getRequest(); } else { throw new IllegalArgumentException("Does not wrap ServletHttpRequest"); } } return (ServletHttpRequest) request; } void recycle(ServletHandler servletHandler, String pathInContext) { _servletHandler = servletHandler; _pathInContext = pathInContext; _servletPath = null; _pathInfo = null; _query = null; _pathTranslated = null; _requestedSessionId = null; _session = null; _sessionIdState = __SESSIONID_NOT_CHECKED; _in = null; _reader = null; _inputState = 0; _servletHolder = null; if (servletHandler != null) { _contextPath = _servletHandler.getHttpContext().getContextPath(); } if (_contextPath != null && _contextPath.length() <= 1) { _contextPath = ""; } } ServletHandler getServletHandler() { return _servletHandler; } void setServletHandler(ServletHandler servletHandler) { _servletHandler = servletHandler; } /** * Set servletpath and pathInfo. Called by the Handler before passing a request to a particular holder * to split the context path into a servlet path and path info. * * @param servletPath * @param pathInfo */ void setServletPaths(String servletPath, String pathInfo, ServletHolder holder) { _servletPath = servletPath; _pathInfo = pathInfo; _servletHolder = holder; } ServletHolder getServletHolder() { return _servletHolder; } String getPathInContext() { return _pathInContext; } HttpRequest getHttpRequest() { return _httpRequest; } public ServletHttpResponse getServletHttpResponse() { return _servletHttpResponse; } void setServletHttpResponse(ServletHttpResponse response) { _servletHttpResponse = response; } public Locale getLocale() { Enumeration enm = _httpRequest.getFieldValues(HttpFields.__AcceptLanguage, HttpFields.__separators); // handle no locale if (enm == null || !enm.hasMoreElements()) { return Locale.getDefault(); } // sort the list in quality order List acceptLanguage = HttpFields.qualityList(enm); if (acceptLanguage.size() == 0) { return Locale.getDefault(); } int size = acceptLanguage.size(); // convert to locals for (int i = 0; i < size; i++) { String language = (String) acceptLanguage.get(i); language = HttpFields.valueParameters(language, null); String country = ""; int dash = language.indexOf('-'); if (dash > -1) { country = language.substring(dash + 1).trim(); language = language.substring(0, dash).trim(); } return new Locale(language, country); } return Locale.getDefault(); } public Enumeration getLocales() { Enumeration enm = _httpRequest.getFieldValues(HttpFields.__AcceptLanguage, HttpFields.__separators); // handle no locale if (enm == null || !enm.hasMoreElements()) { return Collections.enumeration(__defaultLocale); } // sort the list in quality order List acceptLanguage = HttpFields.qualityList(enm); if (acceptLanguage.size() == 0) { return Collections.enumeration(__defaultLocale); } Object langs = null; int size = acceptLanguage.size(); // convert to locals for (int i = 0; i < size; i++) { String language = (String) acceptLanguage.get(i); language = HttpFields.valueParameters(language, null); String country = ""; int dash = language.indexOf('-'); if (dash > -1) { country = language.substring(dash + 1).trim(); language = language.substring(0, dash).trim(); } langs = LazyList.ensureSize(langs, size); langs = LazyList.add(langs, new Locale(language, country)); } if (LazyList.size(langs) == 0) { return Collections.enumeration(__defaultLocale); } return Collections.enumeration(LazyList.getList(langs)); } public boolean isSecure() { return _httpRequest.isConfidential(); } public Cookie[] getCookies() { Cookie[] cookies = _httpRequest.getCookies(); if (cookies.length == 0) { return null; } return cookies; } public long getDateHeader(String name) { return _httpRequest.getDateField(name); } public Enumeration getHeaderNames() { return _httpRequest.getFieldNames(); } public String getHeader(String name) { return _httpRequest.getField(name); } public Enumeration getHeaders(String s) { Enumeration enm = _httpRequest.getFieldValues(s); if (enm == null) { return __emptyEnum; } return enm; } public int getIntHeader(String name) throws NumberFormatException { return _httpRequest.getIntField(name); } public String getMethod() { return _httpRequest.getMethod(); } public String getContextPath() { return _contextPath; } public String getPathInfo() { if (_servletPath == null) { return null; } return _pathInfo; } public String getPathTranslated() { if (_pathInfo == null || _pathInfo.length() == 0) { return null; } if (_pathTranslated == null) { Resource resource = _servletHandler.getHttpContext().getBaseResource(); if (resource == null) { return null; } try { resource = resource.addPath(_pathInfo); File file = resource.getFile(); if (file == null) { return null; } _pathTranslated = file.getAbsolutePath(); } catch (Exception e) { log.debug(LogSupport.EXCEPTION, e); } } return _pathTranslated; } public String getQueryString() { if (_query == null) { _query = _httpRequest.getQuery(); } return _query; } public String getAuthType() { String at = _httpRequest.getAuthType(); if (at.equals(SecurityConstraint.__BASIC_AUTH)) { return HttpServletRequest.BASIC_AUTH; } if (at.equals(SecurityConstraint.__FORM_AUTH)) { return HttpServletRequest.FORM_AUTH; } if (at.equals(SecurityConstraint.__DIGEST_AUTH)) { return HttpServletRequest.DIGEST_AUTH; } if (at.equals(SecurityConstraint.__CERT_AUTH)) { return HttpServletRequest.CLIENT_CERT_AUTH; } if (at.equals(SecurityConstraint.__CERT_AUTH2)) { return HttpServletRequest.CLIENT_CERT_AUTH; } return at; } public String getRemoteUser() { return _httpRequest.getAuthUser(); } public boolean isUserInRole(String role) { if (_servletHolder != null) { role = _servletHolder.getUserRoleLink(role); } return _httpRequest.isUserInRole(role); } public Principal getUserPrincipal() { return _httpRequest.getUserPrincipal(); } public String getRequestedSessionId() { return _requestedSessionId; } void setRequestedSessionId(String pathParams) { _requestedSessionId = null; // try cookies first if (_servletHandler.isUsingCookies()) { Cookie[] cookies = _httpRequest.getCookies(); if (cookies != null && cookies.length > 0) { for (int i = 0; i < cookies.length; i++) { if (SessionManager.__SessionCookie.equalsIgnoreCase(cookies[i].getName())) { if (_requestedSessionId != null) { // Multiple jsessionid cookies. Probably due to // multiple paths and/or domains. Pick the first // known session or the last defined cookie. SessionManager manager = _servletHandler.getSessionManager(); if (manager != null && manager.getHttpSession(_requestedSessionId) != null) { break; } log.debug("multiple session cookies"); } _requestedSessionId = cookies[i].getValue(); _sessionIdState = __SESSIONID_COOKIE; log.debug("Got Session {} from cookie", _requestedSessionId); } } } } // check if there is a url encoded session param. if (pathParams != null && pathParams.startsWith(SessionManager.__SessionURL)) { String id = pathParams.substring(SessionManager.__SessionURL.length() + 1); log.debug("Got Session {} from URL", id); if (_requestedSessionId == null) { _requestedSessionId = id; _sessionIdState = __SESSIONID_URL; } else { if (!id.equals(_requestedSessionId)) log.debug("Mismatched session IDs"); } } if (_requestedSessionId == null) { _sessionIdState = __SESSIONID_NONE; } } public String getRequestURI() { return _httpRequest.getEncodedPath(); } public StringBuffer getRequestURL() { StringBuffer buf = _httpRequest.getRootURL(); buf.append(getRequestURI()); return buf; } public String getServletPath() { if (_servletPath == null) { return _pathInContext; } return _servletPath; } public HttpSession getSession(boolean create) { if (_session != null && ((SessionManager.Session) _session).isValid()) { return _session; } _session = null; String id = getRequestedSessionId(); if (id != null) { _session = _servletHandler.getHttpSession(id); if (_session == null && !create) { return null; } } if (_session == null && create) { _session = newSession(); } return _session; } /** * Create a new HttpSession. If cookies are being used a set cookie is added to the response. */ HttpSession newSession() { HttpSession session = _servletHandler.newHttpSession(this); Cookie cookie = _servletHandler.getSessionManager().getSessionCookie(session, isSecure()); if (cookie != null) { _servletHttpResponse.getHttpResponse().addSetCookie(cookie); } return session; } public HttpSession getSession() { HttpSession session = getSession(true); return session; } public boolean isRequestedSessionIdValid() { return _requestedSessionId != null && getSession(false) != null; } public boolean isRequestedSessionIdFromCookie() { return _sessionIdState.equals(__SESSIONID_COOKIE); } public boolean isRequestedSessionIdFromURL() { return _sessionIdState.equals(__SESSIONID_URL); } /** * @deprecated */ public boolean isRequestedSessionIdFromUrl() { return isRequestedSessionIdFromURL(); } public Enumeration getAttributeNames() { return _httpRequest.getAttributeNames(); } public Object getAttribute(String name) { return _httpRequest.getAttribute(name); } public void setAttribute(String name, Object value) { _httpRequest.setAttribute(name, value); } public void removeAttribute(String name) { _httpRequest.removeAttribute(name); } public String getCharacterEncoding() { return _httpRequest.getCharacterEncoding(); } public void setCharacterEncoding(String encoding) throws UnsupportedEncodingException { if (_inputState != 0) { throw new IllegalStateException("getReader() or getInputStream() called"); } "".getBytes(encoding); _httpRequest.setCharacterEncoding(encoding, false); } public int getContentLength() { return _httpRequest.getContentLength(); } public String getContentType() { return _httpRequest.getContentType(); } public ServletInputStream getInputStream() { if (_inputState != 0 && _inputState != 1) { throw new IllegalStateException(); } if (_in == null) { _in = new ServletIn((HttpInputStream) _httpRequest.getInputStream()); } _inputState = 1; _reader = null; return _in; } /** * This method is not recommended as it forces the generation of a non-optimal data structure. */ public Map getParameterMap() { return Collections.unmodifiableMap(_httpRequest.getParameterStringArrayMap()); } public String getParameter(String name) { return _httpRequest.getParameter(name); } public Enumeration getParameterNames() { return Collections.enumeration(_httpRequest.getParameterNames()); } public String[] getParameterValues(String name) { List v = _httpRequest.getParameterValues(name); if (v == null) { return null; } String[] a = new String[v.size()]; return (String[]) v.toArray(a); } public String getProtocol() { return _httpRequest.getVersion(); } public String getScheme() { return _httpRequest.getScheme(); } public String getServerName() { return _httpRequest.getHost(); } public int getServerPort() { int port = _httpRequest.getPort(); if (port == 0) { if (getScheme().equalsIgnoreCase("https")) { return 443; } return 80; } return port; } public int getRemotePort() { HttpConnection connection = _httpRequest.getHttpConnection(); if (connection != null) { return connection.getRemotePort(); } return 0; } public String getLocalName() { HttpConnection connection = _httpRequest.getHttpConnection(); if (connection != null) { return connection.getServerName(); } return null; } public String getLocalAddr() { HttpConnection connection = _httpRequest.getHttpConnection(); if (connection != null) { return connection.getServerAddr(); } return null; } public int getLocalPort() { HttpConnection connection = _httpRequest.getHttpConnection(); if (connection != null) { return connection.getServerPort(); } return 0; } public BufferedReader getReader() throws UnsupportedEncodingException { if (_inputState != 0 && _inputState != 2) { throw new IllegalStateException(); } if (_reader == null) { String encoding = getCharacterEncoding(); if (encoding == null) { encoding = StringUtil.__ISO_8859_1; } _reader = new BufferedReader(new InputStreamReader(getInputStream(), encoding)); } _inputState = 2; return _reader; } public String getRemoteAddr() { return _httpRequest.getRemoteAddr(); } public String getRemoteHost() { if (_httpRequest.getHttpConnection() == null) { return null; } return _httpRequest.getRemoteHost(); } /** * @deprecated As of Version 2.1 of the Java Servlet API, * use {@link javax.servlet.ServletContext#getRealPath} instead. */ public String getRealPath(String path) { return _servletHandler.getServletContext().getRealPath(path); } public RequestDispatcher getRequestDispatcher(String url) { if (url == null) { return null; } if (!url.startsWith("/")) { String relTo = URI.addPaths(_servletPath, _pathInfo); int slash = relTo.lastIndexOf("/"); if (slash > 1) { relTo = relTo.substring(0, slash + 1); } else { relTo = "/"; } url = URI.addPaths(relTo, url); } return _servletHandler.getServletContext().getRequestDispatcher(url); } public String toString() { return getContextPath() + "+" + getServletPath() + "+" + getPathInfo() + "\n" + _httpRequest.toString(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy