0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 12:40:25 +00:00

Add {close, StatusCode, Payload} and fix {close, Payload}

This commit is contained in:
Loïc Hoguin 2012-12-08 19:11:56 +01:00
parent d2ccd2e090
commit 6d4e15705f
2 changed files with 20 additions and 11 deletions

View file

@ -22,7 +22,8 @@
-export([handler_loop/4]).
-type frame() :: close | ping | pong
| {text | binary | close | ping | pong, binary()}.
| {text | binary | close | ping | pong, binary()}
| {close, 1000..4999, binary()}.
-export_type([frame/0]).
-type opcode() :: 0 | 1 | 2 | 8 | 9 | 10.
@ -541,22 +542,30 @@ websocket_send(Type, #state{socket=Socket, transport=Transport})
when Type =:= ping; Type =:= pong ->
Opcode = websocket_opcode(Type),
Transport:send(Socket, << 1:1, 0:3, Opcode:4, 0:8 >>);
websocket_send({close, Payload}, State) ->
websocket_send({close, 1000, Payload}, State);
websocket_send({Type = close, StatusCode, Payload}, #state{
socket=Socket, transport=Transport}) ->
Opcode = websocket_opcode(Type),
Len = 2 + iolist_size(Payload),
%% Control packets must not be > 125 in length.
true = Len =< 125,
BinLen = hybi_payload_length(Len),
Transport:send(Socket,
[<< 1:1, 0:3, Opcode:4, 0:1, BinLen/bits, StatusCode:16 >>, Payload]),
shutdown;
websocket_send({Type, Payload}, #state{socket=Socket, transport=Transport}) ->
Opcode = websocket_opcode(Type),
Len = iolist_size(Payload),
%% Control packets must not be > 125 in length.
true = if Type =:= close; Type =:= ping; Type =:= pong ->
true = if Type =:= ping; Type =:= pong ->
Len =< 125;
true ->
true
end,
BinLen = hybi_payload_length(Len),
Ret = Transport:send(Socket,
[<< 1:1, 0:3, Opcode:4, 0:1, BinLen/bits >>, Payload]),
case Type of
close -> shutdown;
_ -> Ret
end.
Transport:send(Socket,
[<< 1:1, 0:3, Opcode:4, 0:1, BinLen/bits >>, Payload]).
-spec websocket_send_many([frame()], #state{})
-> ok | shutdown | {error, atom()}.