From bcb218ef7758dff5e7a74be7cab282719844c8a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Thu, 9 Apr 2015 15:21:17 +0300 Subject: Don't clear out the transport on connection retry Fixes an issue introduced in the previous commit that broke automatic reconnection. Thanks to Adrian Roe/Steve Strong for the report. --- src/gun.erl | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/gun.erl b/src/gun.erl index 0fddfe3..e5bbd7e 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -463,7 +463,8 @@ connect(State=#state{owner=Owner, host=Host, port=Port, opts=Opts, transport=Tra end. retry(State=#state{opts=Opts}) -> - retry(State, maps:get(retry, Opts, 5)). + retry(State#state{socket=undefined, protocol=undefined, protocol_state=undefined}, + maps:get(retry, Opts, 5)). %% Exit normally if the retry functionality has been disabled. retry(_, 0) -> @@ -512,8 +513,7 @@ loop(State=#state{parent=Parent, owner=Owner, host=Host, port=Port, case Protocol:handle(Data, ProtoState) of close -> Transport:close(Socket), - retry(State#state{socket=undefined, transport=undefined, - protocol=undefined}); + retry(State); {upgrade, Protocol2, ProtoState2} -> ws_loop(State#state{protocol=Protocol2, protocol_state=ProtoState2}); ProtoState2 -> @@ -522,13 +522,11 @@ loop(State=#state{parent=Parent, owner=Owner, host=Host, port=Port, {Closed, Socket} -> Protocol:close(ProtoState), Transport:close(Socket), - retry(State#state{socket=undefined, transport=undefined, - protocol=undefined}); + retry(State); {Error, Socket, _} -> Protocol:close(ProtoState), Transport:close(Socket), - retry(State#state{socket=undefined, transport=undefined, - protocol=undefined}); + retry(State); {OK, _PreviousSocket, _Data} -> loop(State); {Closed, _PreviousSocket} -> @@ -593,16 +591,16 @@ ws_loop(State=#state{parent=Parent, owner=Owner, socket=Socket, case Protocol:handle(Data, ProtoState) of close -> Transport:close(Socket), - retry(State#state{socket=undefined, transport=undefined, protocol=undefined}); + retry(State); ProtoState2 -> ws_loop(State#state{protocol_state=ProtoState2}) end; {Closed, Socket} -> Transport:close(Socket), - retry(State#state{socket=undefined, transport=undefined, protocol=undefined}); + retry(State); {Error, Socket, _} -> Transport:close(Socket), - retry(State#state{socket=undefined, transport=undefined, protocol=undefined}); + retry(State); %% Ignore any previous HTTP keep-alive. keepalive -> ws_loop(State); @@ -612,7 +610,7 @@ ws_loop(State=#state{parent=Parent, owner=Owner, socket=Socket, case Protocol:send(Frame, ProtoState) of close -> Transport:close(Socket), - retry(State#state{socket=undefined, transport=undefined, protocol=undefined}); + retry(State); ProtoState2 -> ws_loop(State#state{protocol_state=ProtoState2}) end; -- cgit v1.2.3