From 48f05433d2642b6db5a8cd0ab946172f963a5353 Mon Sep 17 00:00:00 2001 From: Tony Han Date: Sat, 22 Jul 2017 19:40:49 +0800 Subject: [PATCH] Fix: ignore unknown settings frame --- src/h2_frame_settings.erl | 2 ++ test/http2_spec_6_5_SUITE.erl | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/h2_frame_settings.erl b/src/h2_frame_settings.erl index 9dbe78a7..1fbe2a08 100644 --- a/src/h2_frame_settings.erl +++ b/src/h2_frame_settings.erl @@ -102,6 +102,8 @@ parse_settings(<<0,5,Val:4/binary,T/binary>>, S) -> parse_settings(T, [{?SETTINGS_MAX_FRAME_SIZE, binary:decode_unsigned(Val)}|S]); parse_settings(<<0,6,Val:4/binary,T/binary>>, S)-> parse_settings(T, [{?SETTINGS_MAX_HEADER_LIST_SIZE, binary:decode_unsigned(Val)}|S]); +parse_settings(<<_:6/binary,T/binary>>, S)-> + parse_settings(T, S); parse_settings(<<>>, Settings) -> Settings. diff --git a/test/http2_spec_6_5_SUITE.erl b/test/http2_spec_6_5_SUITE.erl index d2471057..a30569ea 100644 --- a/test/http2_spec_6_5_SUITE.erl +++ b/test/http2_spec_6_5_SUITE.erl @@ -8,6 +8,7 @@ all() -> [ sends_invalid_push_setting, + sends_unknown_settings_frame, sends_value_above_max_flow_control_window_size, sends_max_frame_size_too_small, sends_max_frame_size_too_big @@ -37,6 +38,21 @@ sends_invalid_push_setting(_Config) -> ?assertEqual(?PROTOCOL_ERROR, (h2_frame_goaway:error_code(GoAway))), ok. +sends_unknown_settings_frame(_Config) -> + {ok, Client} = http2c:start_link(), + + Bin = <<16#00,16#00,16#06,16#04,16#00,16#00,16#00,16#00,16#00, + 16#254,16#03,16#00,16#00,16#00,16#01>>, + http2c:send_binary(Client, Bin), + + Resp = http2c:wait_for_n_frames(Client, 0, 1), + ct:pal("Resp: ~p", [Resp]), + ?assertEqual(1, (length(Resp))), + [{Header, Payload}] = Resp, + ?assertEqual(?SETTINGS, (Header#frame_header.type)), + ?assertEqual({settings, []}, (Payload)), + ok. + sends_value_above_max_flow_control_window_size(_Config) -> {ok, Client} = http2c:start_link(), Bin = <<16#00,16#00,16#06,16#04,16#00,16#00,16#00,16#00,16#00,