aboutsummaryrefslogtreecommitdiffstats
path: root/src/gun_http2.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2019-07-24 16:22:26 +0200
committerLoïc Hoguin <[email protected]>2019-07-24 16:22:26 +0200
commit3d1e3c9e6e779bca839b86717adb2487b4a1c2c6 (patch)
tree488db6e9ea303d8866eb2affc706d2162a9deb70 /src/gun_http2.erl
parent8c6adf73d9d3fa1ebb49d4b9bd71caab1815dcb2 (diff)
downloadgun-3d1e3c9e6e779bca839b86717adb2487b4a1c2c6.tar.gz
gun-3d1e3c9e6e779bca839b86717adb2487b4a1c2c6.tar.bz2
gun-3d1e3c9e6e779bca839b86717adb2487b4a1c2c6.zip
Add the cancel event for local/remote stream cancellation
Diffstat (limited to 'src/gun_http2.erl')
-rw-r--r--src/gun_http2.erl35
1 files changed, 25 insertions, 10 deletions
diff --git a/src/gun_http2.erl b/src/gun_http2.erl
index d039ecb..78b137b 100644
--- a/src/gun_http2.erl
+++ b/src/gun_http2.erl
@@ -23,7 +23,7 @@
-export([headers/10]).
-export([request/11]).
-export([data/7]).
--export([cancel/3]).
+-export([cancel/5]).
-export([stream_info/2]).
-export([down/1]).
@@ -150,8 +150,8 @@ frame(State=#http2_state{http2_machine=HTTP2Machine0}, Frame, EvHandler, EvHandl
trailers_frame(State#http2_state{http2_machine=HTTP2Machine},
StreamID, Trailers, EvHandler, EvHandlerState);
{ok, {rst_stream, StreamID, Reason}, HTTP2Machine} ->
- {rst_stream_frame(State#http2_state{http2_machine=HTTP2Machine}, StreamID, Reason),
- EvHandlerState};
+ rst_stream_frame(State#http2_state{http2_machine=HTTP2Machine},
+ StreamID, Reason, EvHandler, EvHandlerState);
{ok, {push_promise, StreamID, PromisedStreamID, Headers, PseudoHeaders}, HTTP2Machine} ->
push_promise_frame(State#http2_state{http2_machine=HTTP2Machine},
StreamID, PromisedStreamID, Headers, PseudoHeaders,
@@ -268,14 +268,21 @@ trailers_frame(State, StreamID, Trailers, EvHandler, EvHandlerState0) ->
EvHandlerState = EvHandler:response_end(ResponseEvent, EvHandlerState1),
{maybe_delete_stream(State, StreamID, remote, fin), EvHandlerState}.
-rst_stream_frame(State=#http2_state{streams=Streams0}, StreamID, Reason) ->
+rst_stream_frame(State=#http2_state{streams=Streams0},
+ StreamID, Reason, EvHandler, EvHandlerState0) ->
case lists:keytake(StreamID, #stream.id, Streams0) of
{value, #stream{ref=StreamRef, reply_to=ReplyTo}, Streams} ->
ReplyTo ! {gun_error, self(), StreamRef,
{stream_error, Reason, 'Stream reset by server.'}},
- State#http2_state{streams=Streams};
+ EvHandlerState = EvHandler:cancel(#{
+ stream_ref => StreamRef,
+ reply_to => ReplyTo,
+ endpoint => remote,
+ reason => Reason
+ }, EvHandlerState0),
+ {State#http2_state{streams=Streams}, EvHandlerState};
false ->
- State
+ {State, EvHandlerState0}
end.
push_promise_frame(State=#http2_state{streams=Streams},
@@ -482,15 +489,23 @@ reset_stream(State=#http2_state{socket=Socket, transport=Transport,
State
end.
-cancel(State=#http2_state{socket=Socket, transport=Transport,
- http2_machine=HTTP2Machine0}, StreamRef, ReplyTo) ->
+cancel(State=#http2_state{socket=Socket, transport=Transport, http2_machine=HTTP2Machine0},
+ StreamRef, ReplyTo, EvHandler, EvHandlerState0) ->
case get_stream_by_ref(State, StreamRef) of
#stream{id=StreamID} ->
{ok, HTTP2Machine} = cow_http2_machine:reset_stream(StreamID, HTTP2Machine0),
Transport:send(Socket, cow_http2:rst_stream(StreamID, cancel)),
- delete_stream(State#http2_state{http2_machine=HTTP2Machine}, StreamID);
+ EvHandlerState = EvHandler:cancel(#{
+ stream_ref => StreamRef,
+ reply_to => ReplyTo,
+ endpoint => local,
+ reason => cancel
+ }, EvHandlerState0),
+ {delete_stream(State#http2_state{http2_machine=HTTP2Machine}, StreamID),
+ EvHandlerState};
false ->
- error_stream_not_found(State, StreamRef, ReplyTo)
+ {error_stream_not_found(State, StreamRef, ReplyTo),
+ EvHandlerState0}
end.
stream_info(State, StreamRef) ->