1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
From c3559d494b19fb28d745889b0f4e0aaeb6f0c824 Mon Sep 17 00:00:00 2001
From: Simone Bordet <simone.bordet@gmail.com>
Date: Mon, 11 Aug 2025 19:20:40 +0200
Subject: HTTP2Session cleanups.
Various cleanups.
Updated mismatch in parameter configuration between code and XML files.
Signed-off-by: Simone Bordet <simone.bordet@gmail.com>
---
.../org/eclipse/jetty/http2/HTTP2Session.java | 35 +++++++++++++++----
.../jetty/http2/parser/BodyParser.java | 4 +--
.../jetty/http2/parser/HeaderParser.java | 5 +++
.../eclipse/jetty/http2/parser/Parser.java | 5 +++
.../http2/parser/WindowUpdateBodyParser.java | 7 ++--
.../src/main/config/etc/jetty-http2.xml | 2 +-
.../src/main/config/etc/jetty-http2c.xml | 2 +-
.../src/main/config/modules/http2.mod | 2 +-
.../src/main/config/modules/http2c.mod | 2 +-
9 files changed, 48 insertions(+), 16 deletions(-)
diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java
index 07281e28ec5..bcef69bbdf2 100644
--- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java
+++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/HTTP2Session.java
@@ -548,8 +548,17 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements Session
}
else
{
- if (!isStreamClosed(streamId))
+ if (isStreamClosed(streamId))
+ {
+ // SPEC: this case must not be treated as an error.
+ // However, we want to rate control it.
+ if (!rateControlOnEvent(frame))
+ onConnectionFailure(ErrorCode.ENHANCE_YOUR_CALM_ERROR.code, "invalid_window_update_frame_rate");
+ }
+ else
+ {
onConnectionFailure(ErrorCode.PROTOCOL_ERROR.code, "unexpected_window_update_frame");
+ }
}
}
else
@@ -726,14 +735,26 @@ public abstract class HTTP2Session extends ContainerLifeCycle implements Session
void reset(HTTP2Stream stream, ResetFrame frame, Callback callback)
{
- control(stream, Callback.from(() ->
+ if (rateControlOnEvent(frame))
{
- if (stream != null)
+ control(stream, Callback.from(() ->
{
- stream.close();
- removeStream(stream);
- }
- }, callback), frame);
+ if (stream != null)
+ {
+ stream.close();
+ removeStream(stream);
+ }
+ }, callback), frame);
+ }
+ else
+ {
+ onConnectionFailure(ErrorCode.ENHANCE_YOUR_CALM_ERROR.code, "invalid_rst_stream_frame_rate");
+ }
+ }
+
+ private boolean rateControlOnEvent(Object event)
+ {
+ return getParser().rateControlOnEvent(event);
}
/**
diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/BodyParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/BodyParser.java
index 02da72d8484..cab182a455a 100644
--- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/BodyParser.java
+++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/BodyParser.java
@@ -226,7 +226,7 @@ public abstract class BodyParser
protected boolean streamFailure(int streamId, int error, String reason)
{
notifyStreamFailure(streamId, error, reason);
- return false;
+ return true;
}
private void notifyStreamFailure(int streamId, int error, String reason)
@@ -243,6 +243,6 @@ public abstract class BodyParser
protected boolean rateControlOnEvent(Object o)
{
- return headerParser.getRateControl().onEvent(o);
+ return headerParser.rateControlOnEvent(o);
}
}
diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderParser.java
index 273afdd8d7a..0ebe562e45e 100644
--- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderParser.java
+++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeaderParser.java
@@ -45,6 +45,11 @@ public class HeaderParser
return rateControl;
}
+ boolean rateControlOnEvent(Object event)
+ {
+ return getRateControl().onEvent(event);
+ }
+
protected void reset()
{
state = State.LENGTH;
diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/Parser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/Parser.java
index 74dc1d0f427..edddeb061f1 100644
--- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/Parser.java
+++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/Parser.java
@@ -90,6 +90,11 @@ public class Parser
bodyParsers[FrameType.CONTINUATION.getType()] = new ContinuationBodyParser(headerParser, listener, headerBlockParser, headerBlockFragments);
}
+ public boolean rateControlOnEvent(Object event)
+ {
+ return headerParser.rateControlOnEvent(event);
+ }
+
protected Listener getListener()
{
return listener;
diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/WindowUpdateBodyParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/WindowUpdateBodyParser.java
index 8a64cbac0d1..509263e27c1 100644
--- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/WindowUpdateBodyParser.java
+++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/WindowUpdateBodyParser.java
@@ -89,15 +89,16 @@ public class WindowUpdateBodyParser extends BodyParser
private boolean onWindowUpdate(ByteBuffer buffer, int windowDelta)
{
int streamId = getStreamId();
+ WindowUpdateFrame frame = new WindowUpdateFrame(streamId, windowDelta);
+ reset();
if (windowDelta == 0)
{
if (streamId == 0)
return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_window_update_frame");
- else
+ if (rateControlOnEvent(frame))
return streamFailure(streamId, ErrorCode.PROTOCOL_ERROR.code, "invalid_window_update_frame");
+ return connectionFailure(buffer, ErrorCode.ENHANCE_YOUR_CALM_ERROR.code, "invalid_window_update_frame_rate");
}
- WindowUpdateFrame frame = new WindowUpdateFrame(streamId, windowDelta);
- reset();
notifyWindowUpdate(frame);
return true;
}
diff --git a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2.xml b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2.xml
index a185f7fadca..cafea3dad89 100644
--- a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2.xml
+++ b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2.xml
@@ -12,7 +12,7 @@
<Set name="maxSettingsKeys"><Property name="jetty.http2.maxSettingsKeys" default="64"/></Set>
<Set name="rateControlFactory">
<New class="org.eclipse.jetty.http2.WindowRateControl$Factory">
- <Arg type="int"><Property name="jetty.http2.rateControl.maxEventsPerSecond" default="50"/></Arg>
+ <Arg type="int"><Property name="jetty.http2.rateControl.maxEventsPerSecond" default="128"/></Arg>
</New>
</Set>
</New>
diff --git a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2c.xml b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2c.xml
index 71020ac9c88..cf52d701c9d 100644
--- a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2c.xml
+++ b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/etc/jetty-http2c.xml
@@ -12,7 +12,7 @@
<Set name="maxSettingsKeys" property="jetty.http2c.maxSettingsKeys"/>
<Set name="rateControlFactory">
<New class="org.eclipse.jetty.http2.WindowRateControl$Factory">
- <Arg type="int"><Property name="jetty.http2c.rateControl.maxEventsPerSecond" default="50"/></Arg>
+ <Arg type="int"><Property name="jetty.http2c.rateControl.maxEventsPerSecond" default="128"/></Arg>
</New>
</Set>
</New>
diff --git a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2.mod b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2.mod
index 34081544e88..f0ede3ca8b3 100644
--- a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2.mod
+++ b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2.mod
@@ -35,5 +35,5 @@ etc/jetty-http2.xml
## Specifies the maximum number of bad frames and pings per second,
## after which a session is closed to avoid denial of service attacks.
-# jetty.http2.rateControl.maxEventsPerSecond=50
+# jetty.http2.rateControl.maxEventsPerSecond=128
# end::documentation[]
diff --git a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2c.mod b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2c.mod
index 573d4158a50..20d3ea4af31 100644
--- a/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2c.mod
+++ b/jetty-core/jetty-http2/jetty-http2-server/src/main/config/modules/http2c.mod
@@ -33,5 +33,5 @@ etc/jetty-http2c.xml
## Specifies the maximum number of bad frames and pings per second,
## after which a session is closed to avoid denial of service attacks.
-# jetty.http2c.rateControl.maxEventsPerSecond=50
+# jetty.http2c.rateControl.maxEventsPerSecond=128
# end::documentation[]
--
2.30.2
|