From d9a970be90d0105af215531d74809878f9c21338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Tue, 24 Sep 2019 19:18:35 +0200 Subject: Add auto-ping to Websocket and a silence_pings option The auto-ping will at regular interval send a ping frame. The silence_pings option defaults to true. It can be set to false when the user needs to receive ping/pong frames. --- src/gun_ws_h.erl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'src/gun_ws_h.erl') diff --git a/src/gun_ws_h.erl b/src/gun_ws_h.erl index 4859532..88f923f 100644 --- a/src/gun_ws_h.erl +++ b/src/gun_ws_h.erl @@ -20,11 +20,13 @@ -record(state, { reply_to :: pid(), stream_ref :: reference(), - frag_buffer = <<>> :: binary() + frag_buffer = <<>> :: binary(), + silence_pings :: boolean() }). -init(ReplyTo, StreamRef, _, _) -> - {ok, #state{reply_to=ReplyTo, stream_ref=StreamRef}}. +init(ReplyTo, StreamRef, _, Opts) -> + {ok, #state{reply_to=ReplyTo, stream_ref=StreamRef, + silence_pings=maps:get(silence_pings, Opts, true)}}. handle({fragment, nofin, _, Payload}, State=#state{frag_buffer=SoFar}) -> @@ -33,6 +35,9 @@ handle({fragment, fin, Type, Payload}, State=#state{reply_to=ReplyTo, stream_ref=StreamRef, frag_buffer=SoFar}) -> ReplyTo ! {gun_ws, self(), StreamRef, {Type, << SoFar/binary, Payload/binary >>}}, {ok, 1, State#state{frag_buffer= <<>>}}; +handle(Frame, State=#state{silence_pings=true}) when Frame =:= ping; Frame =:= pong; + element(1, Frame) =:= ping; element(1, Frame) =:= pong -> + {ok, 0, State}; handle(Frame, State=#state{reply_to=ReplyTo, stream_ref=StreamRef}) -> ReplyTo ! {gun_ws, self(), StreamRef, Frame}, {ok, 1, State}. -- cgit v1.2.3