Browse Source

Fix http2 settings parsing when there's more data

Tony Han 7 years ago
parent
commit
b3cafd4fb5
1 changed files with 7 additions and 1 deletions
  1. 7 1
      src/cow_http2.erl

+ 7 - 1
src/cow_http2.erl

@@ -184,7 +184,7 @@ parse(<< Len:24, 4:8, _:7, 0:1, _:1, 0:31, _/bits >>) when Len rem 6 =/= 0 ->
 	{connection_error, frame_size_error, 'SETTINGS frames MUST have a length multiple of 6. (RFC7540 6.5)'};
 parse(<< Len:24, 4:8, _:7, 0:1, _:1, 0:31, Rest/bits >>) when byte_size(Rest) >= Len ->
 	parse_settings_payload(Rest, Len, #{});
-parse(<< _:24, 4:8, _/bits >>) ->
+parse(<< _:24, 4:8, _:8, _:1, StreamID:31, _/bits >>) when StreamID =/= 0 ->
 	{connection_error, protocol_error, 'SETTINGS frames MUST NOT be associated with a stream. (RFC7540 6.5)'};
 %%
 %% PUSH_PROMISE frames.
@@ -278,6 +278,12 @@ parse_windows_update_test() ->
 	{ok, {window_update, 12345}, <<>>} = parse(WindowUpdate),
 	{ok, {window_update, 12345}, << 42 >>} = parse(<< WindowUpdate/binary, 42 >>),
 	ok.
+
+parse_settings_test() ->
+	more = parse(<< 0:24, 4:8, 1:8, 0:8 >>),
+	{ok, settings_ack, <<>>} = parse(<< 0:24, 4:8, 1:8, 0:32 >>),
+	{connection_error, protocol_error, _} = parse(<< 0:24, 4:8, 1:8, 0:1, 1:31 >>),
+	ok.
 -endif.
 
 parse_fin(0) -> nofin;