|
38 | 38 |
|
39 | 39 | -module(elli_ws_protocol).
|
40 | 40 |
|
| 41 | +-include_lib("elli/src/elli_util.hrl"). |
| 42 | + |
41 | 43 | %% Ignore the deprecation warning for crypto:sha/1.
|
42 | 44 | %% @todo Remove when we support only R16B+.
|
43 | 45 | -compile(nowarn_deprecated_function).
|
@@ -92,14 +94,16 @@ upgrade(Req, Env, Handler, HandlerOpts) ->
|
92 | 94 | try websocket_upgrade(State, Req) of
|
93 | 95 | {ok, State2, Req2} -> handler_init(State2, Req2, HandlerOpts)
|
94 | 96 | catch
|
95 |
| - throw:Exc -> |
96 |
| - handle_event(Req, Handler, websocket_throw, [Exc, erlang:get_stacktrace()], HandlerOpts), |
| 97 | + throw:{ResponseCode, Headers, Body} when is_integer(ResponseCode) -> |
| 98 | + {response, ResponseCode, Headers, Body}; |
| 99 | + ?WITH_STACKTRACE(throw, Exc, Stacktrace) |
| 100 | + handle_event(Req, Handler, websocket_throw, [Exc, Stacktrace], HandlerOpts), |
97 | 101 | elli_ws_request_adapter:maybe_reply(400, Req);
|
98 |
| - error:Error -> |
99 |
| - handle_event(Req, Handler, websocket_error, [Error, erlang:get_stacktrace()], HandlerOpts), |
| 102 | + ?WITH_STACKTRACE(error, Error, Stacktrace) |
| 103 | + handle_event(Req, Handler, websocket_error, [Error, Stacktrace], HandlerOpts), |
100 | 104 | elli_ws_request_adapter:maybe_reply(400, Req);
|
101 |
| - exit:Exit -> |
102 |
| - handle_event(Req, Handler, websocket_exit, [Exit, erlang:get_stacktrace()], HandlerOpts), |
| 105 | + ?WITH_STACKTRACE(exit, Exit, Stacktrace) |
| 106 | + handle_event(Req, Handler, websocket_exit, [Exit, Stacktrace], HandlerOpts), |
103 | 107 | elli_ws_request_adapter:maybe_reply(400, Req)
|
104 | 108 | end.
|
105 | 109 |
|
@@ -169,14 +173,16 @@ handler_init(State=#state{env=Env, handler=Handler}, Req, HandlerOpts) ->
|
169 | 173 | elli_ws_request_adapter:ensure_response(Req2, 400),
|
170 | 174 | {ok, Req2, [{result, closed}|Env]}
|
171 | 175 | catch
|
172 |
| - throw:Exc -> |
173 |
| - handle_event(Req, Handler, websocket_throw, [Exc, erlang:get_stacktrace()], HandlerOpts), |
| 176 | + throw:{ResponseCode, Headers, Body} when is_integer(ResponseCode) -> |
| 177 | + {response, ResponseCode, Headers, Body}; |
| 178 | + ?WITH_STACKTRACE(throw, Exc, Stacktrace) |
| 179 | + handle_event(Req, Handler, websocket_throw, [Exc, Stacktrace], HandlerOpts), |
174 | 180 | elli_ws_request_adapter:maybe_reply(400, Req);
|
175 |
| - error:Error -> |
176 |
| - handle_event(Req, Handler, websocket_error, [Error, erlang:get_stacktrace()], HandlerOpts), |
| 181 | + ?WITH_STACKTRACE(error, Error, Stacktrace) |
| 182 | + handle_event(Req, Handler, websocket_error, [Error, Stacktrace], HandlerOpts), |
177 | 183 | elli_ws_request_adapter:maybe_reply(400, Req);
|
178 |
| - exit:Exit -> |
179 |
| - handle_event(Req, Handler, websocket_exit, [Exit, erlang:get_stacktrace()], HandlerOpts), |
| 184 | + ?WITH_STACKTRACE(exit, Exit, Stacktrace) |
| 185 | + handle_event(Req, Handler, websocket_exit, [Exit, Stacktrace], HandlerOpts), |
180 | 186 | elli_ws_request_adapter:maybe_reply(400, Req)
|
181 | 187 | end.
|
182 | 188 |
|
@@ -665,12 +671,14 @@ handler_call(State=#state{handler=Handler}, Req, HandlerState,
|
665 | 671 | {shutdown, Req2, HandlerState2} ->
|
666 | 672 | websocket_close(State, Req2, HandlerState2, {normal, shutdown})
|
667 | 673 | catch
|
668 |
| - throw:Exc -> |
669 |
| - handle_event(Req, Handler, websocket_throw, [Exc, erlang:get_stacktrace()], HandlerState); |
670 |
| - error:Error -> |
671 |
| - handle_event(Req, Handler, websocket_error, [Error, erlang:get_stacktrace()], HandlerState); |
672 |
| - exit:Exit -> |
673 |
| - handle_event(Req, Handler, websocket_exit, [Exit, erlang:get_stacktrace()], HandlerState) |
| 674 | + throw:{ResponseCode, Headers, Body} when is_integer(ResponseCode) -> |
| 675 | + {response, ResponseCode, Headers, Body}; |
| 676 | + ?WITH_STACKTRACE(throw, Exc, Stacktrace) |
| 677 | + handle_event(Req, Handler, websocket_throw, [Exc, Stacktrace], HandlerState); |
| 678 | + ?WITH_STACKTRACE(error, Error, Stacktrace) |
| 679 | + handle_event(Req, Handler, websocket_error, [Error, Stacktrace], HandlerState); |
| 680 | + ?WITH_STACKTRACE(exit, Exit, Stacktrace) |
| 681 | + handle_event(Req, Handler, websocket_exit, [Exit, Stacktrace], HandlerState) |
674 | 682 | end.
|
675 | 683 |
|
676 | 684 | websocket_opcode(text) -> 1;
|
|
0 commit comments