aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_websocket.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2019-10-05 13:04:21 +0200
committerLoïc Hoguin <[email protected]>2019-10-05 13:04:21 +0200
commitc50d6aa09c9028dca3365516d30f1242cfd43306 (patch)
tree15a830f48a396df30f48e1746dfd0a572abc7fc8 /src/cowboy_websocket.erl
parent618c001291a8d822809a7add87d31a44eafc1e4b (diff)
downloadcowboy-c50d6aa09c9028dca3365516d30f1242cfd43306.tar.gz
cowboy-c50d6aa09c9028dca3365516d30f1242cfd43306.tar.bz2
cowboy-c50d6aa09c9028dca3365516d30f1242cfd43306.zip
Don't discard data following a Websocket upgrade request
While the protocol does not allow sending data before receiving a successful Websocket upgrade response, we do not want to discard that data if it does come in.
Diffstat (limited to 'src/cowboy_websocket.erl')
-rw-r--r--src/cowboy_websocket.erl8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/cowboy_websocket.erl b/src/cowboy_websocket.erl
index 9540b75..5cc061a 100644
--- a/src/cowboy_websocket.erl
+++ b/src/cowboy_websocket.erl
@@ -291,10 +291,14 @@ takeover(Parent, Ref, Socket, Transport, _Opts, Buffer,
State = loop_timeout(State0#state{parent=Parent,
ref=Ref, socket=Socket, transport=Transport,
key=undefined, messages=Messages}),
+ %% We call parse_header/3 immediately because there might be
+ %% some data in the buffer that was sent along with the handshake.
+ %% While it is not allowed by the protocol to send frames immediately,
+ %% we still want to process that data if any.
case erlang:function_exported(Handler, websocket_init, 1) of
true -> handler_call(State, HandlerState, #ps_header{buffer=Buffer},
- websocket_init, undefined, fun before_loop/3);
- false -> before_loop(State, HandlerState, #ps_header{buffer=Buffer})
+ websocket_init, undefined, fun parse_header/3);
+ false -> parse_header(State, HandlerState, #ps_header{buffer=Buffer})
end.
before_loop(State=#state{active=false}, HandlerState, ParseState) ->