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