From 3c648709aa4e51a8ae8b5a46cdb94132397ea8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 23 Sep 2019 12:44:22 +0200 Subject: Accept all cow_http2_machine options --- src/gun.erl | 20 +++++++++++++++++++- src/gun_http2.erl | 35 +++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/gun.erl b/src/gun.erl index da91514..255e2ac 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -183,7 +183,25 @@ -type http2_opts() :: #{ closing_timeout => timeout(), flow => pos_integer(), - keepalive => timeout() + keepalive => timeout(), + + %% Options copied from cow_http2_machine. + connection_window_margin_size => 0..16#7fffffff, + connection_window_update_threshold => 0..16#7fffffff, + enable_connect_protocol => boolean(), + initial_connection_window_size => 65535..16#7fffffff, + initial_stream_window_size => 0..16#7fffffff, + max_connection_window_size => 0..16#7fffffff, + max_concurrent_streams => non_neg_integer() | infinity, + max_decode_table_size => non_neg_integer(), + max_encode_table_size => non_neg_integer(), + max_frame_size_received => 16384..16777215, + max_frame_size_sent => 16384..16777215 | infinity, + max_stream_window_size => 0..16#7fffffff, + preface_timeout => timeout(), + settings_timeout => timeout(), + stream_window_margin_size => 0..16#7fffffff, + stream_window_update_threshold => 0..16#7fffffff }. -export_type([http2_opts/0]). diff --git a/src/gun_http2.erl b/src/gun_http2.erl index 9ddf9bb..7041ad9 100644 --- a/src/gun_http2.erl +++ b/src/gun_http2.erl @@ -53,7 +53,7 @@ owner :: pid(), socket :: inet:socket() | ssl:sslsocket(), transport :: module(), - opts = #{} :: map(), %% @todo + opts = #{} :: gun:http2_opts(), content_handlers :: gun_content_handler:opt(), buffer = <<>> :: binary(), @@ -89,15 +89,30 @@ do_check_options([{keepalive, infinity}|Opts]) -> do_check_options(Opts); do_check_options([{keepalive, K}|Opts]) when is_integer(K), K > 0 -> do_check_options(Opts); -%% @todo Add all http2_machine options. -do_check_options([{initial_connection_window_size, _}|Opts]) -> - do_check_options(Opts); -do_check_options([{initial_stream_window_size, _}|Opts]) -> - do_check_options(Opts); -do_check_options([{max_frame_size_received, _}|Opts]) -> - do_check_options(Opts); -do_check_options([Opt|_]) -> - {error, {options, {http2, Opt}}}. +do_check_options([Opt={Name, _}|Opts]) -> + %% We blindly accept all cow_http2_machine options. + HTTP2MachineOpts = [ + connection_window_margin_size, + connection_window_update_threshold, + enable_connect_protocol, + initial_connection_window_size, + initial_stream_window_size, + max_connection_window_size, + max_concurrent_streams, + max_decode_table_size, + max_encode_table_size, + max_frame_size_received, + max_frame_size_sent, + max_stream_window_size, + preface_timeout, + settings_timeout, + stream_window_margin_size, + stream_window_update_threshold + ], + case lists:member(Name, HTTP2MachineOpts) of + true -> do_check_options(Opts); + false -> {error, {options, {http2, Opt}}} + end. name() -> http2. opts_name() -> http2_opts. -- cgit v1.2.3