| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 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; |
| } |
| } |