Browse Source

Fix request body reading in HTTP/2

Loïc Hoguin 9 years ago
parent
commit
1470f88319
1 changed files with 12 additions and 5 deletions
  1. 12 5
      src/cowboy_http2.erl

+ 12 - 5
src/cowboy_http2.erl

@@ -28,7 +28,9 @@
 	%% Whether we finished sending data.
 	local = nofin :: cowboy_stream:fin(),
 	%% 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{}.
@@ -233,17 +235,22 @@ parse_settings_preface(State, _, _, _) ->
 %% and terminate the stream if this is the end of it.
 
 %% 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
-		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
 				{Commands, StreamState} ->
 					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)
 			catch Class:Reason ->
 				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},
 					'Exception occurred in StreamHandler:data/4 call.'})
 			end;