diff --git a/src/wsock_handshake.erl b/src/wsock_handshake.erl index 10d03cd..1bdf3d5 100644 --- a/src/wsock_handshake.erl +++ b/src/wsock_handshake.erl @@ -17,7 +17,7 @@ -module(wsock_handshake). -include("wsock.hrl"). --export([open/3, handle_response/2]). +-export([open/3, open/4, handle_response/2]). -export([handle_open/1, response/1]). -define(VERSION, 13). @@ -83,6 +83,25 @@ open(Resource, Host, Port) -> {ok, #handshake{ version = ?VERSION, type = open, message = Message}}. +-spec open(Resource ::string(), Host ::string(), Port::integer(), Cookie::string()) -> {ok, #handshake{}}. +open(Resource, Host, Port, Cookie) when is_integer(Port) -> + RequestLine = [ + {method, "GET"}, + {version, "1.1"}, + {resource, Resource} + ], + + Headers =[ + {"Host", lists:flatten([Host, ":", integer_to_list(Port)])}, + {"Upgrade", "websocket"}, + {"Connection", "upgrade"}, + {"Sec-Websocket-Key", wsock_key:generate()}, + {"Sec-Websocket-Version", integer_to_list(?VERSION)}, + {"Cookie", Cookie} + ], + Message = wsock_http:build(request, RequestLine, Headers), + {ok, #handshake{ version = ?VERSION, type = open, message = Message}}. + %======================= % INTERNAL FUNCTIONS %======================= diff --git a/src/wsock_message.erl b/src/wsock_message.erl index cfc6886..0eed313 100644 --- a/src/wsock_message.erl +++ b/src/wsock_message.erl @@ -27,7 +27,7 @@ %%======================================== %% Types %%======================================== --type message_type() :: begin_message | continue_message. +-type message_type() :: begin_message | continue_message | continue. % @type decode_options() = masked. % @type encode_options() = mask. @@ -357,6 +357,8 @@ process_frame(open_close, _, Frame, Message) -> frame_to_complete_message(Frame, Message); process_frame(open_continue, _, Frame, Message) -> frame_for_fragmented_message(Frame, Message); +process_frame(continue, begin_message, Frame, Message) -> + frame_for_fragmented_message(Frame, Message); process_frame(continue, continue_message, Frame, Message) -> frame_for_fragmented_message(Frame, Message); process_frame(continue_close, continue_message, Frame, Message) ->