This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 383a5d11cb47183d7a98e2141f69929e95d9b835
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Tue Jun 4 12:30:33 2019 +0100

    Fix one potential cause of multiple threads processing a connection.
    
    If an InternalUpgradeHandler supports async I/O it will initiate further
    I/O so ensure the Protocol loop exists and the socket is put into the
    long poll state.
---
 java/org/apache/coyote/AbstractProtocol.java                       | 7 +++++++
 .../apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java   | 4 ++++
 java/org/apache/coyote/http2/Http2UpgradeHandler.java              | 2 +-
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/java/org/apache/coyote/AbstractProtocol.java 
b/java/org/apache/coyote/AbstractProtocol.java
index 837f805..4cbda42 100644
--- a/java/org/apache/coyote/AbstractProtocol.java
+++ b/java/org/apache/coyote/AbstractProtocol.java
@@ -35,6 +35,7 @@ import javax.management.ObjectName;
 import javax.servlet.http.HttpUpgradeHandler;
 import javax.servlet.http.WebConnection;
 
+import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler;
 import org.apache.juli.logging.Log;
 import org.apache.tomcat.InstanceManager;
 import org.apache.tomcat.util.ExceptionUtils;
@@ -860,6 +861,12 @@ public abstract class AbstractProtocol<S> implements 
ProtocolHandler,
                                     
upgradeToken.getContextBind().unbind(false, oldCL);
                                 }
                             }
+                            if (httpUpgradeHandler instanceof 
InternalHttpUpgradeHandler) {
+                                if (((InternalHttpUpgradeHandler) 
httpUpgradeHandler).hasAsyncIO()) {
+                                    // The handler will initiate all further 
I/O
+                                    state = SocketState.LONG;
+                                }
+                            }
                         }
                     }
                 } while ( state == SocketState.UPGRADING);
diff --git 
a/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java 
b/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java
index 936784e..8c5ce39 100644
--- a/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java
+++ b/java/org/apache/coyote/http11/upgrade/InternalHttpUpgradeHandler.java
@@ -37,4 +37,8 @@ public interface InternalHttpUpgradeHandler extends 
HttpUpgradeHandler {
     void setSslSupport(SSLSupport sslSupport);
 
     void pause();
+
+    default boolean hasAsyncIO() {
+        return false;
+    }
 }
\ No newline at end of file
diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java 
b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
index cbfbd3b..4bcb884 100644
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -826,7 +826,7 @@ public class Http2UpgradeHandler extends AbstractStream 
implements InternalHttpU
                                 // Close the stream (in app code so need to
                                 // signal to app stream is closing)
                                 stream.doWriteTimeout();
-                                }
+                            }
                         } catch (InterruptedException e) {
                             throw new IOException(sm.getString(
                                     
"upgradeHandler.windowSizeReservationInterrupted", connectionId,


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

Reply via email to