Author: markt
Date: Mon Nov 10 16:47:56 2014
New Revision: 1637940

URL: http://svn.apache.org/r1637940
Log:
Add a standard method for returning input to the SocketWrapper.
Use this to make the code consistent between upgrade processor
implementations.

Modified:
    tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java
    tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java
    tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java
    tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
    tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java

Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java?rev=1637940&r1=1637939&r2=1637940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/AprProcessor.java Mon 
Nov 10 16:47:56 2014
@@ -22,8 +22,6 @@ import javax.servlet.http.HttpUpgradeHan
 
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
-import org.apache.tomcat.jni.Socket;
-import org.apache.tomcat.util.net.AprEndpoint.AprSocketWrapper;
 import org.apache.tomcat.util.net.SocketWrapperBase;
 
 public class AprProcessor extends AbstractProcessor<Long> {
@@ -39,7 +37,7 @@ public class AprProcessor extends Abstra
         super(httpUpgradeHandler,
                 new UpgradeServletInputStream(wrapper),
                 new UpgradeServletOutputStream(wrapper, asyncWriteBufferSize));
-        ((AprSocketWrapper) wrapper).setLeftOverInput(leftOverInput);
-        Socket.timeoutSet(wrapper.getSocket().longValue(), INFINITE_TIMEOUT);
+        wrapper.unRead(leftOverInput);
+        wrapper.setTimeout(INFINITE_TIMEOUT);
     }
 }

Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java?rev=1637940&r1=1637939&r2=1637940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/Nio2Processor.java Mon 
Nov 10 16:47:56 2014
@@ -38,10 +38,7 @@ public class Nio2Processor extends Abstr
         super(httpUpgradeHandler,
                 new UpgradeServletInputStream(wrapper),
                 new UpgradeServletOutputStream(wrapper, asyncWriteBufferSize));
-
+        wrapper.unRead(leftoverInput);
         wrapper.setTimeout(INFINITE_TIMEOUT);
-        if (leftoverInput != null) {
-            
wrapper.getSocket().getBufHandler().getReadBuffer().put(leftoverInput);
-        }
     }
 }

Modified: tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java?rev=1637940&r1=1637939&r2=1637940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java 
(original)
+++ tomcat/trunk/java/org/apache/coyote/http11/upgrade/NioProcessor.java Mon 
Nov 10 16:47:56 2014
@@ -38,17 +38,7 @@ public class NioProcessor extends Abstra
         super(httpUpgradeHandler,
                 new UpgradeServletInputStream(wrapper),
                 new UpgradeServletOutputStream(wrapper, asyncWriteBufferSize));
-
+        wrapper.unRead(leftoverInput);
         wrapper.setTimeout(INFINITE_TIMEOUT);
-        if (leftoverInput != null) {
-            ByteBuffer readBuffer = 
wrapper.getSocket().getBufHandler().getReadBuffer();
-            if (readBuffer.remaining() > 0) {
-                readBuffer.flip();
-            } else {
-                readBuffer.clear();
-            }
-            readBuffer.put(leftoverInput);
-            readBuffer.flip();
-        }
     }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java?rev=1637940&r1=1637939&r2=1637940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/AprEndpoint.java Mon Nov 10 
16:47:56 2014
@@ -2357,7 +2357,7 @@ public class AprEndpoint extends Abstrac
 
         private final ByteBuffer sslOutputBuffer;
 
-        private volatile ByteBuffer leftOverInput;
+        private volatile ByteBuffer returnedInput;
         private volatile boolean eagain = false;
         private volatile boolean closed = false;
 
@@ -2377,14 +2377,6 @@ public class AprEndpoint extends Abstrac
         }
 
 
-        public void setLeftOverInput(ByteBuffer leftOverInput) {
-            if (leftOverInput != null) {
-                this.leftOverInput = 
ByteBuffer.allocate(leftOverInput.remaining());
-                this.leftOverInput.put(leftOverInput);
-            }
-        }
-
-
         @Override
         public int read(boolean block, byte[] b, int off, int len) throws 
IOException {
 
@@ -2392,13 +2384,13 @@ public class AprEndpoint extends Abstrac
                 throw new IOException(sm.getString("socket.apr.closed", 
getSocket()));
             }
 
-            if (leftOverInput != null) {
-                if (leftOverInput.remaining() < len) {
-                    len = leftOverInput.remaining();
-                }
-                leftOverInput.get(b, off, len);
-                if (leftOverInput.remaining() == 0) {
-                    leftOverInput = null;
+            if (returnedInput != null) {
+                if (returnedInput.remaining() < len) {
+                    len = returnedInput.remaining();
+                }
+                returnedInput.get(b, off, len);
+                if (returnedInput.remaining() == 0) {
+                    returnedInput = null;
                 }
                 return len;
             }
@@ -2475,6 +2467,16 @@ public class AprEndpoint extends Abstrac
         }
 
 
+
+        @Override
+        public void unRead(ByteBuffer input) {
+            if (returnedInput != null) {
+                this.returnedInput = 
ByteBuffer.allocate(returnedInput.remaining());
+                this.returnedInput.put(returnedInput);
+            }
+        }
+
+
         @Override
         public void close() {
             closed = true;

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java?rev=1637940&r1=1637939&r2=1637940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/Nio2Endpoint.java Mon Nov 10 
16:47:56 2014
@@ -942,6 +942,14 @@ public class Nio2Endpoint extends Abstra
 
 
         @Override
+        public void unRead(ByteBuffer returnedInput) {
+            if (returnedInput != null) {
+                getSocket().getBufHandler().getReadBuffer().put(returnedInput);
+            }
+        }
+
+
+        @Override
         public void close() throws IOException {
             getSocket().close();
         }

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java?rev=1637940&r1=1637939&r2=1637940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/NioEndpoint.java Mon Nov 10 
16:47:56 2014
@@ -1479,6 +1479,21 @@ public class NioEndpoint extends Abstrac
 
 
         @Override
+        public void unRead(ByteBuffer returnedInput) {
+            if (returnedInput != null) {
+                ByteBuffer readBuffer = 
getSocket().getBufHandler().getReadBuffer();
+                if (readBuffer.remaining() > 0) {
+                    readBuffer.flip();
+                } else {
+                    readBuffer.clear();
+                }
+                readBuffer.put(returnedInput);
+                readBuffer.flip();
+            }
+        }
+
+
+        @Override
         public void close() throws IOException {
             getSocket().close();
         }

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java?rev=1637940&r1=1637939&r2=1637940&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/SocketWrapperBase.java Mon Nov 
10 16:47:56 2014
@@ -17,6 +17,7 @@
 package org.apache.tomcat.util.net;
 
 import java.io.IOException;
+import java.nio.ByteBuffer;
 import java.util.Iterator;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
@@ -188,6 +189,18 @@ public abstract class SocketWrapperBase<
 
     public abstract int read(boolean block, byte[] b, int off, int len) throws 
IOException;
     public abstract boolean isReady() throws IOException;
+    /**
+     * Return input that has been read to the input buffer for re-reading by 
the
+     * correct component. There are times when a component may read more data
+     * than it needs before it passes control to another component. One example
+     * of this is during HTTP upgrade. If an (arguably misbehaving client) 
sends
+     * data associated with the upgraded protocol before the HTTP upgrade
+     * completes, the HTTP handler may read it. This method provides a way for
+     * that data to be returned so it can be processed by the correct 
component.
+     *
+     * @param input The input to return to the input buffer.
+     */
+    public abstract void unRead(ByteBuffer input);
     public abstract void close() throws IOException;
 
     public abstract int write(boolean block, byte[] b, int off, int len) 
throws IOException;



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

Reply via email to