blob: 6e1133b7e4b92dac25ff3124515efdc0d2e4a183 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.websocket.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
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.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpUpgradeHandler;
import javax.servlet.http.Part;
public class UpgradeHttpServletRequest implements HttpServletRequest
{
private static final String UNSUPPORTED_WITH_WEBSOCKET_UPGRADE = "Feature unsupported with a Upgraded to WebSocket HttpServletRequest";
private HttpServletRequest request;
private final ServletContext context;
private final DispatcherType dispatcher;
private final String method;
private final String protocol;
private final String scheme;
private final boolean secure;
private final String requestURI;
private final StringBuffer requestURL;
private final String pathInfo;
private final String pathTranslated;
private final String servletPath;
private final String query;
private final String authType;
private final Cookie[] cookies;
private final String remoteUser;
private final Principal principal;
private final Map<String, List<String>> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
private final Map<String, String[]> parameters = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
private final Map<String, Object> attributes = new HashMap<>(2);
private final List<Locale> locales = new ArrayList<>(2);
private HttpSession session;
private final InetSocketAddress localAddress;
private final String localName;
private final InetSocketAddress remoteAddress;
private final String remoteName;
private final InetSocketAddress serverAddress;
public UpgradeHttpServletRequest(HttpServletRequest httpRequest)
{
// The original request object must be held temporarily for the duration of the handshake
// in order to be able to implement methods such as isUserInRole() and setAttribute().
request = httpRequest;
context = httpRequest.getServletContext();
dispatcher = httpRequest.getDispatcherType();
method = httpRequest.getMethod();
protocol = httpRequest.getProtocol();
scheme = httpRequest.getScheme();
secure = httpRequest.isSecure();
requestURI = httpRequest.getRequestURI();
requestURL = httpRequest.getRequestURL();
pathInfo = httpRequest.getPathInfo();
pathTranslated = httpRequest.getPathTranslated();
servletPath = httpRequest.getServletPath();
query = httpRequest.getQueryString();
authType = httpRequest.getAuthType();
cookies = request.getCookies();
remoteUser = httpRequest.getRemoteUser();
principal = httpRequest.getUserPrincipal();
Enumeration<String> headerNames = httpRequest.getHeaderNames();
while (headerNames.hasMoreElements())
{
String name = headerNames.nextElement();
headers.put(name, Collections.list(httpRequest.getHeaders(name)));
}
parameters.putAll(request.getParameterMap());
Enumeration<String> attributeNames = httpRequest.getAttributeNames();
while (attributeNames.hasMoreElements())
{
String name = attributeNames.nextElement();
attributes.put(name, httpRequest.getAttribute(name));
}
localAddress = InetSocketAddress.createUnresolved(httpRequest.getLocalAddr(), httpRequest.getLocalPort());
localName = httpRequest.getLocalName();
remoteAddress = InetSocketAddress.createUnresolved(httpRequest.getRemoteAddr(), httpRequest.getRemotePort());
remoteName = httpRequest.getRemoteHost();
serverAddress = InetSocketAddress.createUnresolved(httpRequest.getServerName(), httpRequest.getServerPort());
}
public HttpServletRequest getHttpServletRequest()
{
return request;
}
@Override
public String getAuthType()
{
return authType;
}
@Override
public Cookie[] getCookies()
{
return cookies;
}
@Override
public String getHeader(String name)
{
List<String> values = headers.get(name);
if (values == null || values.isEmpty())
return null;
return values.get(0);
}
@Override
public Enumeration<String> getHeaders(String name)
{
List<String> values = headers.get(name);
if (values == null)
return Collections.emptyEnumeration();
return Collections.enumeration(values);
}
@Override
public Enumeration<String> getHeaderNames()
{
return Collections.enumeration(headers.keySet());
}
public Map<String, List<String>> getHeaders()
{
return Collections.unmodifiableMap(headers);
}
@Override
public long getDateHeader(String name)
{
// TODO
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public int getIntHeader(String name)
{
// TODO
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public String getMethod()
{
return method;
}
@Override
public String getPathInfo()
{
return pathInfo;
}
@Override
public String getPathTranslated()
{
return pathTranslated;
}
@Override
public String getContextPath()
{
return context.getContextPath();
}
@Override
public String getQueryString()
{
return query;
}
@Override
public String getRemoteUser()
{
return remoteUser;
}
@Override
public boolean isUserInRole(String role)
{
HttpServletRequest request = getHttpServletRequest();
if (request != null)
return request.isUserInRole(role);
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public Principal getUserPrincipal()
{
return principal;
}
@Override
public String getRequestURI()
{
return requestURI;
}
@Override
public StringBuffer getRequestURL()
{
return requestURL;
}
@Override
public String getServletPath()
{
return servletPath;
}
@Override
public HttpSession getSession(boolean create)
{
HttpServletRequest request = getHttpServletRequest();
if (request != null)
return session = request.getSession(create);
return session;
}
@Override
public HttpSession getSession()
{
return getSession(true);
}
@Override
public String getRequestedSessionId()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public boolean isRequestedSessionIdValid()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public boolean isRequestedSessionIdFromCookie()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public boolean isRequestedSessionIdFromURL()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public boolean isRequestedSessionIdFromUrl()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public Object getAttribute(String name)
{
return attributes.get(name);
}
@Override
public Enumeration<String> getAttributeNames()
{
return Collections.enumeration(attributes.keySet());
}
public Map<String, Object> getAttributes()
{
return Collections.unmodifiableMap(attributes);
}
@Override
public String getParameter(String name)
{
String[] values = parameters.get(name);
if (values == null || values.length == 0)
return null;
return values[0];
}
@Override
public Enumeration<String> getParameterNames()
{
return Collections.enumeration(parameters.keySet());
}
@Override
public String[] getParameterValues(String name)
{
return parameters.get(name);
}
@Override
public Map<String, String[]> getParameterMap()
{
return parameters;
}
@Override
public String getProtocol()
{
return protocol;
}
@Override
public String getScheme()
{
return scheme;
}
@Override
public String getServerName()
{
return serverAddress.getHostString();
}
@Override
public int getServerPort()
{
return serverAddress.getPort();
}
@Override
public String getRemoteAddr()
{
return remoteAddress.getHostString();
}
@Override
public int getRemotePort()
{
return remoteAddress.getPort();
}
@Override
public String getRemoteHost()
{
return remoteName;
}
@Override
public void setAttribute(String name, Object value)
{
HttpServletRequest request = getHttpServletRequest();
if (request != null)
request.setAttribute(name, value);
attributes.put(name, value);
}
@Override
public void removeAttribute(String name)
{
HttpServletRequest request = getHttpServletRequest();
if (request != null)
request.removeAttribute(name);
attributes.remove(name);
}
@Override
public Locale getLocale()
{
if (locales.isEmpty())
return Locale.getDefault();
return locales.get(0);
}
@Override
public Enumeration<Locale> getLocales()
{
return Collections.enumeration(locales);
}
@Override
public boolean isSecure()
{
return secure;
}
@Override
public String getRealPath(String path)
{
return context.getRealPath(path);
}
@Override
public String getLocalName()
{
return localName;
}
@Override
public String getLocalAddr()
{
return localAddress.getHostString();
}
@Override
public int getLocalPort()
{
return localAddress.getPort();
}
@Override
public ServletContext getServletContext()
{
return context;
}
@Override
public DispatcherType getDispatcherType()
{
return dispatcher;
}
@Override
public boolean authenticate(HttpServletResponse response) throws IOException, ServletException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public String changeSessionId()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public AsyncContext getAsyncContext()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public String getCharacterEncoding()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public int getContentLength()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public long getContentLengthLong()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public String getContentType()
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public ServletInputStream getInputStream() throws IOException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public Part getPart(String name) throws IOException, ServletException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public Collection<Part> getParts() throws IOException, ServletException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public BufferedReader getReader() throws IOException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public RequestDispatcher getRequestDispatcher(String path)
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public boolean isAsyncStarted()
{
return false;
}
@Override
public boolean isAsyncSupported()
{
return false;
}
@Override
public void login(String username, String password) throws ServletException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public void logout() throws ServletException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public void setCharacterEncoding(String enc) throws UnsupportedEncodingException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public AsyncContext startAsync() throws IllegalStateException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
@Override
public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException
{
throw new UnsupportedOperationException(UNSUPPORTED_WITH_WEBSOCKET_UPGRADE);
}
public void complete()
{
request = null;
}
}