aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2011-05-27 12:32:02 +0200
committerLoïc Hoguin <[email protected]>2011-05-27 12:32:02 +0200
commitad2e905a81cc03b29857fd91e424d7cea484c8c7 (patch)
tree5f914d1079a4d03254a9b5ab56147fb054195a82
parent3e55cb62c9053895412b1cf2a65d54ef90eda34c (diff)
downloadcowboy-ad2e905a81cc03b29857fd91e424d7cea484c8c7.tar.gz
cowboy-ad2e905a81cc03b29857fd91e424d7cea484c8c7.tar.bz2
cowboy-ad2e905a81cc03b29857fd91e424d7cea484c8c7.zip
Send a meaningful error to error_logger on websocket handler crashes.
Same as commit 4c4030a792a94d96f8bda5076fcfdc03a590030e but for websockets. See also issue #13 on github.
-rw-r--r--src/cowboy_http_websocket.erl45
1 files changed, 34 insertions, 11 deletions
diff --git a/src/cowboy_http_websocket.erl b/src/cowboy_http_websocket.erl
index 9a1a17a..f262de3 100644
--- a/src/cowboy_http_websocket.erl
+++ b/src/cowboy_http_websocket.erl
@@ -60,14 +60,19 @@ key_to_integer(Key) ->
-spec handler_init(#state{}, #http_req{}) -> ok.
handler_init(State=#state{handler=Handler, opts=Opts},
Req=#http_req{transport=Transport}) ->
- case catch Handler:websocket_init(Transport:name(), Req, Opts) of
+ try Handler:websocket_init(Transport:name(), Req, Opts) of
{ok, Req2, HandlerState} ->
websocket_handshake(State, Req2, HandlerState);
{ok, Req2, HandlerState, Timeout} ->
websocket_handshake(State#state{timeout=Timeout},
- Req2, HandlerState);
- {'EXIT', _Reason} ->
- upgrade_error(Req)
+ Req2, HandlerState)
+ catch Class:Reason ->
+ upgrade_error(Req),
+ error_logger:error_msg(
+ "** Handler ~p terminating in websocket_init/3~n"
+ " for the reason ~p:~p~n** Options were ~p~n"
+ "** Request was ~p~n** Stacktrace: ~p~n~n",
+ [Handler, Class, Reason, Opts, Req, erlang:get_stacktrace()])
end.
-spec upgrade_error(#http_req{}) -> ok.
@@ -145,18 +150,25 @@ websocket_frame(State, Req, HandlerState, _Data, _FrameType) ->
websocket_close(State, Req, HandlerState, {error, badframe}).
-spec handler_call(#state{}, #http_req{}, any(), binary(), any(), fun()) -> ok.
-handler_call(State=#state{handler=Handler}, Req, HandlerState,
+handler_call(State=#state{handler=Handler, opts=Opts}, Req, HandlerState,
RemainingData, Message, NextState) ->
- case catch Handler:websocket_handle(Message, Req, HandlerState) of
+ try Handler:websocket_handle(Message, Req, HandlerState) of
{ok, Req2, HandlerState2} ->
NextState(State, Req2, HandlerState2, RemainingData);
{reply, Data, Req2, HandlerState2} ->
websocket_send(Data, Req2),
NextState(State, Req2, HandlerState2, RemainingData);
{shutdown, Req2, HandlerState2} ->
- websocket_close(State, Req2, HandlerState2, {normal, shutdown});
- {'EXIT', _Reason} ->
- websocket_close(State, Req, HandlerState, {error, handler})
+ websocket_close(State, Req2, HandlerState2, {normal, shutdown})
+ catch Class:Reason ->
+ websocket_close(State, Req, HandlerState, {error, handler}),
+ error_logger:error_msg(
+ "** Handler ~p terminating in websocket_handle/3~n"
+ " for the reason ~p:~p~n** Message was ~p~n"
+ "** Options were ~p~n** Handler state was ~p~n"
+ "** Request was ~p~n** Stacktrace: ~p~n~n",
+ [Handler, Class, Reason, Message, Opts,
+ HandlerState, Req, erlang:get_stacktrace()])
end.
-spec websocket_send(binary(), #http_req{}) -> ok.
@@ -172,5 +184,16 @@ websocket_close(State, Req=#http_req{socket=Socket, transport=Transport},
-spec handler_terminate(#state{}, #http_req{},
any(), atom() | {atom(), atom()}) -> ok.
-handler_terminate(#state{handler=Handler}, Req, HandlerState, Reason) ->
- Handler:websocket_terminate(Reason, Req, HandlerState).
+handler_terminate(#state{handler=Handler, opts=Opts},
+ Req, HandlerState, TerminateReason) ->
+ try
+ Handler:websocket_terminate(TerminateReason, Req, HandlerState)
+ catch Class:Reason ->
+ error_logger:error_msg(
+ "** Handler ~p terminating in websocket_terminate/3~n"
+ " for the reason ~p:~p~n** Initial reason was ~p~n"
+ "** Options were ~p~n** Handler state was ~p~n"
+ "** Request was ~p~n** Stacktrace: ~p~n~n",
+ [Handler, Class, Reason, TerminateReason, Opts,
+ HandlerState, Req, erlang:get_stacktrace()])
+ end.