Просмотр исходного кода

Send a meaningful error to error_logger on websocket handler crashes.

Same as commit 4c4030a792a94d96f8bda5076fcfdc03a590030e but for websockets.
See also issue #13 on github.
Loïc Hoguin 14 лет назад
Родитель
Сommit
ad2e905a81
1 измененных файлов с 34 добавлено и 11 удалено
  1. 34 11
      src/cowboy_http_websocket.erl

+ 34 - 11
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.