aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/src/manual/gun.asciidoc4
-rw-r--r--src/gun.erl5
-rw-r--r--src/gun_http.erl2
-rw-r--r--src/gun_http2.erl2
-rw-r--r--test/gun_SUITE.erl14
5 files changed, 24 insertions, 3 deletions
diff --git a/doc/src/manual/gun.asciidoc b/doc/src/manual/gun.asciidoc
index b690558..02d0b86 100644
--- a/doc/src/manual/gun.asciidoc
+++ b/doc/src/manual/gun.asciidoc
@@ -57,12 +57,12 @@ Configuration for the HTTP protocol.
The following keys are defined:
-keepalive => pos_integer()::
+keepalive => timeout()::
Time between pings in milliseconds. Since the HTTP protocol has
no standardized way to ping the server, Gun will simply send an
empty line when the connection is idle. Gun only makes a best
effort here as servers usually have configurable limits to drop
- idle connections. Defaults to 5000.
+ idle connections. Use `infinity` to disable. Defaults to 5000.
transform_header_name => fun((LowercaseName :: binary()) -> TransformedName :: binary()) | undefined::
A function that will be applied to all header names before they
are sent to the server. Gun assumes that all header names are in
diff --git a/src/gun.erl b/src/gun.erl
index 4857344..e9155b2 100644
--- a/src/gun.erl
+++ b/src/gun.erl
@@ -624,7 +624,10 @@ before_loop(State=#state{opts=Opts, protocol=Protocol}) ->
end,
ProtoOpts = maps:get(ProtoOptsKey, Opts, #{}),
Keepalive = maps:get(keepalive, ProtoOpts, 5000),
- KeepaliveRef = erlang:send_after(Keepalive, self(), keepalive),
+ KeepaliveRef = case Keepalive of
+ infinity -> undefined;
+ _ -> erlang:send_after(Keepalive, self(), keepalive)
+ end,
loop(State#state{keepalive_ref=KeepaliveRef}).
loop(State=#state{parent=Parent, owner=Owner, owner_ref=OwnerRef, host=Host, port=Port, opts=Opts,
diff --git a/src/gun_http.erl b/src/gun_http.erl
index 3766ca5..204ce4a 100644
--- a/src/gun_http.erl
+++ b/src/gun_http.erl
@@ -60,6 +60,8 @@ check_options(Opts) ->
do_check_options([]) ->
ok;
+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);
do_check_options([{version, V}|Opts]) when V =:= 'HTTP/1.1'; V =:= 'HTTP/1.0' ->
diff --git a/src/gun_http2.erl b/src/gun_http2.erl
index 4e108ae..38017b3 100644
--- a/src/gun_http2.erl
+++ b/src/gun_http2.erl
@@ -74,6 +74,8 @@ check_options(Opts) ->
do_check_options([]) ->
ok;
+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);
do_check_options([Opt={content_handlers, Handlers}|Opts]) ->
diff --git a/test/gun_SUITE.erl b/test/gun_SUITE.erl
index 842d40c..a7e2169 100644
--- a/test/gun_SUITE.erl
+++ b/test/gun_SUITE.erl
@@ -110,6 +110,20 @@ info(_) ->
#{sock_ip := _, sock_port := _} = gun:info(Pid),
ok.
+keepalive_infinity(_) ->
+ doc("Ensure infinity for keepalive is accepted by all protocols."),
+ {ok, Pid} = gun:open("localhost", 12345, #{
+ http_opts => #{keepalive => infinity},
+ http2_opts => #{keepalive => infinity},
+ retry => 0}),
+ Ref = monitor(process, Pid),
+ receive
+ {'DOWN', Ref, process, Pid, {{gone, _}, _}} ->
+ ok
+ after 5000 ->
+ error(timeout)
+ end.
+
reply_to(_) ->
doc("The reply_to option allows using a separate process for requests."),
do_reply_to(http),