From 381c1780738cbb02f0065f92991bc43ccd53a0c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Thu, 20 Oct 2011 14:11:17 +0200 Subject: Add a cowboy_http_req:upgrade_reply/3 function and use it for websockets This function doesn't try to add any additional header besides the Connection: Upgrade header. It also doesn't accept a body. It should be used for the intermediate reply to an upgrade process, before the real reply is sent (if any, for example when using TLS). --- src/cowboy_http_websocket.erl | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'src/cowboy_http_websocket.erl') diff --git a/src/cowboy_http_websocket.erl b/src/cowboy_http_websocket.erl index 5f0c61d..8562061 100644 --- a/src/cowboy_http_websocket.erl +++ b/src/cowboy_http_websocket.erl @@ -170,13 +170,12 @@ websocket_handshake(State=#state{version=0, origin=Origin, transport=Transport, raw_host=Host, port=Port, raw_path=Path, raw_qs=QS}, HandlerState) -> Location = hixie76_location(Transport:name(), Host, Port, Path, QS), - {ok, Req2} = cowboy_http_req:reply( + {ok, Req2} = cowboy_http_req:upgrade_reply( <<"101 WebSocket Protocol Handshake">>, - [{<<"Connection">>, <<"Upgrade">>}, - {<<"Upgrade">>, <<"WebSocket">>}, + [{<<"Upgrade">>, <<"WebSocket">>}, {<<"Sec-Websocket-Location">>, Location}, {<<"Sec-Websocket-Origin">>, Origin}], - [], Req#http_req{resp_state=waiting}), + Req#http_req{resp_state=waiting}), %% We replied with a proper response. Proxies should be happy enough, %% we can now read the 8 last bytes of the challenge keys and send %% the challenge response directly to the socket. @@ -187,12 +186,11 @@ websocket_handshake(State=#state{version=0, origin=Origin, Req3, HandlerState, <<>>); websocket_handshake(State=#state{challenge=Challenge}, Req=#http_req{transport=Transport}, HandlerState) -> - {ok, Req2} = cowboy_http_req:reply( - <<"101 Switching Protocols">>, - [{<<"Connection">>, <<"Upgrade">>}, - {<<"Upgrade">>, <<"websocket">>}, + {ok, Req2} = cowboy_http_req:upgrade_reply( + 101, + [{<<"Upgrade">>, <<"websocket">>}, {<<"Sec-Websocket-Accept">>, Challenge}], - [], Req#http_req{resp_state=waiting}), + Req#http_req{resp_state=waiting}), handler_before_loop(State#state{messages=Transport:messages()}, Req2, HandlerState, <<>>). -- cgit v1.2.3