aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cowboy_http_protocol.erl7
-rw-r--r--src/cowboy_http_websocket.erl7
-rw-r--r--test/http_SUITE.erl2
-rw-r--r--test/http_handler_loop_timeout.erl15
4 files changed, 23 insertions, 8 deletions
diff --git a/src/cowboy_http_protocol.erl b/src/cowboy_http_protocol.erl
index 9fad2d0..7713a7e 100644
--- a/src/cowboy_http_protocol.erl
+++ b/src/cowboy_http_protocol.erl
@@ -331,16 +331,15 @@ handler_loop_timeout(State=#state{loop_timeout=Timeout,
loop_timeout_ref=PrevRef}) ->
_ = case PrevRef of undefined -> ignore; PrevRef ->
erlang:cancel_timer(PrevRef) end,
- TRef = make_ref(),
- erlang:send_after(Timeout, self(), {?MODULE, timeout, TRef}),
+ TRef = erlang:start_timer(Timeout, self(), ?MODULE),
State#state{loop_timeout_ref=TRef}.
-spec handler_loop(any(), #http_req{}, #state{}) -> ok.
handler_loop(HandlerState, Req, State=#state{loop_timeout_ref=TRef}) ->
receive
- {?MODULE, timeout, TRef} ->
+ {timeout, TRef, ?MODULE} ->
terminate_request(HandlerState, Req, State);
- {?MODULE, timeout, OlderTRef} when is_reference(OlderTRef) ->
+ {timeout, OlderTRef, ?MODULE} when is_reference(OlderTRef) ->
handler_loop(HandlerState, Req, State);
Message ->
handler_call(HandlerState, Req, State, Message)
diff --git a/src/cowboy_http_websocket.erl b/src/cowboy_http_websocket.erl
index ab96e93..f3f1cae 100644
--- a/src/cowboy_http_websocket.erl
+++ b/src/cowboy_http_websocket.erl
@@ -232,8 +232,7 @@ handler_loop_timeout(State=#state{timeout=infinity}) ->
handler_loop_timeout(State=#state{timeout=Timeout, timeout_ref=PrevRef}) ->
_ = case PrevRef of undefined -> ignore; PrevRef ->
erlang:cancel_timer(PrevRef) end,
- TRef = make_ref(),
- erlang:send_after(Timeout, self(), {?MODULE, timeout, TRef}),
+ TRef = erlang:start_timer(Timeout, self(), ?MODULE),
State#state{timeout_ref=TRef}.
%% @private
@@ -248,9 +247,9 @@ handler_loop(State=#state{messages={OK, Closed, Error}, timeout_ref=TRef},
handler_terminate(State, Req, HandlerState, {error, closed});
{Error, Socket, Reason} ->
handler_terminate(State, Req, HandlerState, {error, Reason});
- {?MODULE, timeout, TRef} ->
+ {timeout, TRef, ?MODULE} ->
websocket_close(State, Req, HandlerState, {normal, timeout});
- {?MODULE, timeout, OlderTRef} when is_reference(OlderTRef) ->
+ {timeout, OlderTRef, ?MODULE} when is_reference(OlderTRef) ->
handler_loop(State, Req, HandlerState, SoFar);
Message ->
handler_call(State, Req, HandlerState,
diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl
index a94a410..82b7cae 100644
--- a/test/http_SUITE.erl
+++ b/test/http_SUITE.erl
@@ -246,6 +246,7 @@ init_dispatch(Config) ->
{[<<"simple_post">>], rest_forbidden_resource, [false]},
{[<<"nodelete">>], rest_nodelete_resource, []},
{[<<"resetags">>], rest_resource_etags, []},
+ {[<<"loop_timeout">>], http_handler_loop_timeout, []},
{[], http_handler, []}
]}
].
@@ -370,6 +371,7 @@ check_status(Config) ->
{102, "/long_polling"},
{200, "/"},
{200, "/simple"},
+ {204, "/loop_timeout"},
{400, "/static/%2f"},
{400, "/static/%2e"},
{400, "/static/%2e%2e"},
diff --git a/test/http_handler_loop_timeout.erl b/test/http_handler_loop_timeout.erl
new file mode 100644
index 0000000..76d6ea8
--- /dev/null
+++ b/test/http_handler_loop_timeout.erl
@@ -0,0 +1,15 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+-module(http_handler_loop_timeout).
+-export([init/3, info/3, terminate/2]).
+
+init({_, http}, Req, _) ->
+ erlang:send_after(1000, self(), error_timeout),
+ {loop, Req, undefined, 500, hibernate}.
+
+info(error_timeout, Req, State) ->
+ {ok, Req2} = cowboy_http_req:reply(500, Req),
+ {ok, Req2, State}.
+
+terminate(_, _) ->
+ ok.