aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2014-03-10 09:51:20 +0100
committerLoïc Hoguin <[email protected]>2014-03-10 09:51:20 +0100
commit4d75a78f822928ec8f57b934491d3870d8861308 (patch)
tree375d83c924657a709ccec3915d584d5ce9fa8ed4
parentd2a2d83f5d3521cf9dca701beb5f65a6db29e287 (diff)
downloadgun-4d75a78f822928ec8f57b934491d3870d8861308.tar.gz
gun-4d75a78f822928ec8f57b934491d3870d8861308.tar.bz2
gun-4d75a78f822928ec8f57b934491d3870d8861308.zip
Improve behavior when losing the connection
-rw-r--r--src/gun.erl4
-rw-r--r--src/gun_spdy.erl13
2 files changed, 15 insertions, 2 deletions
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}) ->