diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gun_default_event_h.erl | 4 | ||||
-rw-r--r-- | src/gun_event.erl | 11 | ||||
-rw-r--r-- | src/gun_http.erl | 6 | ||||
-rw-r--r-- | src/gun_http2.erl | 11 |
4 files changed, 23 insertions, 9 deletions
diff --git a/src/gun_default_event_h.erl b/src/gun_default_event_h.erl index cd48fc2..ff6f951 100644 --- a/src/gun_default_event_h.erl +++ b/src/gun_default_event_h.erl @@ -24,6 +24,7 @@ -export([response_start/2]). -export([response_inform/2]). -export([response_headers/2]). +-export([response_trailers/2]). -export([response_end/2]). -export([disconnect/2]). -export([terminate/2]). @@ -55,6 +56,9 @@ response_inform(_EventData, State) -> response_headers(_EventData, State) -> State. +response_trailers(_EventData, State) -> + State. + response_end(_EventData, State) -> State. diff --git a/src/gun_event.erl b/src/gun_event.erl index 2a742a1..72abe24 100644 --- a/src/gun_event.erl +++ b/src/gun_event.erl @@ -89,6 +89,16 @@ -callback response_inform(response_headers_event(), State) -> State. -callback response_headers(response_headers_event(), State) -> State. +%% response_trailers. + +-type response_trailers_event() :: #{ + stream_ref := reference(), + reply_to := pid(), + headers := [{binary(), binary()}] +}. + +-callback response_trailers(response_trailers_event(), State) -> State. + %% response_end. -type response_end_event() :: #{ @@ -122,7 +132,6 @@ %% @todo origin_changed %% @todo transport_changed %% @todo protocol_changed -%% @todo response_trailers %% @todo push_promise_start %% @todo push_promise_end %% @todo cancel_start diff --git a/src/gun_http.erl b/src/gun_http.erl index b7c5bc1..4acc3c4 100644 --- a/src/gun_http.erl +++ b/src/gun_http.erl @@ -197,10 +197,12 @@ handle(Data, State=#http_state{in=body_trailer, buffer=Buffer, connection=Conn, {Trailers, Rest} = cow_http:parse_headers(Data2), %% @todo We probably want to pass this to gun_content_handler? ReplyTo ! {gun_trailers, self(), stream_ref(StreamRef), Trailers}, - EvHandlerState = EvHandler:response_end(#{ + ResponseEvent = #{ stream_ref => StreamRef, reply_to => ReplyTo - }, EvHandlerState0), + }, + EvHandlerState1 = EvHandler:response_trailers(ResponseEvent#{headers => Trailers}, EvHandlerState0), + EvHandlerState = EvHandler:response_end(ResponseEvent, EvHandlerState1), case Conn of keepalive -> handle(Rest, end_stream(State#http_state{buffer= <<>>}), EvHandler, EvHandlerState); diff --git a/src/gun_http2.erl b/src/gun_http2.erl index 4814818..a1ba46e 100644 --- a/src/gun_http2.erl +++ b/src/gun_http2.erl @@ -124,10 +124,7 @@ frame(State=#http2_state{http2_machine=HTTP2Machine0}, Frame, EvHandler, EvHandl stream_ref => StreamRef, reply_to => ReplyTo }, EvHandlerState0); - {ok, nofin} -> - %% @todo response_trailers. - EvHandlerState0; - %% This is an invalid headers frame. + %% Trailers or invalid header frame. _ -> EvHandlerState0 end; @@ -259,10 +256,12 @@ trailers_frame(State, StreamID, Trailers, EvHandler, EvHandlerState0) -> #stream{ref=StreamRef, reply_to=ReplyTo} = get_stream_by_id(State, StreamID), %% @todo We probably want to pass this to gun_content_handler? ReplyTo ! {gun_trailers, self(), StreamRef, Trailers}, - EvHandlerState = EvHandler:response_end(#{ + ResponseEvent = #{ stream_ref => StreamRef, reply_to => ReplyTo - }, EvHandlerState0), + }, + EvHandlerState1 = EvHandler:response_trailers(ResponseEvent#{headers => Trailers}, 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) -> |