You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2022/09/30 18:04:34 UTC

[tomcat] branch main updated (b504f28ea6 -> 8a762896a7)

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

markt pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


    from b504f28ea6 Fix typo
     new 795dfa4aff Refactor to remove unnecessary parameter
     new 8a762896a7 BZ 66281 - unexpected timeouts when using HTTP/2 and NIO2

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 java/org/apache/coyote/http2/Http2Parser.java      | 18 ++++++
 .../apache/coyote/http2/Http2UpgradeHandler.java   | 20 +++++--
 .../servlet/http/HttpServletDoHeadBaseTest.java    |  8 +--
 test/org/apache/coyote/http2/Http2TestBase.java    | 30 +++++-----
 test/org/apache/coyote/http2/TestAsync.java        |  8 +--
 test/org/apache/coyote/http2/TestAsyncFlush.java   |  4 +-
 test/org/apache/coyote/http2/TestAsyncTimeout.java |  4 +-
 .../apache/coyote/http2/TestCancelledUpload.java   |  8 +--
 test/org/apache/coyote/http2/TestFlowControl.java  |  8 +--
 test/org/apache/coyote/http2/TestHttp2Limits.java  | 30 +++++-----
 .../apache/coyote/http2/TestHttp2Section_3_2.java  |  6 +-
 .../apache/coyote/http2/TestHttp2Section_3_5.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_4_2.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_4_3.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_5_1.java  | 70 +++++++++++-----------
 .../apache/coyote/http2/TestHttp2Section_5_2.java  | 10 ++--
 .../apache/coyote/http2/TestHttp2Section_5_3.java  | 22 +++----
 .../apache/coyote/http2/TestHttp2Section_5_5.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_6_3.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_6_4.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_6_5.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_6_6.java  | 10 ++--
 .../apache/coyote/http2/TestHttp2Section_6_7.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_6_8.java  |  8 +--
 .../apache/coyote/http2/TestHttp2Section_6_9.java  | 38 ++++++------
 .../apache/coyote/http2/TestHttp2Section_8_1.java  | 32 +++++-----
 .../org/apache/coyote/http2/TestHttp2Timeouts.java | 20 +++----
 .../coyote/http2/TestHttp2UpgradeHandler.java      | 16 ++---
 test/org/apache/coyote/http2/TestHttpServlet.java  |  4 +-
 test/org/apache/coyote/http2/TestStream.java       |  6 +-
 .../apache/coyote/http2/TestStreamProcessor.java   | 14 ++---
 .../apache/coyote/http2/TestStreamQueryString.java | 10 ++--
 .../org/apache/coyote/http2/TesterHttp2Parser.java | 11 +++-
 webapps/docs/changelog.xml                         |  4 ++
 34 files changed, 241 insertions(+), 202 deletions(-)


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


[tomcat] 01/02: Refactor to remove unnecessary parameter

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 795dfa4aff3ecac8bf682e6c3bfb6eab5cc0cd2a
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Sep 30 18:14:40 2022 +0100

    Refactor to remove unnecessary parameter
---
 java/org/apache/coyote/http2/Http2Parser.java      | 18 ++++++
 .../apache/coyote/http2/Http2UpgradeHandler.java   |  2 +-
 .../servlet/http/HttpServletDoHeadBaseTest.java    |  8 +--
 test/org/apache/coyote/http2/Http2TestBase.java    | 30 +++++-----
 test/org/apache/coyote/http2/TestAsync.java        |  8 +--
 test/org/apache/coyote/http2/TestAsyncFlush.java   |  4 +-
 test/org/apache/coyote/http2/TestAsyncTimeout.java |  4 +-
 .../apache/coyote/http2/TestCancelledUpload.java   |  8 +--
 test/org/apache/coyote/http2/TestFlowControl.java  |  8 +--
 test/org/apache/coyote/http2/TestHttp2Limits.java  | 30 +++++-----
 .../apache/coyote/http2/TestHttp2Section_3_2.java  |  6 +-
 .../apache/coyote/http2/TestHttp2Section_3_5.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_4_2.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_4_3.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_5_1.java  | 70 +++++++++++-----------
 .../apache/coyote/http2/TestHttp2Section_5_2.java  | 10 ++--
 .../apache/coyote/http2/TestHttp2Section_5_3.java  | 22 +++----
 .../apache/coyote/http2/TestHttp2Section_5_5.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_6_3.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_6_4.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_6_5.java  |  2 +-
 .../apache/coyote/http2/TestHttp2Section_6_6.java  | 10 ++--
 .../apache/coyote/http2/TestHttp2Section_6_7.java  |  4 +-
 .../apache/coyote/http2/TestHttp2Section_6_8.java  |  8 +--
 .../apache/coyote/http2/TestHttp2Section_6_9.java  | 38 ++++++------
 .../apache/coyote/http2/TestHttp2Section_8_1.java  | 32 +++++-----
 .../org/apache/coyote/http2/TestHttp2Timeouts.java | 20 +++----
 .../coyote/http2/TestHttp2UpgradeHandler.java      | 16 ++---
 test/org/apache/coyote/http2/TestHttpServlet.java  |  4 +-
 test/org/apache/coyote/http2/TestStream.java       |  6 +-
 .../apache/coyote/http2/TestStreamProcessor.java   | 14 ++---
 .../apache/coyote/http2/TestStreamQueryString.java | 10 ++--
 .../org/apache/coyote/http2/TesterHttp2Parser.java | 11 +++-
 33 files changed, 223 insertions(+), 198 deletions(-)

diff --git a/java/org/apache/coyote/http2/Http2Parser.java b/java/org/apache/coyote/http2/Http2Parser.java
index c03a17a5e9..72c30532e1 100644
--- a/java/org/apache/coyote/http2/Http2Parser.java
+++ b/java/org/apache/coyote/http2/Http2Parser.java
@@ -66,12 +66,30 @@ class Http2Parser {
      *         <code>false</code>
      *
      * @throws IOException If an IO error occurs while trying to read a frame
+     *
+     * @deprecated Unused. Will be removed in Tomcat 11 onwards.
      */
+    @Deprecated
     boolean readFrame(boolean block) throws Http2Exception, IOException {
         return readFrame(block, null);
     }
 
 
+    /**
+     * Read and process a single frame. The initial read is non-blocking to
+     * determine if a frame is present. Once the start of a frame is read, the
+     * remainder will be read using blocking IO.
+     *
+     * @return <code>true</code> if a frame was read otherwise
+     *         <code>false</code>
+     *
+     * @throws IOException If an IO error occurs while trying to read a frame
+     */
+    boolean readFrame() throws Http2Exception, IOException {
+        return readFrame(false, null);
+    }
+
+
     protected boolean readFrame(boolean block, FrameType expected)
             throws IOException, Http2Exception {
 
diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
index f093b2ad38..4073411e25 100644
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -355,7 +355,7 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH
                     setConnectionTimeout(-1);
                     while (true) {
                         try {
-                            if (!parser.readFrame(false)) {
+                            if (!parser.readFrame()) {
                                 break;
                             }
                         } catch (StreamException se) {
diff --git a/test/jakarta/servlet/http/HttpServletDoHeadBaseTest.java b/test/jakarta/servlet/http/HttpServletDoHeadBaseTest.java
index 3de57243ba..21a962d48d 100644
--- a/test/jakarta/servlet/http/HttpServletDoHeadBaseTest.java
+++ b/test/jakarta/servlet/http/HttpServletDoHeadBaseTest.java
@@ -128,11 +128,11 @@ public class HttpServletDoHeadBaseTest extends Http2TestBase {
             writeFrame(frameHeaderGet, headersPayloadGet);
 
             // Want the headers frame for stream 3
-            parser.readFrame(true);
+            parser.readFrame();
             while (!output.getTrace().startsWith("3-HeadersStart\n")) {
                 debug.append(output.getTrace());
                 output.clearTrace();
-                parser.readFrame(true);
+                parser.readFrame();
             }
             String traceGet = output.getTrace();
             debug.append(output.getTrace());
@@ -145,11 +145,11 @@ public class HttpServletDoHeadBaseTest extends Http2TestBase {
             writeFrame(frameHeaderHead, headersPayloadHead);
 
             // Want the headers frame for stream 5
-            parser.readFrame(true);
+            parser.readFrame();
             while (!output.getTrace().startsWith("5-HeadersStart\n")) {
                 debug.append(output.getTrace());
                 output.clearTrace();
-                parser.readFrame(true);
+                parser.readFrame();
             }
             String traceHead = output.getTrace();
             debug.append(output.getTrace());
diff --git a/test/org/apache/coyote/http2/Http2TestBase.java b/test/org/apache/coyote/http2/Http2TestBase.java
index 12c8fd7aeb..ba11706257 100644
--- a/test/org/apache/coyote/http2/Http2TestBase.java
+++ b/test/org/apache/coyote/http2/Http2TestBase.java
@@ -156,11 +156,11 @@ public abstract class Http2TestBase extends TomcatBaseTest {
         // - ping
         // - headers (for response)
         // - data (for response body)
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals("0-Settings-[3]-[200]\n" +
                 "0-Settings-End\n" +
@@ -511,9 +511,9 @@ public abstract class Http2TestBase extends TomcatBaseTest {
 
     protected void readSimpleGetResponse() throws Http2Exception, IOException {
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Body
-        parser.readFrame(true);
+        parser.readFrame();
     }
 
 
@@ -528,23 +528,23 @@ public abstract class Http2TestBase extends TomcatBaseTest {
          */
 
         // Connection window update after reading request body
-        parser.readFrame(true);
+        parser.readFrame();
         // Stream window update after reading request body
-        parser.readFrame(true);
+        parser.readFrame();
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Body (includes end of stream)
-        parser.readFrame(true);
+        parser.readFrame();
 
         if (padding) {
             // Connection window update for padding
-            parser.readFrame(true);
+            parser.readFrame();
 
             // If EndOfStream has not been received then the stream window
             // update must have been received so a further frame needs to be
             // read for EndOfStream.
             if (!output.getTrace().contains("EndOfStream")) {
-                parser.readFrame(true);
+                parser.readFrame();
             }
         }
     }
@@ -979,7 +979,7 @@ public abstract class Http2TestBase extends TomcatBaseTest {
     protected void skipWindowSizeFrames() throws Http2Exception, IOException {
         do {
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
         } while (output.getTrace().contains("WindowSize"));
     }
 
@@ -987,7 +987,7 @@ public abstract class Http2TestBase extends TomcatBaseTest {
     void handleGoAwayResponse(int lastStream, Http2Error expectedError)
             throws Http2Exception, IOException {
         try {
-            parser.readFrame(true);
+            parser.readFrame();
 
             Assert.assertTrue(output.getTrace(), output.getTrace().startsWith(
                     "0-Goaway-[" + lastStream + "]-[" + expectedError.getCode() + "]-["));
diff --git a/test/org/apache/coyote/http2/TestAsync.java b/test/org/apache/coyote/http2/TestAsync.java
index f5265c872a..1d497bf09b 100644
--- a/test/org/apache/coyote/http2/TestAsync.java
+++ b/test/org/apache/coyote/http2/TestAsync.java
@@ -152,12 +152,12 @@ public class TestAsync extends Http2TestBase {
         }
 
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Body
 
         if (!connectionUnlimited || !streamUnlimited) {
             while (output.getBytesRead() < startingWindowSize) {
-                parser.readFrame(true);
+                parser.readFrame();
             }
 
             // Check that the right number of bytes were received
@@ -174,7 +174,7 @@ public class TestAsync extends Http2TestBase {
             }
 
             while (output.getBytesRead() < startingWindowSize + windowSizeIncrease) {
-                parser.readFrame(true);
+                parser.readFrame();
             }
 
             // Check that the right number of bytes were received
@@ -191,7 +191,7 @@ public class TestAsync extends Http2TestBase {
         }
 
         while (!output.getTrace().endsWith("3-EndOfStream\n")) {
-            parser.readFrame(true);
+            parser.readFrame();
         }
 
         // Check that the right number of bytes were received
diff --git a/test/org/apache/coyote/http2/TestAsyncFlush.java b/test/org/apache/coyote/http2/TestAsyncFlush.java
index 5d49c3337a..4c548e4926 100644
--- a/test/org/apache/coyote/http2/TestAsyncFlush.java
+++ b/test/org/apache/coyote/http2/TestAsyncFlush.java
@@ -85,7 +85,7 @@ public class TestAsyncFlush extends Http2TestBase {
         writeFrame(frameHeader, headersPayload);
 
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Body
 
         while (output.getBytesRead() < targetSize ) {
@@ -94,7 +94,7 @@ public class TestAsyncFlush extends Http2TestBase {
                 sendWindowUpdate(0, ConnectionSettingsBase.DEFAULT_INITIAL_WINDOW_SIZE);
                 totalWindow += ConnectionSettingsBase.DEFAULT_INITIAL_WINDOW_SIZE;
             }
-            parser.readFrame(true);
+            parser.readFrame();
         }
 
         // Check that the right number of bytes were received
diff --git a/test/org/apache/coyote/http2/TestAsyncTimeout.java b/test/org/apache/coyote/http2/TestAsyncTimeout.java
index 294bca81a1..69529641cd 100644
--- a/test/org/apache/coyote/http2/TestAsyncTimeout.java
+++ b/test/org/apache/coyote/http2/TestAsyncTimeout.java
@@ -79,9 +79,9 @@ public class TestAsyncTimeout extends Http2TestBase {
         writeFrame(frameHeader, headersPayload);
 
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Body
-        parser.readFrame(true);
+        parser.readFrame();
 
         // Check that the expected text was received
         String trace = output.getTrace();
diff --git a/test/org/apache/coyote/http2/TestCancelledUpload.java b/test/org/apache/coyote/http2/TestCancelledUpload.java
index e4738ccf6a..2407f1f512 100644
--- a/test/org/apache/coyote/http2/TestCancelledUpload.java
+++ b/test/org/apache/coyote/http2/TestCancelledUpload.java
@@ -76,7 +76,7 @@ public class TestCancelledUpload extends Http2TestBase {
             // The connection processing thread will:
             // - read the request body until the flow control window is exhausted
             // - reset the stream if further DATA frames are received
-            parser.readFrame(true);
+            parser.readFrame();
 
             // Check for reset and exit if found
             if (checkReset()) {
@@ -91,7 +91,7 @@ public class TestCancelledUpload extends Http2TestBase {
                     "3-HeadersEnd\n",
                     output.getTrace());
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
 
             // Check for reset and exit if found
             if (checkReset()) {
@@ -103,7 +103,7 @@ public class TestCancelledUpload extends Http2TestBase {
                     "3-EndOfStream\n",
                     output.getTrace());
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
 
             Assert.assertTrue(checkReset());
 
@@ -144,7 +144,7 @@ public class TestCancelledUpload extends Http2TestBase {
                 return false;
             }
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
         }
     }
 
diff --git a/test/org/apache/coyote/http2/TestFlowControl.java b/test/org/apache/coyote/http2/TestFlowControl.java
index 9093a8e924..60269389e1 100644
--- a/test/org/apache/coyote/http2/TestFlowControl.java
+++ b/test/org/apache/coyote/http2/TestFlowControl.java
@@ -83,11 +83,11 @@ public class TestFlowControl extends Http2TestBase {
 
             // Read the 404 error page
             // headers
-            parser.readFrame(true);
+            parser.readFrame();
             // body
-            parser.readFrame(true);
+            parser.readFrame();
             // reset (because the request body was not fully read)
-            parser.readFrame(true);
+            parser.readFrame();
 
             // Validate response
             // Response size varies as error page is generated and includes version
@@ -140,7 +140,7 @@ public class TestFlowControl extends Http2TestBase {
         boolean found = false;
         String trace;
         do {
-            parser.readFrame(true);
+            parser.readFrame();
             trace = output.getTrace();
             output.clearTrace();
             found = trace.startsWith(prefix);
diff --git a/test/org/apache/coyote/http2/TestHttp2Limits.java b/test/org/apache/coyote/http2/TestHttp2Limits.java
index e8bea21c41..25103f9cd7 100644
--- a/test/org/apache/coyote/http2/TestHttp2Limits.java
+++ b/test/org/apache/coyote/http2/TestHttp2Limits.java
@@ -50,7 +50,7 @@ public class TestHttp2Limits extends Http2TestBase {
         for (int i = 0; i < 100; i++) {
             try {
                 sendSettings(0, false);
-                parser.readFrame(true);
+                parser.readFrame();
             } catch (IOException ioe) {
                 // Server closed connection before client has a chance to read
                 // the Goaway frame. Treat this as a pass.
@@ -149,8 +149,8 @@ public class TestHttp2Limits extends Http2TestBase {
 
         output.clearTrace();
         sendSimpleGetRequest(5);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         Assert.assertEquals(getSimpleResponseTrace(5), output.getTrace());
     }
 
@@ -281,7 +281,7 @@ public class TestHttp2Limits extends Http2TestBase {
         }
         case STREAM_RESET: {
             // Expect a stream reset
-            parser.readFrame(true);
+            parser.readFrame();
             Assert.assertEquals("3-RST-[11]\n", output.getTrace());
             Assert.assertNull(e);
             break;
@@ -301,7 +301,7 @@ public class TestHttp2Limits extends Http2TestBase {
             // Note: Some platforms will allow the read if if the write fails
             //       above.
             try {
-                parser.readFrame(true);
+                parser.readFrame();
                 MatcherAssert.assertThat(output.getTrace(), RegexMatcher.matchesRegex(
                         "0-Goaway-\\[1\\]-\\[11\\]-\\[" + limitMessage + "\\]"));
             } catch (IOException se) {
@@ -425,21 +425,21 @@ public class TestHttp2Limits extends Http2TestBase {
 
         switch (failMode) {
         case 0: {
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
             System.out.println(output.getTrace());
             Assert.assertEquals(getCookieResponseTrace(3, cookieCount), output.getTrace());
             break;
         }
         case 1: {
             // Check status is 400
-            parser.readFrame(true);
+            parser.readFrame();
             Assert.assertTrue(output.getTrace(), output.getTrace().startsWith(
                     "3-HeadersStart\n3-Header-[:status]-[400]"));
             output.clearTrace();
             // Check EOS followed by error page body
-            parser.readFrame(true);
+            parser.readFrame();
             Assert.assertTrue(output.getTrace(), output.getTrace().startsWith("3-EndOfStream\n3-Body-<!doctype"));
             break;
         }
@@ -506,10 +506,10 @@ public class TestHttp2Limits extends Http2TestBase {
 
         switch (failMode) {
         case NONE: {
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
 
             String len = Integer.toString(256 + TRAILER_HEADER_VALUE.length());
 
@@ -535,7 +535,7 @@ public class TestHttp2Limits extends Http2TestBase {
             // the enhance your calm reset
             if ("3-RST-[5]\n".equals(output.getTrace())) {
                 output.clearTrace();
-                parser.readFrame(true);
+                parser.readFrame();
             }
 
             Assert.assertEquals("3-RST-[11]\n", output.getTrace());
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_3_2.java b/test/org/apache/coyote/http2/TestHttp2Section_3_2.java
index 885e72cb38..8f1057d6d5 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_3_2.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_3_2.java
@@ -61,7 +61,7 @@ public class TestHttp2Section_3_2 extends Http2TestBase {
         // If we don't send the preface the server should kill the connection.
         try {
             // Make the parser read something.
-            parser.readFrame(true);
+            parser.readFrame();
         } catch (IOException ioe) {
             // Expected because the server is going to drop the connection.
         }
@@ -78,7 +78,7 @@ public class TestHttp2Section_3_2 extends Http2TestBase {
         os.flush();
         try {
             // Make the parser read something.
-            parser.readFrame(true);
+            parser.readFrame();
         } catch (IOException ioe) {
             // Expected because the server is going to drop the connection.
         }
@@ -96,7 +96,7 @@ public class TestHttp2Section_3_2 extends Http2TestBase {
         os.flush();
         try {
             // Make the parser read something.
-            parser.readFrame(true);
+            parser.readFrame();
         } catch (IOException ioe) {
             // Expected because the server is going to drop the connection.
         }
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_3_5.java b/test/org/apache/coyote/http2/TestHttp2Section_3_5.java
index 2e45e3a7d2..60112773b8 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_3_5.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_3_5.java
@@ -31,7 +31,7 @@ public class TestHttp2Section_3_5 extends Http2TestBase {
         doHttpUpgrade();
 
         // Server settings
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("0-Settings-[3]-[200]\n" +
                 "0-Settings-End\n"
                 , output.getTrace());
@@ -57,7 +57,7 @@ public class TestHttp2Section_3_5 extends Http2TestBase {
         // acknowledgement. Of the settings. As the preface was invalid, it
         // should be a GOAWAY frame.
         try {
-            parser.readFrame(true);
+            parser.readFrame();
             Assert.assertTrue(output.getTrace(), output.getTrace().startsWith("0-Goaway-[1]-[1]-["));
         } catch (IOException ioe) {
             // Ignore
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_4_2.java b/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
index 557e8f4a27..496825f38e 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_4_2.java
@@ -123,7 +123,7 @@ public class TestHttp2Section_4_2 extends Http2TestBase {
         os.write(priority);
 
         // Read Stream reset frame
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertTrue(output.getTrace(),
                 output.getTrace().startsWith("3-RST-[6]"));
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_4_3.java b/test/org/apache/coyote/http2/TestHttp2Section_4_3.java
index 52ad968149..dc65ee6395 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_4_3.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_4_3.java
@@ -67,8 +67,8 @@ public class TestHttp2Section_4_3 extends Http2TestBase {
         writeFrame(frameHeader, headersPayload);
 
         // headers, body
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals(getSimpleResponseTrace(3), output.getTrace());
     }
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_5_1.java b/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
index 36e71c5200..62c507cdf7 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_5_1.java
@@ -94,7 +94,7 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
 
         // Then try sending some data (which should fail)
         sendData(3, new byte[] {});
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertTrue(output.getTrace(),
                 output.getTrace().startsWith("3-RST-[" + Http2Error.STREAM_CLOSED.getCode() + "]"));
@@ -200,11 +200,11 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         sendClientPreface();
 
         // validateHttp2InitialResponse() - modified
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals("0-Settings-[3]-[1]\n" +
                 "0-Settings-End\n" +
@@ -227,7 +227,7 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         // 1 * error
         // for a total of 9 frames (could be in any order)
         for (int i = 0; i < 9; i++) {
-            parser.readFrame(true);
+            parser.readFrame();
         }
 
         Assert.assertTrue(output.getTrace(),
@@ -245,14 +245,14 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
 
         // Read until the end of stream 3
         while (!output.getTrace().contains("3-EndOfStream")) {
-            parser.readFrame(true);
+            parser.readFrame();
         }
         output.clearTrace();
 
         // Confirm another request can be sent once concurrency falls back below limit
         sendSimpleGetRequest(7);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         Assert.assertEquals(getSimpleResponseTrace(7), output.getTrace());
     }
 
@@ -267,11 +267,11 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         sendClientPreface();
 
         // validateHttp2InitialResponse() - modified
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals("0-Settings-[3]-[1]\n" +
                 "0-Settings-End\n" +
@@ -294,7 +294,7 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         // 1 * error
         // for a total of 9 frames (could be in any order)
         for (int i = 0; i < 9; i++) {
-            parser.readFrame(true);
+            parser.readFrame();
         }
 
         Assert.assertTrue(output.getTrace(),
@@ -309,7 +309,7 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         sendRst(3, Http2Error.NO_ERROR.getCode());
         // Client reset triggers a write error which in turn triggers a server
         // reset
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("3-RST-[5]\n", output.getTrace());
         output.clearTrace();
 
@@ -318,8 +318,8 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
 
         // Confirm another request can be sent once concurrency falls back below limit
         sendSimpleGetRequest(7);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         Assert.assertEquals(getSimpleResponseTrace(7), output.getTrace());
     }
 
@@ -336,11 +336,11 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
             sendClientPreface();
 
             // validateHttp2InitialResponse() - modified
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
 
             Assert.assertEquals("0-Settings-[3]-[1]\n" +
                     "0-Settings-End\n" +
@@ -362,9 +362,9 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
             // 56k-1 of body (7 * ~8k)
             // 1 * error (could be in any order)
             for (int i = 0; i < 8; i++) {
-                parser.readFrame(true);
+                parser.readFrame();
             }
-            parser.readFrame(true);
+            parser.readFrame();
 
             Assert.assertTrue(output.getTrace(),
                     output.getTrace().contains("5-RST-[" + Http2Error.REFUSED_STREAM.getCode() + "]"));
@@ -377,7 +377,7 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
             // Allow for the 8k still in the stream window
             sendWindowUpdate(3, (1 << 31) - 1);
 
-            parser.readFrame(true);
+            parser.readFrame();
             Assert.assertEquals("3-RST-[" + Http2Error.FLOW_CONTROL_ERROR.getCode() + "]\n", output.getTrace());
         } finally {
             LogManager.getLogManager().getLogger("org.apache.coyote.http2").setLevel(Level.INFO);
@@ -395,11 +395,11 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         sendClientPreface();
 
         // validateHttp2InitialResponse() - modified
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals("0-Settings-[3]-[1]\n" +
                 "0-Settings-End\n" +
@@ -432,9 +432,9 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         // Could be in any order
         //
         for (int i = 0; i < 9; i++) {
-            parser.readFrame(true);
+            parser.readFrame();
         }
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertTrue(output.getTrace(),
                 output.getTrace().contains("5-RST-[" + Http2Error.REFUSED_STREAM.getCode() + "]"));
@@ -446,7 +446,7 @@ public class TestHttp2Section_5_1 extends Http2TestBase {
         // Allow for the 8k still in the connection window
         sendWindowUpdate(0, (1 << 31) - 1);
 
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertTrue(output.getTrace(),
                 output.getTrace().contains("0-Goaway-[5]-[" + Http2Error.FLOW_CONTROL_ERROR.getCode() + "]"));
     }
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_5_2.java b/test/org/apache/coyote/http2/TestHttp2Section_5_2.java
index 7bef2f0566..35083face7 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_5_2.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_5_2.java
@@ -47,16 +47,16 @@ public class TestHttp2Section_5_2 extends Http2TestBase {
         // Set the default window size to 1024 bytes
         sendSettings(0, false, new SettingValue(4, 1024));
         // Wait for the ack
-        parser.readFrame(true);
+        parser.readFrame();
         output.clearTrace();
 
         // Headers + 8k response
         sendSimpleGetRequest(3);
 
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // First 1k of body
-        parser.readFrame(true);
+        parser.readFrame();
         output.clearTrace();
     }
 
@@ -102,7 +102,7 @@ public class TestHttp2Section_5_2 extends Http2TestBase {
 
     private void readBytes(int len, int expected, boolean eos) throws Exception {
         sendWindowUpdate(3, len);
-        parser.readFrame(true);
+        parser.readFrame();
         String expectedTrace = "3-Body-" + expected + "\n";
         if (eos) {
             expectedTrace += "3-EndOfStream\n";
@@ -115,6 +115,6 @@ public class TestHttp2Section_5_2 extends Http2TestBase {
     private void clearRemainder() throws Exception {
         // Remainder
         sendWindowUpdate(3, 8192);
-        parser.readFrame(true);
+        parser.readFrame();
     }
 }
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_5_3.java b/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
index 6001b3e1a3..32fdb9fed6 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_5_3.java
@@ -39,7 +39,7 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
 
         sendPriority(3,  3,  15);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[1]\n",  output.getTrace());
     }
@@ -73,7 +73,7 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
         // Set the default window size to 1024 bytes
         sendSettings(0, false, new SettingValue(4, 1024));
         // Wait for the ack
-        parser.readFrame(true);
+        parser.readFrame();
         // Debugging Gump failure
         log.info(output.getTrace());
         output.clearTrace();
@@ -90,10 +90,10 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
         // stream 17's window and the connection window.
         sendSimpleGetRequest(17);
         // 17-headers, 17-1k-body
-        parser.readFrame(true);
+        parser.readFrame();
         // Debugging Gump failure
         log.info(output.getTrace());
-        parser.readFrame(true);
+        parser.readFrame();
         // Debugging Gump failure
         log.info(output.getTrace());
         output.clearTrace();
@@ -110,10 +110,10 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
 
         // Read some frames
         // 19-headers, 21-headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Debugging Gump failure
         log.info(output.getTrace());
-        parser.readFrame(true);
+        parser.readFrame();
         // Debugging Gump failure
         log.info(output.getTrace());
         output.clearTrace();
@@ -155,7 +155,7 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
         boolean seen21 = false;
         while (!seen19 || !seen21) {
             sendWindowUpdate(0, 1);
-            parser.readFrame(true);
+            parser.readFrame();
             // Debugging Gump failure
             log.info(output.getTrace());
             int[] data = parseBodyFrame(output.getTrace());
@@ -183,7 +183,7 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
         Thread.sleep(1000);
 
         sendWindowUpdate(0, 1024);
-        parser.readFrame(true);
+        parser.readFrame();
 
         // Make sure you have read the big comment before the loop above. It is
         // possible that the timing of the server threads is such that there are
@@ -193,7 +193,7 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
             // Debugging Gump failure
             log.info(output.getTrace());
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
             data = parseBodyFrame(output.getTrace());
         }
 
@@ -221,7 +221,7 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
                 Assert.fail("Unexpected stream: [" + output.getTrace() + "]");
             }
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
             data = parseBodyFrame(output.getTrace());
         }
         // Debugging Gump failure
@@ -235,7 +235,7 @@ public class TestHttp2Section_5_3 extends Http2TestBase {
         // Read remaining frames
         // 17-7k-body, 19~8k-body, 21~8k-body
         for (int i = 0; i < 3; i++) {
-            parser.readFrame(true);
+            parser.readFrame();
             // Debugging Gump failure
             log.info(output.getTrace());
         }
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_5_5.java b/test/org/apache/coyote/http2/TestHttp2Section_5_5.java
index 44ba7ec8db..fb9966757a 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_5_5.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_5_5.java
@@ -55,7 +55,7 @@ public class TestHttp2Section_5_5 extends Http2TestBase {
         // Unknown setting (should be ack'd)
         sendSettings(0, false, new SettingValue(1 << 15, 0));
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("0-Settings-Ack\n",  output.getTrace());
     }
@@ -71,7 +71,7 @@ public class TestHttp2Section_5_5 extends Http2TestBase {
         // Ping
         sendPing();
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("0-Ping-Ack-[0,0,0,0,0,0,0,0]\n", output.getTrace());
     }
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_3.java b/test/org/apache/coyote/http2/TestHttp2Section_6_3.java
index 3aa24a772e..0b9c956769 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_6_3.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_6_3.java
@@ -78,7 +78,7 @@ public class TestHttp2Section_6_3 extends Http2TestBase {
         os.flush();
 
         // Read reset frame
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[" + Http2Error.FRAME_SIZE_ERROR.getCode() + "]\n",
                 output.getTrace());
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_4.java b/test/org/apache/coyote/http2/TestHttp2Section_6_4.java
index eb8b0d99a9..a587294cac 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_6_4.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_6_4.java
@@ -71,7 +71,7 @@ public class TestHttp2Section_6_4 extends Http2TestBase {
         os.flush();
 
         // Read reset frame
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[" + Http2Error.FRAME_SIZE_ERROR.getCode() + "]\n",
                 output.getTrace());
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_5.java b/test/org/apache/coyote/http2/TestHttp2Section_6_5.java
index d31ce00e90..306bd89671 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_6_5.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_6_5.java
@@ -117,7 +117,7 @@ public class TestHttp2Section_6_5 extends Http2TestBase {
         sendSettings(0, false, new SettingValue(0xFF,0xFF));
 
         // Ack
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertTrue(output.getTrace(), output.getTrace().startsWith(
                 "0-Settings-Ack"));
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_6.java b/test/org/apache/coyote/http2/TestHttp2Section_6_6.java
index 455ba6f1d0..cdf19bbec1 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_6_6.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_6_6.java
@@ -63,15 +63,15 @@ public class TestHttp2Section_6_6  extends Http2TestBase {
 
         // Read the response
         // push promise
-        parser.readFrame(true);
+        parser.readFrame();
         // stream 3 response headers
-        parser.readFrame(true);
+        parser.readFrame();
         // stream 3 response body
-        parser.readFrame(true);
+        parser.readFrame();
         // stream 2 response headers
-        parser.readFrame(true);
+        parser.readFrame();
         // stream 2 response body
-        parser.readFrame(true);
+        parser.readFrame();
 
         String trace = output.getTrace();
 
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_7.java b/test/org/apache/coyote/http2/TestHttp2Section_6_7.java
index 7a50f2321e..d9186486fb 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_6_7.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_6_7.java
@@ -39,7 +39,7 @@ public class TestHttp2Section_6_7 extends Http2TestBase {
         sendPing(0, false, "01234567".getBytes(StandardCharsets.ISO_8859_1));
 
         // Ping ack
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("0-Ping-Ack-[48,49,50,51,52,53,54,55]\n", output.getTrace());
     }
@@ -54,7 +54,7 @@ public class TestHttp2Section_6_7 extends Http2TestBase {
         sendPing(0, false, "76543210".getBytes(StandardCharsets.ISO_8859_1));
 
         // Ping ack (only for second ping)
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("0-Ping-Ack-[55,54,53,52,51,50,49,48]\n", output.getTrace());
     }
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_8.java b/test/org/apache/coyote/http2/TestHttp2Section_6_8.java
index b80b1a9512..b2de519e6b 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_6_8.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_6_8.java
@@ -47,7 +47,7 @@ public class TestHttp2Section_6_8 extends Http2TestBase {
         getTomcatInstance().getConnector().pause();
 
         // Go away
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("0-Goaway-[2147483647]-[0]-[null]", output.getTrace());
         output.clearTrace();
 
@@ -59,14 +59,14 @@ public class TestHttp2Section_6_8 extends Http2TestBase {
         // Should be ignored
         sendSimpleGetRequest(5);
 
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals(getSimpleResponseTrace(3),  output.getTrace());
         output.clearTrace();
 
         // Finally the go away frame
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("0-Goaway-[3]-[0]-[null]", output.getTrace());
     }
 
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_6_9.java b/test/org/apache/coyote/http2/TestHttp2Section_6_9.java
index 6fecb93696..25186671d1 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_6_9.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_6_9.java
@@ -47,7 +47,7 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         sendSimplePostRequest(3,  null,  false);
         sendWindowUpdate(3, 0);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[" + Http2Error.PROTOCOL_ERROR.getCode() + "]\n",
                 output.getTrace());
@@ -109,9 +109,9 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         // response at this point
         sendEmptyGetRequest(17);
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Body
-        parser.readFrame(true);
+        parser.readFrame();
 
         // Release Stream 15 which is waiting for a single byte.
         sendWindowUpdate(0,  1024);
@@ -130,7 +130,7 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         // Super size the flow control window.
         sendWindowUpdate(3, (1 << 31) - 1);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[" + Http2Error.FLOW_CONTROL_ERROR.getCode() + "]\n",
                 output.getTrace());
@@ -171,7 +171,7 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         // window.
         sendSettings(0, false, new SettingValue(4, 4 * 1024));
         // Ack
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("0-Settings-Ack\n", output.getTrace());
         output.clearTrace();
 
@@ -179,8 +179,8 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         writeFrame(dataFrameHeader, dataPayload);
 
         // Window size updates after reading POST body
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         Assert.assertEquals(
                 "0-WindowSize-[8192]\n" +
                 "3-WindowSize-[8192]\n",
@@ -188,8 +188,8 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         output.clearTrace();
 
         // Read stream 3 headers and first part of body
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         Assert.assertEquals(
                 "3-HeadersStart\n" +
                 "3-Header-[:status]-[200]\n" +
@@ -203,7 +203,7 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         // control window. This should make the stream 3 window negative
         sendSettings(0, false, new SettingValue(4, 2 * 1024));
         // Ack
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("0-Settings-Ack\n", output.getTrace());
         output.clearTrace();
 
@@ -211,23 +211,23 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         // window. The stream 3 window should still be negative
         sendSettings(0, false, new SettingValue(4, 3 * 1024));
         // Ack
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("0-Settings-Ack\n", output.getTrace());
         output.clearTrace();
 
         // Do a POST that won't be affected by the above limit
         sendSimplePostRequest(5, null);
         // Window size updates after reading POST body
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         Assert.assertEquals(
                 "0-WindowSize-[128]\n" +
                 "5-WindowSize-[128]\n",
                 output.getTrace());
         output.clearTrace();
         // Headers + body
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         Assert.assertEquals(
                 "5-HeadersStart\n" +
                 "5-Header-[:status]-[200]\n" +
@@ -244,7 +244,7 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
 
         // Settings ack and stream 3 body are written from different threads.
         // Order depends on server side timing. Handle both possibilities.
-        parser.readFrame(true);
+        parser.readFrame();
         String trace = output.getTrace();
         String settingsAck = "0-Settings-Ack\n";
         String endOfStreamThree = "3-Body-4096\n3-EndOfStream\n";
@@ -252,13 +252,13 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         if (settingsAck.equals(trace)) {
             // Ack the end of stream 3
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
             Assert.assertEquals(endOfStreamThree, output.getTrace());
         } else {
             // End of stream 3 thenack
             Assert.assertEquals(endOfStreamThree, output.getTrace());
             output.clearTrace();
-            parser.readFrame(true);
+            parser.readFrame();
             Assert.assertEquals(settingsAck, output.getTrace());
         }
         output.clearTrace();
@@ -278,7 +278,7 @@ public class TestHttp2Section_6_9 extends Http2TestBase {
         // Now increase beyond the limit via a settings frame
         sendSettings(0, false, new SettingValue(4,  1 << 30));
         // Ack
-        parser.readFrame(true);
+        parser.readFrame();
         Assert.assertEquals("3-RST-[" + Http2Error.FLOW_CONTROL_ERROR.getCode() + "]\n",
                 output.getTrace());
 
diff --git a/test/org/apache/coyote/http2/TestHttp2Section_8_1.java b/test/org/apache/coyote/http2/TestHttp2Section_8_1.java
index 981bf20c5b..8e22bb3429 100644
--- a/test/org/apache/coyote/http2/TestHttp2Section_8_1.java
+++ b/test/org/apache/coyote/http2/TestHttp2Section_8_1.java
@@ -75,10 +75,10 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
         // Trailers
         writeFrame(trailerFrameHeader, trailerPayload);
 
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
 
         String len;
         if (allowTrailerHeader) {
@@ -155,7 +155,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
         // Write the headers
         writeFrame(headersFrameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-HeadersStart\n" +
                 "3-Header-[:status]-[100]\n" +
@@ -166,10 +166,10 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
         // Write the body
         writeFrame(dataFrameHeader, dataPayload);
 
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals("0-WindowSize-[256]\n" +
                 "3-WindowSize-[256]\n" +
@@ -243,7 +243,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
         writeFrame(headersFrameHeader, headersPayload);
 
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[1]\n", output.getTrace());
     }
@@ -266,7 +266,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
 
         writeFrame(headersFrameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         String trace = output.getTrace();
         Assert.assertTrue(trace, trace.contains("3-Header-[:status]-[200]"));
@@ -291,7 +291,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
 
         writeFrame(headersFrameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         String trace = output.getTrace();
         Assert.assertTrue(trace, trace.contains("0-Goaway-[1]-[9]"));
@@ -316,7 +316,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
 
         writeFrame(headersFrameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         String trace = output.getTrace();
         Assert.assertTrue(trace, trace.contains("3-Header-[:status]-[200]"));
@@ -341,7 +341,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
 
         writeFrame(headersFrameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         String trace = output.getTrace();
         Assert.assertTrue(trace, trace.contains("3-Header-[:status]-[200]"));
@@ -403,7 +403,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
 
         writeFrame(headersFrameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         String trace = output.getTrace();
         Assert.assertTrue(trace, trace.contains("0-Goaway-[1]-[9]"));
@@ -419,7 +419,7 @@ public class TestHttp2Section_8_1 extends Http2TestBase {
         // Write the headers
         writeFrame(headersFrameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[1]\n", output.getTrace());
     }
diff --git a/test/org/apache/coyote/http2/TestHttp2Timeouts.java b/test/org/apache/coyote/http2/TestHttp2Timeouts.java
index f3179c9f53..3768b5888e 100644
--- a/test/org/apache/coyote/http2/TestHttp2Timeouts.java
+++ b/test/org/apache/coyote/http2/TestHttp2Timeouts.java
@@ -39,13 +39,13 @@ public class TestHttp2Timeouts extends Http2TestBase {
         sendSimpleGetRequest(3);
 
         // Settings
-        parser.readFrame(false);
+        parser.readFrame();
         // Headers
-        parser.readFrame(false);
+        parser.readFrame();
 
         output.clearTrace();
 
-        parser.readFrame(false);
+        parser.readFrame();
         Assert.assertEquals("3-RST-[11]\n", output.getTrace());
     }
 
@@ -61,13 +61,13 @@ public class TestHttp2Timeouts extends Http2TestBase {
         sendLargeGetRequest(3);
 
         // Settings
-        parser.readFrame(false);
+        parser.readFrame();
         // Headers
-        parser.readFrame(false);
+        parser.readFrame();
 
         output.clearTrace();
 
-        parser.readFrame(false);
+        parser.readFrame();
         Assert.assertEquals("3-RST-[11]\n", output.getTrace());
     }
 
@@ -80,10 +80,10 @@ public class TestHttp2Timeouts extends Http2TestBase {
         sendSimplePostRequest(3,  null,  false);
 
         // Headers
-        parser.readFrame(false);
+        parser.readFrame();
         output.clearTrace();
 
-        parser.readFrame(false);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[11]\n", output.getTrace());
     }
@@ -97,10 +97,10 @@ public class TestHttp2Timeouts extends Http2TestBase {
         sendParameterPostRequest(3, null, null, 10, false);
 
         // Headers
-        parser.readFrame(false);
+        parser.readFrame();
         output.clearTrace();
 
-        parser.readFrame(false);
+        parser.readFrame();
 
         Assert.assertEquals("3-RST-[11]\n", output.getTrace());
     }
diff --git a/test/org/apache/coyote/http2/TestHttp2UpgradeHandler.java b/test/org/apache/coyote/http2/TestHttp2UpgradeHandler.java
index e818205b2d..f96895980a 100644
--- a/test/org/apache/coyote/http2/TestHttp2UpgradeHandler.java
+++ b/test/org/apache/coyote/http2/TestHttp2UpgradeHandler.java
@@ -53,10 +53,10 @@ public class TestHttp2UpgradeHandler extends Http2TestBase {
         writeFrame(frameHeader, headersPayload);
 
         // Headers
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
         // Body
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals(
                 "3-HeadersStart\n" +
@@ -165,11 +165,11 @@ public class TestHttp2UpgradeHandler extends Http2TestBase {
             // - ping
             // - headers (for response)
             // - data (for response body)
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
-            parser.readFrame(true);
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
+            parser.readFrame();
 
             Assert.assertEquals("0-Settings-[3]-[200]\n" +
                     "0-Settings-End\n" +
diff --git a/test/org/apache/coyote/http2/TestHttpServlet.java b/test/org/apache/coyote/http2/TestHttpServlet.java
index cb98abd23a..de3749cd48 100644
--- a/test/org/apache/coyote/http2/TestHttpServlet.java
+++ b/test/org/apache/coyote/http2/TestHttpServlet.java
@@ -45,8 +45,8 @@ public class TestHttpServlet extends Http2TestBase {
         // Body
         writeFrame(dataFrameHeader, dataPayload);
 
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
 
         String trace = output.getTrace();
         String[] lines = trace.split("\n");
diff --git a/test/org/apache/coyote/http2/TestStream.java b/test/org/apache/coyote/http2/TestStream.java
index e34788395e..6cdb581d58 100644
--- a/test/org/apache/coyote/http2/TestStream.java
+++ b/test/org/apache/coyote/http2/TestStream.java
@@ -104,11 +104,11 @@ public class TestStream extends Http2TestBase {
         writeFrame(frameHeader, headersPayload);
 
         // Headers
-        parser.readFrame(true);
+        parser.readFrame();
         // Body
-        parser.readFrame(true);
+        parser.readFrame();
         // Trailers
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals(
                 "3-HeadersStart\n" +
diff --git a/test/org/apache/coyote/http2/TestStreamProcessor.java b/test/org/apache/coyote/http2/TestStreamProcessor.java
index b7480ed22f..8516d98f22 100644
--- a/test/org/apache/coyote/http2/TestStreamProcessor.java
+++ b/test/org/apache/coyote/http2/TestStreamProcessor.java
@@ -72,7 +72,7 @@ public class TestStreamProcessor extends Http2TestBase {
         readSimpleGetResponse();
         // Flush before startAsync means body is written in two packets so an
         // additional frame needs to be read
-        parser.readFrame(true);
+        parser.readFrame();
 
         Assert.assertEquals(
                 "3-HeadersStart\n" +
@@ -151,7 +151,7 @@ public class TestStreamProcessor extends Http2TestBase {
 
         writeFrame(frameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         StringBuilder expected = new StringBuilder();
         expected.append("3-HeadersStart\n");
@@ -201,7 +201,7 @@ public class TestStreamProcessor extends Http2TestBase {
 
         writeFrame(frameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         StringBuilder expected = new StringBuilder();
         expected.append("3-HeadersStart\n");
@@ -246,7 +246,7 @@ public class TestStreamProcessor extends Http2TestBase {
 
         writeFrame(frameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         StringBuilder expected = new StringBuilder();
         expected.append("3-HeadersStart\n");
@@ -290,7 +290,7 @@ public class TestStreamProcessor extends Http2TestBase {
 
         writeFrame(frameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         StringBuilder expected = new StringBuilder();
         expected.append("3-HeadersStart\n");
@@ -334,7 +334,7 @@ public class TestStreamProcessor extends Http2TestBase {
 
         writeFrame(frameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         StringBuilder expected = new StringBuilder();
         expected.append("3-HeadersStart\n");
@@ -380,7 +380,7 @@ public class TestStreamProcessor extends Http2TestBase {
 
         writeFrame(frameHeader, headersPayload);
 
-        parser.readFrame(true);
+        parser.readFrame();
 
         StringBuilder expected = new StringBuilder();
         expected.append("3-HeadersStart\n");
diff --git a/test/org/apache/coyote/http2/TestStreamQueryString.java b/test/org/apache/coyote/http2/TestStreamQueryString.java
index 154231b4e2..0997717f6d 100644
--- a/test/org/apache/coyote/http2/TestStreamQueryString.java
+++ b/test/org/apache/coyote/http2/TestStreamQueryString.java
@@ -131,11 +131,11 @@ public class TestStreamQueryString extends Http2TestBase {
         // - ping
         // - headers (for response)
         // - data (for response body)
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
-        parser.readFrame(true);
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
+        parser.readFrame();
 
         Assert.assertEquals("0-Settings-[3]-[200]\n" +
                 "0-Settings-End\n" +
diff --git a/test/org/apache/coyote/http2/TesterHttp2Parser.java b/test/org/apache/coyote/http2/TesterHttp2Parser.java
index 6cc41fd289..ee0a4b3b1d 100644
--- a/test/org/apache/coyote/http2/TesterHttp2Parser.java
+++ b/test/org/apache/coyote/http2/TesterHttp2Parser.java
@@ -33,9 +33,16 @@ public class TesterHttp2Parser extends Http2Parser {
         this.output = output;
     }
 
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * <b>Note:</b> The test implementation always uses blocking IO for both the
+     * initial read and the remainder.
+     */
     @Override
-    public boolean readFrame(boolean block) throws Http2Exception, IOException {
-        return super.readFrame(block);
+    public boolean readFrame() throws Http2Exception, IOException {
+        return super.readFrame();
     }
 
     @Override


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


[tomcat] 02/02: BZ 66281 - unexpected timeouts when using HTTP/2 and NIO2

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8a762896a7f6c8f7870322651e7bf1cb53abb8d8
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Fri Sep 30 18:17:14 2022 +0100

    BZ 66281 - unexpected timeouts when using HTTP/2 and NIO2
    
    Tiemouts may appear as client disconnections
    https://bz.apache.org/bugzilla/show_bug.cgi?id=66281
---
 java/org/apache/coyote/http2/Http2UpgradeHandler.java | 18 ++++++++++++++----
 webapps/docs/changelog.xml                            |  4 ++++
 2 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/java/org/apache/coyote/http2/Http2UpgradeHandler.java b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
index 4073411e25..e5f8d73a00 100644
--- a/java/org/apache/coyote/http2/Http2UpgradeHandler.java
+++ b/java/org/apache/coyote/http2/Http2UpgradeHandler.java
@@ -267,6 +267,10 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH
             log.debug(sm.getString("upgradeHandler.prefaceReceived", connectionId));
         }
 
+        // Allow streams and connection to determine timeouts
+        socketWrapper.setReadTimeout(-1);
+        socketWrapper.setWriteTimeout(-1);
+
         processConnection(webConnection, stream);
     }
 
@@ -348,10 +352,7 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH
                     socketWrapper.getLock().unlock();
                 }
                 try {
-                    // There is data to read so use the read timeout while
-                    // reading frames ...
-                    socketWrapper.setReadTimeout(protocol.getReadTimeout());
-                    // ... and disable the connection timeout
+                    // Disable the connection timeout while frames are processed
                     setConnectionTimeout(-1);
                     while (true) {
                         try {
@@ -1528,6 +1529,15 @@ class Http2UpgradeHandler extends AbstractStream implements InternalHttpUpgradeH
         int thisRead = 0;
 
         while (len > 0) {
+            // Blocking reads use the protocol level read timeout. Non-blocking
+            // reads do not timeout. The intention is that once a frame has
+            // started to be read, the read timeout applies until it is
+            // completely read.
+            if (nextReadBlock) {
+                socketWrapper.setReadTimeout(protocol.getReadTimeout());
+            } else {
+                socketWrapper.setReadTimeout(-1);
+            }
             thisRead = socketWrapper.read(nextReadBlock, data, pos, len);
             if (thisRead == 0) {
                 if (nextReadBlock) {
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index e7b4a6868e..dc92160c4c 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -111,6 +111,10 @@
         <bug>66276</bug>: Fix incorrect class cast when adding
         a descendant of HTTP/2 streams. (lihan)
       </fix>
+      <fix>
+        <bug>66281</bug>: Fix unexpected timeouts that may appear as client
+        disconnections when using HTTP/2 and NIO2. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">


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