@@ -76,8 +76,15 @@ else if (hasFlag(Flags.END_HEADERS))
76
76
}
77
77
else
78
78
{
79
- headerBlockFragments .setStreamId (getStreamId ());
80
- headerBlockFragments .setEndStream (isEndStream ());
79
+ if (headerBlockFragments .getStreamId () != 0 )
80
+ {
81
+ connectionFailure (buffer , ErrorCode .PROTOCOL_ERROR .code , "invalid_headers_frame" );
82
+ }
83
+ else
84
+ {
85
+ headerBlockFragments .setStreamId (getStreamId ());
86
+ headerBlockFragments .setEndStream (isEndStream ());
87
+ }
81
88
}
82
89
}
83
90
@@ -172,6 +179,18 @@ else if (hasFlag(Flags.PRIORITY))
172
179
break ;
173
180
}
174
181
case HEADERS :
182
+ {
183
+ if (!hasFlag (Flags .END_HEADERS ))
184
+ {
185
+ headerBlockFragments .setStreamId (getStreamId ());
186
+ headerBlockFragments .setEndStream (isEndStream ());
187
+ if (hasFlag (Flags .PRIORITY ))
188
+ headerBlockFragments .setPriorityFrame (new PriorityFrame (getStreamId (), parentStreamId , weight , exclusive ));
189
+ }
190
+ state = State .HEADER_BLOCK ;
191
+ break ;
192
+ }
193
+ case HEADER_BLOCK :
175
194
{
176
195
if (hasFlag (Flags .END_HEADERS ))
177
196
{
@@ -196,7 +215,7 @@ else if (hasFlag(Flags.PRIORITY))
196
215
{
197
216
HeadersFrame frame = new HeadersFrame (getStreamId (), metaData , null , isEndStream ());
198
217
if (!rateControlOnEvent (frame ))
199
- connectionFailure (buffer , ErrorCode .ENHANCE_YOUR_CALM_ERROR .code , "invalid_headers_frame_rate" );
218
+ return connectionFailure (buffer , ErrorCode .ENHANCE_YOUR_CALM_ERROR .code , "invalid_headers_frame_rate" );
200
219
}
201
220
}
202
221
}
@@ -205,16 +224,14 @@ else if (hasFlag(Flags.PRIORITY))
205
224
int remaining = buffer .remaining ();
206
225
if (remaining < length )
207
226
{
208
- headerBlockFragments .storeFragment (buffer , remaining , false );
227
+ if (!headerBlockFragments .storeFragment (buffer , remaining , false ))
228
+ return connectionFailure (buffer , ErrorCode .PROTOCOL_ERROR .code , "invalid_headers_frame" );
209
229
length -= remaining ;
210
230
}
211
231
else
212
232
{
213
- headerBlockFragments .setStreamId (getStreamId ());
214
- headerBlockFragments .setEndStream (isEndStream ());
215
- if (hasFlag (Flags .PRIORITY ))
216
- headerBlockFragments .setPriorityFrame (new PriorityFrame (getStreamId (), parentStreamId , weight , exclusive ));
217
- headerBlockFragments .storeFragment (buffer , length , false );
233
+ if (!headerBlockFragments .storeFragment (buffer , length , false ))
234
+ return connectionFailure (buffer , ErrorCode .PROTOCOL_ERROR .code , "invalid_headers_frame" );
218
235
state = State .PADDING ;
219
236
loop = paddingLength == 0 ;
220
237
}
@@ -258,6 +275,6 @@ private void onHeaders(HeadersFrame frame)
258
275
259
276
private enum State
260
277
{
261
- PREPARE , PADDING_LENGTH , EXCLUSIVE , PARENT_STREAM_ID , PARENT_STREAM_ID_BYTES , WEIGHT , HEADERS , PADDING
278
+ PREPARE , PADDING_LENGTH , EXCLUSIVE , PARENT_STREAM_ID , PARENT_STREAM_ID_BYTES , WEIGHT , HEADERS , HEADER_BLOCK , PADDING
262
279
}
263
280
}
0 commit comments