Author: markt
Date: Wed Jun 27 12:46:05 2012
New Revision: 1354469

URL: http://svn.apache.org/viewvc?rev=1354469&view=rev
Log:
Make the request available when the WebSocket connection is being created

Added:
    
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
   (with props)
Modified:
    tomcat/trunk/java/org/apache/catalina/websocket/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java
    tomcat/trunk/test/org/apache/catalina/websocket/TestWebSocket.java
    
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/chat/ChatWebSocketServlet.java
    
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoMessage.java
    tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoStream.java
    
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/snake/SnakeWebSocketServlet.java

Modified: 
tomcat/trunk/java/org/apache/catalina/websocket/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/LocalStrings.properties?rev=1354469&r1=1354468&r2=1354469&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/websocket/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/websocket/LocalStrings.properties Wed 
Jun 27 12:46:05 2012
@@ -26,4 +26,6 @@ message.bufferTooSmall=The buffer is not
 
 servlet.reqUpgradeFail=Unable to cast to the Tomcat internal request class in 
order to complete HTTP upgrade
 
-outbound.closed=The WebSocket connection has been closed
\ No newline at end of file
+outbound.closed=The WebSocket connection has been closed
+
+wrapper.invalid=An attempt was made to access the request object passed to 
WebSocketServlet.createWebSocketInbound() outside of that method
\ No newline at end of file

Modified: tomcat/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java?rev=1354469&r1=1354468&r2=1354469&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/websocket/WebSocketServlet.java Wed 
Jun 27 12:46:05 2012
@@ -117,7 +117,9 @@ public abstract class WebSocketServlet e
             // TODO
         }
 
-        StreamInbound inbound = createWebSocketInbound(subProtocol);
+        WsHttpServletRequestWrapper wrapper = new 
WsHttpServletRequestWrapper(req);
+        StreamInbound inbound = createWebSocketInbound(subProtocol, wrapper);
+        wrapper.invalidate();
 
         // Small hack until the Servlet API provides a way to do this.
         ServletRequest inner = req;
@@ -234,6 +236,13 @@ public abstract class WebSocketServlet e
      *
      * @param subProtocol   The sub-protocol agreed between the client and
      *                      server or <code>null</code> if none was agreed
+     * @param request       The HTTP request that initiated this WebSocket
+     *                      connection. Note that this object is <b>only</b>
+     *                      valid inside this method. You must not retain a
+     *                      reference to it outside the execution of this
+     *                      method. If Tomcat detects such access, it will 
throw
+     *                      an IllegalStateException
      */
-    protected abstract StreamInbound createWebSocketInbound(String 
subProtocol);
+    protected abstract StreamInbound createWebSocketInbound(String subProtocol,
+            HttpServletRequest request);
 }

Added: 
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java?rev=1354469&view=auto
==============================================================================
--- 
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
 (added)
+++ 
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
 Wed Jun 27 12:46:05 2012
@@ -0,0 +1,415 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.catalina.websocket;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+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.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.Part;
+import javax.servlet.http.ProtocolHandler;
+
+import org.apache.tomcat.util.res.StringManager;
+
+/**
+ * Wrapper for the HttpServletRequest object that allows the underlying request
+ * object to be invalidated.
+ */
+public class WsHttpServletRequestWrapper implements HttpServletRequest {
+
+    private static final StringManager sm =
+            StringManager.getManager(Constants.Package);
+
+    private HttpServletRequest request;
+
+    public WsHttpServletRequestWrapper(HttpServletRequest request) {
+        this.request = request;
+    }
+
+    private HttpServletRequest getRequest() {
+        if (request == null) {
+            throw new IllegalStateException(sm.getString("wrapper.invalid"));
+        }
+        return request;
+    }
+
+    protected void invalidate() {
+        request = null;
+    }
+
+    @Override
+    public Object getAttribute(String name) {
+        return getRequest().getAttribute(name);
+    }
+
+    @Override
+    public Enumeration<String> getAttributeNames() {
+        return getRequest().getAttributeNames();
+    }
+
+    @Override
+    public String getCharacterEncoding() {
+        return getRequest().getCharacterEncoding();
+    }
+
+    @Override
+    public void setCharacterEncoding(String env)
+            throws UnsupportedEncodingException {
+        getRequest().setCharacterEncoding(env);
+    }
+
+    @Override
+    public int getContentLength() {
+        return getRequest().getContentLength();
+    }
+
+    @Override
+    public long getContentLengthLong() {
+        return getRequest().getContentLengthLong();
+    }
+
+    @Override
+    public String getContentType() {
+        return getRequest().getContentType();
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        return getRequest().getInputStream();
+    }
+
+    @Override
+    public String getParameter(String name) {
+        return getRequest().getParameter(name);
+    }
+
+    @Override
+    public Enumeration<String> getParameterNames() {
+        return getRequest().getParameterNames();
+    }
+
+    @Override
+    public String[] getParameterValues(String name) {
+        return getRequest().getParameterValues(name);
+    }
+
+    @Override
+    public Map<String, String[]> getParameterMap() {
+        return getRequest().getParameterMap();
+    }
+
+    @Override
+    public String getProtocol() {
+        return getRequest().getProtocol();
+    }
+
+    @Override
+    public String getScheme() {
+        return getRequest().getScheme();
+    }
+
+    @Override
+    public String getServerName() {
+        return getRequest().getServerName();
+    }
+
+    @Override
+    public int getServerPort() {
+        return getRequest().getServerPort();
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return getRequest().getReader();
+    }
+
+    @Override
+    public String getRemoteAddr() {
+        return getRequest().getRemoteAddr();
+    }
+
+    @Override
+    public String getRemoteHost() {
+        return getRequest().getRemoteHost();
+    }
+
+    @Override
+    public void setAttribute(String name, Object o) {
+        getRequest().setAttribute(name, o);
+    }
+
+    @Override
+    public void removeAttribute(String name) {
+        getRequest().removeAttribute(name);
+    }
+
+    @Override
+    public Locale getLocale() {
+        return getRequest().getLocale();
+    }
+
+    @Override
+    public Enumeration<Locale> getLocales() {
+        return getRequest().getLocales();
+    }
+
+    @Override
+    public boolean isSecure() {
+        return getRequest().isSecure();
+    }
+
+    @Override
+    public RequestDispatcher getRequestDispatcher(String path) {
+        return getRequest().getRequestDispatcher(path);
+    }
+
+    @Override
+    @Deprecated
+    public String getRealPath(String path) {
+        return getRequest().getRealPath(path);
+    }
+
+    @Override
+    public int getRemotePort() {
+        return getRequest().getRemotePort();
+    }
+
+    @Override
+    public String getLocalName() {
+        return getRequest().getLocalName();
+    }
+
+    @Override
+    public String getLocalAddr() {
+        return getRequest().getLocalAddr();
+    }
+
+    @Override
+    public int getLocalPort() {
+        return getRequest().getLocalPort();
+    }
+
+    @Override
+    public ServletContext getServletContext() {
+        return getRequest().getServletContext();
+    }
+
+    @Override
+    public AsyncContext startAsync() throws IllegalStateException {
+        return getRequest().startAsync();
+    }
+
+    @Override
+    public AsyncContext startAsync(ServletRequest servletRequest,
+            ServletResponse servletResponse) throws IllegalStateException {
+        return getRequest().startAsync(servletRequest, servletResponse);
+    }
+
+    @Override
+    public boolean isAsyncStarted() {
+        return getRequest().isAsyncStarted();
+    }
+
+    @Override
+    public boolean isAsyncSupported() {
+        return getRequest().isAsyncSupported();
+    }
+
+    @Override
+    public AsyncContext getAsyncContext() {
+        return getRequest().getAsyncContext();
+    }
+
+    @Override
+    public DispatcherType getDispatcherType() {
+        return getRequest().getDispatcherType();
+    }
+
+    @Override
+    public String getAuthType() {
+        return getRequest().getAuthType();
+    }
+
+    @Override
+    public Cookie[] getCookies() {
+        return getRequest().getCookies();
+    }
+
+    @Override
+    public long getDateHeader(String name) {
+        return getRequest().getDateHeader(name);
+    }
+
+    @Override
+    public String getHeader(String name) {
+        return getRequest().getHeader(name);
+    }
+
+    @Override
+    public Enumeration<String> getHeaders(String name) {
+        return getRequest().getHeaders(name);
+    }
+
+    @Override
+    public Enumeration<String> getHeaderNames() {
+        return getRequest().getHeaderNames();
+    }
+
+    @Override
+    public int getIntHeader(String name) {
+        return getRequest().getIntHeader(name);
+    }
+
+    @Override
+    public String getMethod() {
+        return getRequest().getMethod();
+    }
+
+    @Override
+    public String getPathInfo() {
+        return getRequest().getPathInfo();
+    }
+
+    @Override
+    public String getPathTranslated() {
+        return getRequest().getPathTranslated();
+    }
+
+    @Override
+    public String getContextPath() {
+        return getRequest().getContextPath();
+    }
+
+    @Override
+    public String getQueryString() {
+        return getRequest().getQueryString();
+    }
+
+    @Override
+    public String getRemoteUser() {
+        return getRequest().getRemoteUser();
+    }
+
+    @Override
+    public boolean isUserInRole(String role) {
+        return getRequest().isUserInRole(role);
+    }
+
+    @Override
+    public Principal getUserPrincipal() {
+        return getRequest().getUserPrincipal();
+    }
+
+    @Override
+    public String getRequestedSessionId() {
+        return getRequest().getRequestedSessionId();
+    }
+
+    @Override
+    public String getRequestURI() {
+        return getRequest().getRequestURI();
+    }
+
+    @Override
+    public StringBuffer getRequestURL() {
+        return getRequest().getRequestURL();
+    }
+
+    @Override
+    public String getServletPath() {
+        return getRequest().getServletPath();
+    }
+
+    @Override
+    public HttpSession getSession(boolean create) {
+        return getRequest().getSession(create);
+    }
+
+    @Override
+    public HttpSession getSession() {
+        return getRequest().getSession();
+    }
+
+    @Override
+    public boolean isRequestedSessionIdValid() {
+        return getRequest().isRequestedSessionIdValid();
+    }
+
+    @Override
+    public boolean isRequestedSessionIdFromCookie() {
+        return getRequest().isRequestedSessionIdFromCookie();
+    }
+
+    @Override
+    public boolean isRequestedSessionIdFromURL() {
+        return getRequest().isRequestedSessionIdFromURL();
+    }
+
+    @Override
+    @Deprecated
+    public boolean isRequestedSessionIdFromUrl() {
+        return getRequest().isRequestedSessionIdFromUrl();
+    }
+
+    @Override
+    public boolean authenticate(HttpServletResponse response)
+            throws IOException, ServletException {
+        return getRequest().authenticate(response);
+    }
+
+    @Override
+    public void login(String username, String password) throws 
ServletException {
+        getRequest().login(username, password);
+    }
+
+    @Override
+    public void logout() throws ServletException {
+        getRequest().logout();
+    }
+
+    @Override
+    public Collection<Part> getParts() throws IOException, ServletException {
+        return getRequest().getParts();
+    }
+
+    @Override
+    public Part getPart(String name) throws IOException, ServletException {
+        return getRequest().getPart(name);
+    }
+
+    @Override
+    public void upgrade(ProtocolHandler handler) throws IOException {
+        getRequest().upgrade(handler);
+    }
+}

Propchange: 
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/test/org/apache/catalina/websocket/TestWebSocket.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/websocket/TestWebSocket.java?rev=1354469&r1=1354468&r2=1354469&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/websocket/TestWebSocket.java 
(original)
+++ tomcat/trunk/test/org/apache/catalina/websocket/TestWebSocket.java Wed Jun 
27 12:46:05 2012
@@ -36,6 +36,7 @@ import java.util.List;
 
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
+import javax.servlet.http.HttpServletRequest;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -296,7 +297,8 @@ public class TestWebSocket extends Tomca
         private static final long serialVersionUID = 1L;
 
         @Override
-        protected StreamInbound createWebSocketInbound(String subProtocol) {
+        protected StreamInbound createWebSocketInbound(String subProtocol,
+                HttpServletRequest request) {
             return new Bug53339WsInbound();
         }
     }

Modified: 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/chat/ChatWebSocketServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/chat/ChatWebSocketServlet.java?rev=1354469&r1=1354468&r2=1354469&view=diff
==============================================================================
--- 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/chat/ChatWebSocketServlet.java
 (original)
+++ 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/chat/ChatWebSocketServlet.java
 Wed Jun 27 12:46:05 2012
@@ -23,6 +23,8 @@ import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.catalina.websocket.MessageInbound;
 import org.apache.catalina.websocket.StreamInbound;
 import org.apache.catalina.websocket.WebSocketServlet;
@@ -44,7 +46,8 @@ public class ChatWebSocketServlet extend
             new CopyOnWriteArraySet<ChatMessageInbound>();
 
     @Override
-    protected StreamInbound createWebSocketInbound(String subProtocol) {
+    protected StreamInbound createWebSocketInbound(String subProtocol,
+            HttpServletRequest request) {
         return new ChatMessageInbound(connectionIds.incrementAndGet());
     }
 

Modified: 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoMessage.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoMessage.java?rev=1354469&r1=1354468&r2=1354469&view=diff
==============================================================================
--- 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoMessage.java 
(original)
+++ 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoMessage.java 
Wed Jun 27 12:46:05 2012
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 
 import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.catalina.websocket.MessageInbound;
 import org.apache.catalina.websocket.StreamInbound;
@@ -59,7 +60,8 @@ public class EchoMessage extends WebSock
 
 
     @Override
-    protected StreamInbound createWebSocketInbound(String subProtocol) {
+    protected StreamInbound createWebSocketInbound(String subProtocol,
+            HttpServletRequest request) {
         return new EchoMessageInbound(byteBufSize,charBufSize);
     }
 

Modified: 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoStream.java?rev=1354469&r1=1354468&r2=1354469&view=diff
==============================================================================
--- 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoStream.java 
(original)
+++ 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/echo/EchoStream.java 
Wed Jun 27 12:46:05 2012
@@ -20,6 +20,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.catalina.websocket.StreamInbound;
 import org.apache.catalina.websocket.WebSocketServlet;
 import org.apache.catalina.websocket.WsOutbound;
@@ -30,7 +32,8 @@ public class EchoStream extends WebSocke
     private static final long serialVersionUID = 1L;
 
     @Override
-    protected StreamInbound createWebSocketInbound(String subProtocol) {
+    protected StreamInbound createWebSocketInbound(String subProtocol,
+            HttpServletRequest request) {
         return new EchoStreamInbound();
     }
 

Modified: 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/snake/SnakeWebSocketServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/snake/SnakeWebSocketServlet.java?rev=1354469&r1=1354468&r2=1354469&view=diff
==============================================================================
--- 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/snake/SnakeWebSocketServlet.java
 (original)
+++ 
tomcat/trunk/webapps/examples/WEB-INF/classes/websocket/snake/SnakeWebSocketServlet.java
 Wed Jun 27 12:46:05 2012
@@ -30,6 +30,7 @@ import java.util.concurrent.ConcurrentHa
 import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
 
 import org.apache.catalina.websocket.MessageInbound;
 import org.apache.catalina.websocket.StreamInbound;
@@ -148,7 +149,8 @@ public class SnakeWebSocketServlet exten
     }
 
     @Override
-    protected StreamInbound createWebSocketInbound(String subProtocol) {
+    protected StreamInbound createWebSocketInbound(String subProtocol,
+            HttpServletRequest request) {
         return new SnakeMessageInbound(connectionIds.incrementAndGet());
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to