diff options
author | Loïc Hoguin <[email protected]> | 2019-10-05 13:04:21 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2019-10-05 13:04:21 +0200 |
commit | c50d6aa09c9028dca3365516d30f1242cfd43306 (patch) | |
tree | 15a830f48a396df30f48e1746dfd0a572abc7fc8 /src/cowboy_websocket.erl | |
parent | 618c001291a8d822809a7add87d31a44eafc1e4b (diff) | |
download | cowboy-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.erl | 8 |
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) -> |