Browse Source

Exit with exit/1 on handler exception and include class in reason

James Fish 10 years ago
parent
commit
2718698895
4 changed files with 15 additions and 10 deletions
  1. 6 4
      src/cowboy_handler.erl
  2. 3 2
      src/cowboy_loop.erl
  3. 3 2
      src/cowboy_rest.erl
  4. 3 2
      src/cowboy_websocket.erl

+ 6 - 4
src/cowboy_handler.erl

@@ -52,13 +52,14 @@ execute(Req, Env) ->
 		Stacktrace = erlang:get_stacktrace(),
 		Stacktrace = erlang:get_stacktrace(),
 		cowboy_req:maybe_reply(Stacktrace, Req),
 		cowboy_req:maybe_reply(Stacktrace, Req),
 		terminate({crash, Class, Reason}, Req, HandlerOpts, Handler),
 		terminate({crash, Class, Reason}, Req, HandlerOpts, Handler),
-		erlang:Class([
+		exit({cowboy_handler, [
+			{class, Class},
 			{reason, Reason},
 			{reason, Reason},
 			{mfa, {Handler, init, 2}},
 			{mfa, {Handler, init, 2}},
 			{stacktrace, Stacktrace},
 			{stacktrace, Stacktrace},
 			{req, cowboy_req:to_list(Req)},
 			{req, cowboy_req:to_list(Req)},
 			{opts, HandlerOpts}
 			{opts, HandlerOpts}
-		])
+		]})
 	end.
 	end.
 
 
 -spec terminate(any(), Req, any(), module()) -> ok when Req::cowboy_req:req().
 -spec terminate(any(), Req, any(), module()) -> ok when Req::cowboy_req:req().
@@ -68,14 +69,15 @@ terminate(Reason, Req, State, Handler) ->
 			try
 			try
 				Handler:terminate(Reason, cowboy_req:lock(Req), State)
 				Handler:terminate(Reason, cowboy_req:lock(Req), State)
 			catch Class:Reason2 ->
 			catch Class:Reason2 ->
-				erlang:Class([
+				exit({cowboy_handler, [
+					{class, Class},
 					{reason, Reason2},
 					{reason, Reason2},
 					{mfa, {Handler, terminate, 3}},
 					{mfa, {Handler, terminate, 3}},
 					{stacktrace, erlang:get_stacktrace()},
 					{stacktrace, erlang:get_stacktrace()},
 					{req, cowboy_req:to_list(Req)},
 					{req, cowboy_req:to_list(Req)},
 					{state, State},
 					{state, State},
 					{terminate_reason, Reason}
 					{terminate_reason, Reason}
-				])
+				]})
 			end;
 			end;
 		false ->
 		false ->
 			ok
 			ok

+ 3 - 2
src/cowboy_loop.erl

@@ -161,13 +161,14 @@ call(Req, State=#state{resp_sent=RespSent},
 			cowboy_req:maybe_reply(Stacktrace, Req)
 			cowboy_req:maybe_reply(Stacktrace, Req)
 		end,
 		end,
 		cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
 		cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
-		erlang:Class([
+		exit({cowboy_handler, [
+			{class, Class},
 			{reason, Reason},
 			{reason, Reason},
 			{mfa, {Handler, info, 3}},
 			{mfa, {Handler, info, 3}},
 			{stacktrace, Stacktrace},
 			{stacktrace, Stacktrace},
 			{req, cowboy_req:to_list(Req)},
 			{req, cowboy_req:to_list(Req)},
 			{state, HandlerState}
 			{state, HandlerState}
-		])
+		]})
 	end.
 	end.
 
 
 %% It is sometimes important to make a socket passive as it was initially
 %% It is sometimes important to make a socket passive as it was initially

+ 3 - 2
src/cowboy_rest.erl

@@ -977,13 +977,14 @@ error_terminate(Req, #state{handler=Handler, handler_state=HandlerState},
 	Stacktrace = erlang:get_stacktrace(),
 	Stacktrace = erlang:get_stacktrace(),
 	cowboy_req:maybe_reply(Stacktrace, Req),
 	cowboy_req:maybe_reply(Stacktrace, Req),
 	cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
 	cowboy_handler:terminate({crash, Class, Reason}, Req, HandlerState, Handler),
-	erlang:Class([
+	exit({cowboy_handler, [
+		{class, Class},
 		{reason, Reason},
 		{reason, Reason},
 		{mfa, {Handler, Callback, 2}},
 		{mfa, {Handler, Callback, 2}},
 		{stacktrace, Stacktrace},
 		{stacktrace, Stacktrace},
 		{req, cowboy_req:to_list(Req)},
 		{req, cowboy_req:to_list(Req)},
 		{state, HandlerState}
 		{state, HandlerState}
-	]).
+	]}).
 
 
 terminate(Req, #state{env=Env, handler=Handler, handler_state=HandlerState}) ->
 terminate(Req, #state{env=Env, handler=Handler, handler_state=HandlerState}) ->
 	Result = cowboy_handler:terminate(normal, Req, HandlerState, Handler),
 	Result = cowboy_handler:terminate(normal, Req, HandlerState, Handler),

+ 3 - 2
src/cowboy_websocket.erl

@@ -350,14 +350,15 @@ handler_call(State=#state{handler=Handler}, Req, HandlerState,
 			websocket_close(State, Req2, HandlerState2, stop)
 			websocket_close(State, Req2, HandlerState2, stop)
 	catch Class:Reason ->
 	catch Class:Reason ->
 		_ = websocket_close(State, Req, HandlerState, {crash, Class, Reason}),
 		_ = websocket_close(State, Req, HandlerState, {crash, Class, Reason}),
-		erlang:Class([
+		exit({cowboy_handler, [
+			{class, Class},
 			{reason, Reason},
 			{reason, Reason},
 			{mfa, {Handler, Callback, 3}},
 			{mfa, {Handler, Callback, 3}},
 			{stacktrace, erlang:get_stacktrace()},
 			{stacktrace, erlang:get_stacktrace()},
 			{msg, Message},
 			{msg, Message},
 			{req, cowboy_req:to_list(Req)},
 			{req, cowboy_req:to_list(Req)},
 			{state, HandlerState}
 			{state, HandlerState}
-		])
+		]})
 	end.
 	end.
 
 
 -spec websocket_send(cow_ws:frame(), #state{}) -> ok | stop | {error, atom()}.
 -spec websocket_send(cow_ws:frame(), #state{}) -> ok | stop | {error, atom()}.