From 4d75a78f822928ec8f57b934491d3870d8861308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 10 Mar 2014 09:51:20 +0100 Subject: Improve behavior when losing the connection --- src/gun.erl | 4 +++- src/gun_spdy.erl | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/gun.erl b/src/gun.erl index cff3522..57d29e2 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -314,7 +314,7 @@ loop(State=#state{parent=Parent, owner=Owner, host=Host, receive {OK, Socket, Data} -> case Protocol:handle(Data, ProtoState) of - error -> + close -> Transport:close(Socket), retry_loop(State#state{socket=undefined, transport=undefined, protocol=undefined}, Retry); @@ -322,10 +322,12 @@ loop(State=#state{parent=Parent, owner=Owner, host=Host, loop(State#state{protocol_state=ProtoState2}) end; {Closed, Socket} -> + Protocol:close(ProtoState), Transport:close(Socket), retry_loop(State#state{socket=undefined, transport=undefined, protocol=undefined}, Retry); {Error, Socket, _} -> + Protocol:close(ProtoState), Transport:close(Socket), retry_loop(State#state{socket=undefined, transport=undefined, protocol=undefined}, Retry); diff --git a/src/gun_spdy.erl b/src/gun_spdy.erl index eefcdd2..d8070d1 100644 --- a/src/gun_spdy.erl +++ b/src/gun_spdy.erl @@ -16,6 +16,7 @@ -export([init/3]). -export([handle/2]). +-export([close/1]). -export([keepalive/1]). -export([request/6]). -export([request/7]). @@ -165,7 +166,17 @@ handle_frame(_, #spdy_state{owner=Owner, socket=Socket, transport=Transport}, "The remote endpoint sent invalid data."}}, %% @todo LastGoodStreamID Transport:send(Socket, cow_spdy:goaway(0, protocol_error)), - error. + close. + +close(#spdy_state{owner=Owner, streams=Streams}) -> + close_streams(Owner, Streams). + +close_streams(_, []) -> + ok; +close_streams(Owner, [#stream{ref=StreamRef}|Tail]) -> + Owner ! {gun_error, self(), StreamRef, {closed, + "The connection was lost."}}, + close_streams(Owner, Tail). keepalive(State=#spdy_state{socket=Socket, transport=Transport, ping_id=PingID}) -> -- cgit v1.2.3