0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 12:20:24 +00:00

Fix request body reading in HTTP/2

This commit is contained in:
Loïc Hoguin 2016-06-08 23:09:14 +02:00
parent 98323c2d72
commit 1470f88319

View file

@ -28,7 +28,9 @@
%% Whether we finished sending data. %% Whether we finished sending data.
local = nofin :: cowboy_stream:fin(), local = nofin :: cowboy_stream:fin(),
%% Whether we finished receiving data. %% Whether we finished receiving data.
remote = nofin :: cowboy_stream:fin() remote = nofin :: cowboy_stream:fin(),
%% Request body length.
body_length = 0 :: non_neg_integer()
}). }).
-type stream() :: #stream{}. -type stream() :: #stream{}.
@ -233,17 +235,22 @@ parse_settings_preface(State, _, _, _) ->
%% and terminate the stream if this is the end of it. %% and terminate the stream if this is the end of it.
%% DATA frame. %% DATA frame.
frame(State=#state{handler=Handler, streams=Streams0}, {data, StreamID, IsFin, Data}) -> frame(State=#state{handler=Handler, streams=Streams0}, {data, StreamID, IsFin0, Data}) ->
case lists:keyfind(StreamID, #stream.id, Streams0) of case lists:keyfind(StreamID, #stream.id, Streams0) of
Stream = #stream{state=StreamState0, remote=nofin} -> Stream = #stream{state=StreamState0, remote=nofin, body_length=Len0} ->
Len = Len0 + byte_size(Data),
IsFin = case IsFin0 of
fin -> {fin, Len};
nofin -> nofin
end,
try Handler:data(StreamID, IsFin, Data, StreamState0) of try Handler:data(StreamID, IsFin, Data, StreamState0) of
{Commands, StreamState} -> {Commands, StreamState} ->
Streams = lists:keyreplace(StreamID, #stream.id, Streams0, Streams = lists:keyreplace(StreamID, #stream.id, Streams0,
Stream#stream{state=StreamState}), Stream#stream{state=StreamState, body_length=Len}),
commands(State#state{streams=Streams}, StreamID, Commands) commands(State#state{streams=Streams}, StreamID, Commands)
catch Class:Reason -> catch Class:Reason ->
error_logger:error_msg("Exception occurred in ~s:data(~p, ~p, ~p, ~p) with reason ~p:~p.", error_logger:error_msg("Exception occurred in ~s:data(~p, ~p, ~p, ~p) with reason ~p:~p.",
[Handler, StreamID, IsFin, Data, StreamState0, Class, Reason]), [Handler, StreamID, IsFin0, Data, StreamState0, Class, Reason]),
stream_reset(State, StreamID, {internal_error, {Class, Reason}, stream_reset(State, StreamID, {internal_error, {Class, Reason},
'Exception occurred in StreamHandler:data/4 call.'}) 'Exception occurred in StreamHandler:data/4 call.'})
end; end;