Skip to content

Commit 0b329f0

Browse files
committed
Merge pull request #41 from mitchellwrosen/master
More accurate type spec for websocket_terminate, other minor cleanup
2 parents f465f22 + 2ef3245 commit 0b329f0

File tree

3 files changed

+53
-12
lines changed

3 files changed

+53
-12
lines changed

src/websocket_client.erl

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,33 +154,30 @@ receive_handshake(Buffer, Transport, Socket) ->
154154
end.
155155

156156
%% @doc Send frame to server
157+
-spec send(websocket_req:frame(), websocket_req:req()) -> ok | {error, term()}.
157158
send(Frame, WSReq) ->
158159
Socket = websocket_req:socket(WSReq),
159160
Transport = websocket_req:transport(WSReq),
160161
Transport:send(Socket, encode_frame(Frame)).
161162

162-
163163
%% @doc Main loop
164164
-spec websocket_loop(WSReq :: websocket_req:req(), HandlerState :: any(),
165165
Buffer :: binary()) ->
166166
ok.
167167
websocket_loop(WSReq, HandlerState, Buffer) ->
168168
receive
169-
Message -> handle_websocket_message(WSReq, HandlerState, Buffer, Message)
169+
Message -> handle_websocket_message(WSReq, HandlerState, Buffer, Message)
170170
end.
171171

172172
handle_websocket_message(WSReq, HandlerState, Buffer, Message) ->
173173
[Handler, Remaining, Socket] =
174174
websocket_req:get([handler, remaining, socket], WSReq),
175175
case Message of
176176
keepalive ->
177-
case websocket_req:get([keepalive_timer], WSReq) of
178-
[undefined] -> ok;
179-
[OldTimer] -> erlang:cancel_timer(OldTimer)
180-
end,
177+
cancel_keepalive_timer(WSReq),
181178
ok = send({ping, <<>>}, WSReq),
182179
KATimer = erlang:send_after(websocket_req:keepalive(WSReq), self(), keepalive),
183-
websocket_loop(websocket_req:set([{keepalive_timer,KATimer}], WSReq), HandlerState, Buffer);
180+
websocket_loop(websocket_req:keepalive_timer(KATimer, WSReq), HandlerState, Buffer);
184181
{cast, Frame} ->
185182
ok = send(Frame, WSReq),
186183
websocket_loop(WSReq, HandlerState, Buffer);
@@ -196,7 +193,6 @@ handle_websocket_message(WSReq, HandlerState, Buffer, Message) ->
196193
websocket_req:opcode(WSReq), Remaining, Data, Buffer)
197194
end;
198195
Msg ->
199-
Handler = websocket_req:handler(WSReq),
200196
try Handler:websocket_info(Msg, WSReq, HandlerState) of
201197
HandlerResponse ->
202198
handle_response(WSReq, HandlerResponse, Buffer)
@@ -213,6 +209,16 @@ handle_websocket_message(WSReq, HandlerState, Buffer, Message) ->
213209
end
214210
end.
215211

212+
-spec cancel_keepalive_timer(websocket_req:req()) -> ok.
213+
cancel_keepalive_timer(WSReq) ->
214+
case websocket_req:keepalive_timer(WSReq) of
215+
undefined ->
216+
ok;
217+
OldTimer ->
218+
erlang:cancel_timer(OldTimer),
219+
ok
220+
end.
221+
216222
-spec websocket_close(WSReq :: websocket_req:req(),
217223
HandlerState :: any(),
218224
Reason :: tuple()) -> ok.

src/websocket_client_handler.erl

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,35 @@
22

33
-type state() :: any().
44
-type keepalive() :: integer().
5-
-type close_type() :: normal | error | remote.
5+
6+
-type close_reason() ::
7+
% Either the local end was closed via a `{closed, Reason, State}` tuple
8+
% returned from websocket_handle/3 or websocket_info/3, or the remote end
9+
% was closed during graceful teardown of the connection via a close frame
10+
% (see https://tools.ietf.org/html/rfc6455#section-5.5.1).
11+
{normal, binary()} |
12+
% The transport failed to send (see http://erlang.org/doc/man/gen_tcp.html#send-2
13+
% or http://erlang.org/doc/man/ssl.html#send-2)
14+
{error, term()} |
15+
% The remote end was closed due to a protocol error
16+
% (see https://tools.ietf.org/html/rfc6455#section-7.4.1, status code 1002).
17+
{error, badframe, binary()} |
18+
% The remote end was closed due to an encoding error
19+
% (see https://tools.ietf.org/html/rfc6455#section-7.4.1, status code 1007).
20+
{error, badencoding, binary()} |
21+
% The remote end was closed unexpectedly
22+
% (see https://tools.ietf.org/html/rfc6455#section-7.4.1, status code 1011).
23+
{error, handler, binary()} |
24+
% The remote host closed the socket.
25+
{remote, closed} |
26+
% The remote end was closed for some other reason
27+
% (see https://tools.ietf.org/html/rfc6455#section-7.4.1).
28+
{remote, integer(), binary()} |
29+
% The remote host closed the socket.
30+
% TODO: How is this different than `{remote, closed}`?
31+
{remote, binary()} |
32+
% The handler terminated unexpectedly in websocket_handle/3 or websocket_info/3.
33+
term().
634

735
-callback init(list(), websocket_req:req()) ->
836
{ok, state()}
@@ -18,6 +46,4 @@
1846
| {reply, websocket_req:frame(), state()}
1947
| {close, binary(), state()}.
2048

21-
-callback websocket_terminate({close_type(), term()} | {close_type(), integer(), binary()},
22-
websocket_req:req(), state()) ->
23-
ok.
49+
-callback websocket_terminate(close_reason(), websocket_req:req(), state()) -> ok.

src/websocket_req.erl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
port/2, port/1,
4141
path/2, path/1,
4242
keepalive/2, keepalive/1,
43+
keepalive_timer/2, keepalive_timer/1,
4344
socket/2, socket/1,
4445
transport/2, transport/1,
4546
handler/2, handler/1,
@@ -134,6 +135,14 @@ keepalive(K, Req) ->
134135
Req#websocket_req{keepalive = K}.
135136

136137

138+
-spec keepalive_timer(req()) -> undefined | reference().
139+
keepalive_timer(#websocket_req{keepalive_timer = K}) -> K.
140+
141+
-spec keepalive_timer(reference(), req()) -> req().
142+
keepalive_timer(K, Req) ->
143+
Req#websocket_req{keepalive_timer = K}.
144+
145+
137146
-spec socket(req()) -> inet:socket() | ssl:sslsocket().
138147
socket(#websocket_req{socket = S}) -> S.
139148

0 commit comments

Comments
 (0)