aboutsummaryrefslogtreecommitdiffstats
path: root/test/ws_timeout_hibernate_handler.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2011-09-22 21:33:56 +0200
committerLoïc Hoguin <[email protected]>2011-09-22 23:15:54 +0200
commitd0f711a61d54e3286b71017d20a9cc8fe1eff7ed (patch)
tree64171fd0a49a900bc73782c2193801023ea5e810 /test/ws_timeout_hibernate_handler.erl
parent04f55eb3c925705da28b3509b2f7e6b203632391 (diff)
downloadcowboy-d0f711a61d54e3286b71017d20a9cc8fe1eff7ed.tar.gz
cowboy-d0f711a61d54e3286b71017d20a9cc8fe1eff7ed.tar.bz2
cowboy-d0f711a61d54e3286b71017d20a9cc8fe1eff7ed.zip
Add a test for websocket hibernate + timeout and fix this use case
The issue was that we were calling erlang:hibernate before a receive .. after .. end call. Erlang hibernates the process before reaching the receive instruction and we therefore couldn't enter the after clause when hibernating. This is now fixed by using erlang:send_after instead and receiving that message instead of using an after clause.
Diffstat (limited to 'test/ws_timeout_hibernate_handler.erl')
-rw-r--r--test/ws_timeout_hibernate_handler.erl29
1 files changed, 29 insertions, 0 deletions
diff --git a/test/ws_timeout_hibernate_handler.erl b/test/ws_timeout_hibernate_handler.erl
new file mode 100644
index 0000000..777948a
--- /dev/null
+++ b/test/ws_timeout_hibernate_handler.erl
@@ -0,0 +1,29 @@
+%% Feel free to use, reuse and abuse the code in this file.
+
+-module(ws_timeout_hibernate_handler).
+-behaviour(cowboy_http_handler).
+-behaviour(cowboy_http_websocket_handler).
+-export([init/3, handle/2, terminate/2]).
+-export([websocket_init/3, websocket_handle/3,
+ websocket_info/3, websocket_terminate/3]).
+
+init(_Any, _Req, _Opts) ->
+ {upgrade, protocol, cowboy_http_websocket}.
+
+handle(_Req, _State) ->
+ exit(badarg).
+
+terminate(_Req, _State) ->
+ exit(badarg).
+
+websocket_init(_TransportName, Req, _Opts) ->
+ {ok, Req, undefined, 1000, hibernate}.
+
+websocket_handle(_Frame, Req, State) ->
+ {ok, Req, State, hibernate}.
+
+websocket_info(_Info, Req, State) ->
+ {ok, Req, State, hibernate}.
+
+websocket_terminate(_Reason, _Req, _State) ->
+ ok.