22
22
import org .eclipse .jetty .http2 .frames .HeadersFrame ;
23
23
import org .eclipse .jetty .http2 .frames .PriorityFrame ;
24
24
import org .eclipse .jetty .util .BufferUtil ;
25
+ import org .slf4j .Logger ;
26
+ import org .slf4j .LoggerFactory ;
25
27
26
28
public class HeadersBodyParser extends BodyParser
27
29
{
30
+ private static final Logger LOG = LoggerFactory .getLogger (HeadersBodyParser .class );
31
+
28
32
private final HeaderBlockParser headerBlockParser ;
29
33
private final HeaderBlockFragments headerBlockFragments ;
30
34
private State state = State .PREPARE ;
@@ -71,8 +75,15 @@ else if (hasFlag(Flags.END_HEADERS))
71
75
}
72
76
else
73
77
{
74
- headerBlockFragments .setStreamId (getStreamId ());
75
- headerBlockFragments .setEndStream (isEndStream ());
78
+ if (headerBlockFragments .getStreamId () != 0 )
79
+ {
80
+ connectionFailure (buffer , ErrorCode .PROTOCOL_ERROR .code , "invalid_headers_frame" );
81
+ }
82
+ else
83
+ {
84
+ headerBlockFragments .setStreamId (getStreamId ());
85
+ headerBlockFragments .setEndStream (isEndStream ());
86
+ }
76
87
}
77
88
}
78
89
@@ -167,6 +178,18 @@ else if (hasFlag(Flags.PRIORITY))
167
178
break ;
168
179
}
169
180
case HEADERS :
181
+ {
182
+ if (!hasFlag (Flags .END_HEADERS ))
183
+ {
184
+ headerBlockFragments .setStreamId (getStreamId ());
185
+ headerBlockFragments .setEndStream (isEndStream ());
186
+ if (hasFlag (Flags .PRIORITY ))
187
+ headerBlockFragments .setPriorityFrame (new PriorityFrame (getStreamId (), parentStreamId , weight , exclusive ));
188
+ }
189
+ state = State .HEADER_BLOCK ;
190
+ break ;
191
+ }
192
+ case HEADER_BLOCK :
170
193
{
171
194
if (hasFlag (Flags .END_HEADERS ))
172
195
{
@@ -191,7 +214,7 @@ else if (hasFlag(Flags.PRIORITY))
191
214
{
192
215
HeadersFrame frame = new HeadersFrame (getStreamId (), metaData , null , isEndStream ());
193
216
if (!rateControlOnEvent (frame ))
194
- connectionFailure (buffer , ErrorCode .ENHANCE_YOUR_CALM_ERROR .code , "invalid_headers_frame_rate" );
217
+ return connectionFailure (buffer , ErrorCode .ENHANCE_YOUR_CALM_ERROR .code , "invalid_headers_frame_rate" );
195
218
}
196
219
}
197
220
}
@@ -200,16 +223,14 @@ else if (hasFlag(Flags.PRIORITY))
200
223
int remaining = buffer .remaining ();
201
224
if (remaining < length )
202
225
{
203
- headerBlockFragments .storeFragment (buffer , remaining , false );
226
+ if (!headerBlockFragments .storeFragment (buffer , remaining , false ))
227
+ return connectionFailure (buffer , ErrorCode .PROTOCOL_ERROR .code , "invalid_headers_frame" );
204
228
length -= remaining ;
205
229
}
206
230
else
207
231
{
208
- headerBlockFragments .setStreamId (getStreamId ());
209
- headerBlockFragments .setEndStream (isEndStream ());
210
- if (hasFlag (Flags .PRIORITY ))
211
- headerBlockFragments .setPriorityFrame (new PriorityFrame (getStreamId (), parentStreamId , weight , exclusive ));
212
- headerBlockFragments .storeFragment (buffer , length , false );
232
+ if (!headerBlockFragments .storeFragment (buffer , length , false ))
233
+ return connectionFailure (buffer , ErrorCode .PROTOCOL_ERROR .code , "invalid_headers_frame" );
213
234
state = State .PADDING ;
214
235
loop = paddingLength == 0 ;
215
236
}
@@ -253,6 +274,6 @@ private void onHeaders(HeadersFrame frame)
253
274
254
275
private enum State
255
276
{
256
- PREPARE , PADDING_LENGTH , EXCLUSIVE , PARENT_STREAM_ID , PARENT_STREAM_ID_BYTES , WEIGHT , HEADERS , PADDING
277
+ PREPARE , PADDING_LENGTH , EXCLUSIVE , PARENT_STREAM_ID , PARENT_STREAM_ID_BYTES , WEIGHT , HEADERS , HEADER_BLOCK , PADDING
257
278
}
258
279
}
0 commit comments