/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.server.http; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Collection; import java.util.Enumeration; import java.util.Locale; import java.util.Map; import javax.servlet.AsyncContext; import javax.servlet.DispatcherType; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletRequestWrapper; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.http.Part; import com.caucho.server.webapp.WebApp; import com.caucho.util.CharBuffer; import com.caucho.vfs.ReadStream; public class CauchoRequestWrapper extends AbstractCauchoRequest { // the wrapped request private HttpServletRequest _request; private CauchoResponse _response; // // ServletRequest // public CauchoRequestWrapper() { } public CauchoRequestWrapper(HttpServletRequest request) { if (request == null) throw new IllegalArgumentException(); _request = request; } public void setRequest(HttpServletRequest request) { if (request == null || request == this) throw new IllegalArgumentException(); _request = request; } @Override public HttpServletRequest getRequest() { return _request; } public void setResponse(CauchoResponse response) { _response = response; } @Override public CauchoResponse getResponse() { return _response; } @Override public String getProtocol() { return _request.getProtocol(); } @Override public String getScheme() { return _request.getScheme(); } @Override public String getServerName() { return _request.getServerName(); } @Override public int getServerPort() { return _request.getServerPort(); } @Override public String getRemoteAddr() { return _request.getRemoteAddr(); } @Override public String getRemoteHost() { return _request.getRemoteHost(); } @Override public int getRemotePort() { return _request.getRemotePort(); } @Override public String getLocalAddr() { return _request.getLocalAddr(); } @Override public String getLocalName() { return _request.getLocalName(); } @Override public int getLocalPort() { return _request.getLocalPort(); } @Override public String getParameter(String name) { return _request.getParameter(name); } @Override public Map<String,String[]> getParameterMap() { return _request.getParameterMap(); } @Override public String []getParameterValues(String name) { return _request.getParameterValues(name); } @Override public Enumeration<String> getParameterNames() { return _request.getParameterNames(); } @Override public ServletInputStream getInputStream() throws IOException { return _request.getInputStream(); } @Override public BufferedReader getReader() throws IOException, IllegalStateException { return _request.getReader(); } @Override public String getCharacterEncoding() { return _request.getCharacterEncoding(); } @Override public void setCharacterEncoding(String encoding) throws UnsupportedEncodingException { _request.setCharacterEncoding(encoding); } @Override public int getContentLength() { return _request.getContentLength(); } @Override public String getContentType() { return _request.getContentType(); } @Override public Locale getLocale() { return _request.getLocale(); } @Override public Enumeration<Locale> getLocales() { return _request.getLocales(); } @Override public boolean isSecure() { return _request.isSecure(); } @Override public Object getAttribute(String name) { return _request.getAttribute(name); } @Override public void setAttribute(String name, Object o) { _request.setAttribute(name, o); } @Override public Enumeration<String> getAttributeNames() { return _request.getAttributeNames(); } @Override public void removeAttribute(String name) { _request.removeAttribute(name); } @Override public RequestDispatcher getRequestDispatcher(String path) { if (path == null || path.length() == 0) return null; else if (path.charAt(0) == '/') return getWebApp().getRequestDispatcher(path); else { CharBuffer cb = new CharBuffer(); WebApp webApp = getWebApp(); String servletPath = getPageServletPath(); if (servletPath != null) cb.append(servletPath); String pathInfo = getPagePathInfo(); if (pathInfo != null) cb.append(pathInfo); int p = cb.lastIndexOf('/'); if (p >= 0) cb.setLength(p); cb.append('/'); cb.append(path); if (webApp != null) return webApp.getRequestDispatcher(cb.toString()); return null; } } /* public String getRealPath(String uri) { return _request.getRealPath(uri); } */ @Override public ServletContext getServletContext() { return getWebApp(); } @Override public AsyncContext startAsync() throws IllegalStateException { return _request.startAsync(); } @Override public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { return _request.startAsync(servletRequest, servletResponse); } @Override public AsyncContext getAsyncContext() { return _request.getAsyncContext(); } @Override public boolean isAsyncStarted() { return _request.isAsyncStarted(); } @Override public boolean isAsyncSupported() { return _request.isAsyncSupported(); } public boolean isWrapperFor(ServletRequest wrapped) { return _request == wrapped; } public boolean isWrapperFor(Class<?> wrappedType) { return wrappedType.isAssignableFrom(_request.getClass()); } @Override public DispatcherType getDispatcherType() { return _request.getDispatcherType(); } // // HttpServletRequest // @Override public String getMethod() { return _request.getMethod(); } @Override public String getRequestURI() { return _request.getRequestURI(); } /** * Returns the URL for the request */ @Override public StringBuffer getRequestURL() { StringBuffer sb = new StringBuffer(); sb.append(getScheme()); sb.append("://"); sb.append(getServerName()); int port = getServerPort(); if (port > 0 && port != 80 && port != 443) { sb.append(":"); sb.append(port); } sb.append(getRequestURI()); return sb; } @Override public String getContextPath() { return _request.getContextPath(); } @Override public String getServletPath() { return _request.getServletPath(); } @Override public String getPathInfo() { return _request.getPathInfo(); } /** * Returns the real path of pathInfo. */ @Override public String getPathTranslated() { // server/106w String pathInfo = getPathInfo(); if (pathInfo == null) return null; else return getRealPath(pathInfo); } @Override public String getQueryString() { return _request.getQueryString(); } @Override public String getHeader(String name) { return _request.getHeader(name); } @Override public Enumeration<String> getHeaders(String name) { return _request.getHeaders(name); } @Override public Enumeration<String> getHeaderNames() { return _request.getHeaderNames(); } @Override public int getIntHeader(String name) { return _request.getIntHeader(name); } @Override public long getDateHeader(String name) { return _request.getDateHeader(name); } @Override public Cookie []getCookies() { return _request.getCookies(); } @Override public String getRequestedSessionId() { return _request.getRequestedSessionId(); } @Override public boolean isRequestedSessionIdValid() { return _request.isRequestedSessionIdValid(); } @Override public boolean isRequestedSessionIdFromCookie() { return _request.isRequestedSessionIdFromCookie(); } public boolean isRequestedSessionIdFromURL() { return _request.isRequestedSessionIdFromURL(); } @Override public void setSessionId(String sessionId) { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) cRequest.setSessionId(sessionId); } @Override public String getSessionId() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getSessionId(); else return null; } @Override public boolean isSessionIdFromCookie() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.isSessionIdFromCookie(); else return ! _request.isRequestedSessionIdFromURL(); } @Override public String getAuthType() { return _request.getAuthType(); } @Override public String getRemoteUser() { return _request.getRemoteUser(); } /* public Principal getUserPrincipal() { return _request.getUserPrincipal(); } */ @Override @SuppressWarnings("deprecation") public boolean isRequestedSessionIdFromUrl() { return _request.isRequestedSessionIdFromUrl(); } /* public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { return _request.authenticate(response); } */ @Override public Part getPart(String name) throws IOException, ServletException { return _request.getPart(name); } @Override public Collection<Part> getParts() throws IOException, ServletException { return _request.getParts(); } /* public void login(String username, String password) throws ServletException { _request.login(username, password); } */ @Override public void logout() throws ServletException { _request.logout(); } // // CauchoRequest // @Override public String getPageURI() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getPageURI(); else return _request.getRequestURI(); } @Override public String getPageContextPath() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getPageContextPath(); else return _request.getContextPath(); } @Override public String getPageServletPath() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getPageServletPath(); else return _request.getServletPath(); } @Override public String getPagePathInfo() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getPagePathInfo(); else return _request.getPathInfo(); } @Override public String getPageQueryString() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getPageQueryString(); else return _request.getQueryString(); } @Override public WebApp getWebApp() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getWebApp(); else return (WebApp) _request.getServletContext(); } @Override public ReadStream getStream() throws IOException { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getStream(); else throw new UnsupportedOperationException(getClass().getName()); } @Override public int getRequestDepth(int depth) { if (_request instanceof CauchoRequest) { CauchoRequest cRequest = (CauchoRequest) _request; return cRequest.getRequestDepth(depth + 1); } else return 0; } @Override public void setHeader(String key, String value) { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) cRequest.setHeader(key, value); } @Override public boolean isSyntheticCacheHeader() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.isSyntheticCacheHeader(); else return false; } @Override public void setSyntheticCacheHeader(boolean isSynthetic) { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) cRequest.setSyntheticCacheHeader(isSynthetic); } @Override public boolean getVaryCookies() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getVaryCookies(); else return false; } @Override public void setVaryCookie(String cookie) { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) cRequest.setVaryCookie(cookie); } @Override public boolean getHasCookie() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getHasCookie(); else return false; } @Override public boolean isTop() { return false; } @Override public boolean hasRequest() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.hasRequest(); else return false; } @Override public HttpSession getMemorySession() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getMemorySession(); else throw new UnsupportedOperationException(getClass().getName()); } @Override public Cookie getCookie(String name) { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getCookie(name); else throw new UnsupportedOperationException(getClass().getName()); } @Override public void setHasCookie() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) cRequest.setHasCookie(); } @Override public void killKeepalive(String reason) { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) cRequest.killKeepalive(reason); } @Override public boolean isSuspend() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.isSuspend(); else return false; } @Override public boolean isComet() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.isComet(); else return false; } @Override public boolean isDuplex() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.isDuplex(); else return false; } @Override public boolean isConnectionClosed() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.isConnectionClosed(); else return false; } @Override public boolean isLoginRequested() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.isLoginRequested(); else return false; } @Override public void requestLogin() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) cRequest.requestLogin(); } /* public boolean login(boolean isFail) { CauchoRequest cRequest = (CauchoRequest) _request; return cRequest.login(isFail); } */ @Override public ServletResponse getServletResponse() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getServletResponse(); else throw new UnsupportedOperationException(getClass().getName()); } @Override public AbstractHttpRequest getAbstractHttpRequest() { CauchoRequest cRequest = getCauchoRequest(); if (cRequest != null) return cRequest.getAbstractHttpRequest(); else throw new UnsupportedOperationException(getClass().getName()); } private CauchoRequest getCauchoRequest() { ServletRequest request = _request; while (request instanceof ServletRequestWrapper) { if (request instanceof CauchoRequest) return (CauchoRequest) request; request = ((ServletRequestWrapper) request).getRequest(); } if (request instanceof CauchoRequest) return (CauchoRequest) request; return null; } @Override public String toString() { return getClass().getSimpleName() + "[" + getPageURI() + "," + _request + "]"; } }