Author: markt
Date: Wed Jun 13 16:02:39 2012
New Revision: 1349936

URL: http://svn.apache.org/viewvc?rev=1349936&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=53074
Make WebSocket connections use infinite read timeouts by default.

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/StreamInbound.java
    tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java
    tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java
    
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeAprProcessor.java
    
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeBioProcessor.java
    
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeInbound.java
    
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeNioProcessor.java
    tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1342717

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/StreamInbound.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/StreamInbound.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/StreamInbound.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/websocket/StreamInbound.java 
Wed Jun 13 16:02:39 2012
@@ -282,4 +282,17 @@ public abstract class StreamInbound impl
      *                      connection.
      */
     protected abstract void onTextData(Reader r) throws IOException;
+
+    /**
+     * This default implementation sets the read timeout to infinite and 
expects
+     * the WebSocket application to close the connection when it is no longer
+     * required. Applications wishing to set an explicit timeout may override
+     * this method and return a value of their choice.
+     *
+     * @return  The read timeout in milliseconds or -1 for infinite
+     */
+    @Override
+    public int getReadTimeout() {
+        return -1;
+    }
 }

Modified: tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/ajp/AjpAprProtocol.java Wed Jun 
13 16:02:39 2012
@@ -127,7 +127,8 @@ public class AjpAprProtocol extends Abst
             recycledProcessors.offer(processor);
             if (addToPoller) {
                 ((AprEndpoint)proto.endpoint).getPoller().add(
-                        socket.getSocket().longValue(), true);
+                        socket.getSocket().longValue(),
+                        proto.endpoint.getKeepAliveTimeout());
             }
         }
 

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/Http11AprProtocol.java 
Wed Jun 13 16:02:39 2012
@@ -222,7 +222,8 @@ public class Http11AprProtocol extends A
             recycledProcessors.offer(processor);
             if (addToPoller && proto.endpoint.isRunning()) {
                 ((AprEndpoint)proto.endpoint).getPoller().add(
-                        socket.getSocket().longValue(), true);
+                        socket.getSocket().longValue(),
+                        proto.endpoint.getKeepAliveTimeout());
             }
         }
 
@@ -243,11 +244,13 @@ public class Http11AprProtocol extends A
             } else if (processor.isComet() && proto.endpoint.isRunning()) {
                 // Comet
                 ((AprEndpoint) proto.endpoint).getCometPoller().add(
-                        socket.getSocket().longValue(), false);
+                        socket.getSocket().longValue(),
+                        proto.endpoint.getSoTimeout());
             } else {
                 // Upgraded
                 ((AprEndpoint) proto.endpoint).getPoller().add(
-                        socket.getSocket().longValue(), false);
+                        socket.getSocket().longValue(),
+                        (processor.getUpgradeInbound().getReadTimeout()));
             }
         }
 

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeAprProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeAprProcessor.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeAprProcessor.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeAprProcessor.java
 Wed Jun 13 16:02:39 2012
@@ -31,6 +31,9 @@ public class UpgradeAprProcessor extends
             UpgradeInbound upgradeInbound) {
         super(upgradeInbound);
 
+        Socket.timeoutSet(wrapper.getSocket().longValue(),
+                upgradeInbound.getReadTimeout());
+
         this.socket = wrapper.getSocket().longValue();
     }
 

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeBioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeBioProcessor.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeBioProcessor.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeBioProcessor.java
 Wed Jun 13 16:02:39 2012
@@ -32,6 +32,12 @@ public class UpgradeBioProcessor extends
             UpgradeInbound upgradeInbound) throws IOException {
         super(upgradeInbound);
 
+        int timeout = upgradeInbound.getReadTimeout();
+        if (timeout < 0) {
+            timeout = 0;
+        }
+        wrapper.getSocket().setSoTimeout(timeout);
+
         this.inputStream = wrapper.getSocket().getInputStream();
         this.outputStream = wrapper.getSocket().getOutputStream();
     }

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeInbound.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeInbound.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeInbound.java 
(original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeInbound.java 
Wed Jun 13 16:02:39 2012
@@ -33,4 +33,12 @@ public interface UpgradeInbound {
     SocketState onData() throws IOException;
 
     void setUpgradeOutbound(UpgradeOutbound upgradeOutbound);
+
+    /**
+     * Allow the upgraded protocol to define the read timeout to be used with
+     * the upgraded connection.
+     *
+     * @return  The read timeout in milliseconds or -1 for infinite
+     */
+    int getReadTimeout();
 }

Modified: 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeNioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeNioProcessor.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeNioProcessor.java
 (original)
+++ 
tomcat/tc7.0.x/trunk/java/org/apache/coyote/http11/upgrade/UpgradeNioProcessor.java
 Wed Jun 13 16:02:39 2012
@@ -36,6 +36,8 @@ public class UpgradeNioProcessor extends
             UpgradeInbound upgradeInbound, NioSelectorPool pool) {
         super(upgradeInbound);
 
+        wrapper.setTimeout(upgradeInbound.getReadTimeout());
+
         this.nioChannel = wrapper.getSocket();
         this.pool = pool;
         this.maxRead = nioChannel.getBufHandler().getReadBuffer().capacity();

Modified: tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1349936&r1=1349935&r2=1349936&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java 
(original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Wed 
Jun 13 16:02:39 2012
@@ -1177,14 +1177,16 @@ public class AprEndpoint extends Abstrac
         }
 
         /**
-         * Add specified socket and associated pool to the poller. The socket 
will
-         * be added to a temporary array, and polled first after a maximum 
amount
-         * of time equal to pollTime (in most cases, latency will be much 
lower,
-         * however).
+         * Add specified socket and associated pool to the poller. The socket
+         * will be added to a temporary array, and polled first after a maximum
+         * amount of time equal to pollTime (in most cases, latency will be 
much
+         * lower, however).
          *
-         * @param socket to add to the poller
+         * @param socket    to add to the poller
+         * @param timeout   read timeout (in milliseconds) to use with this
+         *                  socket. Use -1 for infinite timeout
          */
-        public void add(long socket, boolean keepAlive) {
+        public void add(long socket, int timeout) {
             synchronized (this) {
                 // Add socket to the list. Newly added sockets will wait
                 // at most for pollTime before being polled
@@ -1198,11 +1200,7 @@ public class AprEndpoint extends Abstrac
                     return;
                 }
                 addSocket[addCount] = socket;
-                if (keepAlive) {
-                    addSocketTimeout[addCount] = getKeepAliveTimeout();
-                } else {
-                    addSocketTimeout[addCount] = getSoTimeout();
-                }
+                addSocketTimeout[addCount] = timeout;
                 addCount++;
                 this.notify();
             }
@@ -1254,10 +1252,14 @@ public class AprEndpoint extends Abstrac
                             int successCount = 0;
                             try {
                                 for (int i = (addCount - 1); i >= 0; i--) {
+                                    int timeout = addSocketTimeout[i];
+                                    if (timeout > 0) {
+                                        // Convert milliseconds to microseconds
+                                        timeout = timeout * 1000;
+                                    }
                                     int rv = Poll.addWithTimeout(
                                             connectionPollset, addSocket[i],
-                                            Poll.APR_POLLIN,
-                                            addSocketTimeout[i] * 1000);
+                                            Poll.APR_POLLIN, timeout);
                                     if (rv == Status.APR_SUCCESS) {
                                         successCount++;
                                     } else {
@@ -1639,7 +1641,8 @@ public class AprEndpoint extends Abstrac
                                     Socket.timeoutSet(state.socket, 
socketProperties.getSoTimeout() * 1000);
                                     // If all done put the socket back in the 
poller for
                                     // processing of further requests
-                                    getPoller().add(state.socket, true);
+                                    getPoller().add(state.socket,
+                                            getKeepAliveTimeout());
                                 } else {
                                     // Close the socket since this is
                                     // the end of not keep-alive request.
@@ -1730,7 +1733,8 @@ public class AprEndpoint extends Abstrac
             synchronized (socket) {
                 if (!deferAccept) {
                     if (setSocketOptions(socket.getSocket().longValue())) {
-                        getPoller().add(socket.getSocket().longValue(), false);
+                        getPoller().add(socket.getSocket().longValue(),
+                                getSoTimeout());
                     } else {
                         // Close socket and pool
                         destroySocket(socket.getSocket().longValue());



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

Reply via email to