aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_websocket.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/cowboy_websocket.erl')
-rw-r--r--src/cowboy_websocket.erl23
1 files changed, 11 insertions, 12 deletions
diff --git a/src/cowboy_websocket.erl b/src/cowboy_websocket.erl
index 757f52c..d932323 100644
--- a/src/cowboy_websocket.erl
+++ b/src/cowboy_websocket.erl
@@ -32,6 +32,12 @@
| {module(), Req, any(), timeout()}
| {module(), Req, any(), timeout(), hibernate}
when Req::cowboy_req:req().
+
+-callback websocket_init(Req, State)
+ -> {ok, Req, State}
+ when Req::cowboy_req:req(), State::any().
+-optional_callbacks([websocket_init/2]).
+
-callback websocket_handle({text | binary | ping | pong, binary()}, Req, State)
-> {ok, Req, State}
| {ok, Req, State, hibernate}
@@ -79,8 +85,8 @@ upgrade(Req, Env, Handler, HandlerState, Timeout, Hibernate) ->
websocket_handshake(State2, Req2, HandlerState, Env)
catch _:_ ->
%% @todo Test that we can have 2 /ws 400 status code in a row on the same connection.
- cowboy_req:reply(400, Req),
- {ok, Req, Env}
+ %% @todo Does this even work?
+ {ok, cowboy_req:reply(400, Req), Env}
end.
-spec websocket_upgrade(#state{}, Req)
@@ -91,7 +97,7 @@ websocket_upgrade(State, Req) ->
%% @todo Should probably send a 426 if the Upgrade header is missing.
[<<"websocket">>] = cowboy_req:parse_header(<<"upgrade">>, Req),
Version = cowboy_req:header(<<"sec-websocket-version">>, Req),
- IntVersion = list_to_integer(binary_to_list(Version)),
+ IntVersion = binary_to_integer(Version),
true = (IntVersion =:= 7) orelse (IntVersion =:= 8)
orelse (IntVersion =:= 13),
Key = cowboy_req:header(<<"sec-websocket-key">>, Req),
@@ -102,6 +108,7 @@ websocket_upgrade(State, Req) ->
-> {ok, #state{}, Req} when Req::cowboy_req:req().
websocket_extensions(State, Req) ->
%% @todo We want different options for this. For example
+ %% @todo This should probably be configurable per handler, like timeout/hibernate.
%% * compress everything auto
%% * compress only text auto
%% * compress only binary auto
@@ -368,15 +375,7 @@ handler_call(State=#state{handler=Handler}, Req, HandlerState,
websocket_close(State, Req2, HandlerState2, stop)
catch Class:Reason ->
_ = websocket_close(State, Req, HandlerState, {crash, Class, Reason}),
- exit({cowboy_handler, [
- {class, Class},
- {reason, Reason},
- {mfa, {Handler, Callback, 3}},
- {stacktrace, erlang:get_stacktrace()},
- {msg, Message},
- {req, Req},
- {state, HandlerState}
- ]})
+ erlang:raise(Class, Reason, erlang:get_stacktrace())
end.
-spec websocket_send(cow_ws:frame(), #state{}) -> ok | stop | {error, atom()}.