Browse Source

Do not attempt to skip the request body on Connection: close

Loïc Hoguin 12 years ago
parent
commit
8050f2e0fa
1 changed files with 19 additions and 12 deletions
  1. 19 12
      src/cowboy_protocol.erl

+ 19 - 12
src/cowboy_protocol.erl

@@ -522,18 +522,25 @@ resume(State, Env, Tail, Module, Function, Args) ->
 next_request(Req, State=#state{req_keepalive=Keepalive, timeout=Timeout},
 next_request(Req, State=#state{req_keepalive=Keepalive, timeout=Timeout},
 		HandlerRes) ->
 		HandlerRes) ->
 	cowboy_req:ensure_response(Req, 204),
 	cowboy_req:ensure_response(Req, 204),
-	{BodyRes, [Buffer, Connection]} = case cowboy_req:skip_body(Req) of
-		{ok, Req2} -> {ok, cowboy_req:get([buffer, connection], Req2)};
-		{error, _} -> {close, [<<>>, close]}
-	end,
-	%% Flush the resp_sent message before moving on.
-	receive {cowboy_req, resp_sent} -> ok after 0 -> ok end,
-	case {HandlerRes, BodyRes, Connection} of
-		{ok, ok, keepalive} ->
-			?MODULE:parse_request(Buffer, State#state{
-				req_keepalive=Keepalive + 1, until=until(Timeout)}, 0);
-		_Closed ->
-			terminate(State)
+	%% If we are going to close the connection,
+	%% we do not want to attempt to skip the body.
+	case cowboy_req:get(connection, Req) of
+		close ->
+			terminate(State);
+		_ ->
+			Buffer = case cowboy_req:skip_body(Req) of
+				{ok, Req2} -> cowboy_req:get(buffer, Req2);
+				_ -> close
+			end,
+			%% Flush the resp_sent message before moving on.
+			receive {cowboy_req, resp_sent} -> ok after 0 -> ok end,
+			if HandlerRes =:= ok, Buffer =/= close ->
+					?MODULE:parse_request(Buffer,
+						State#state{req_keepalive=Keepalive + 1,
+						until=until(Timeout)}, 0);
+				true ->
+					terminate(State)
+			end
 	end.
 	end.
 
 
 %% Only send an error reply if there is no resp_sent message.
 %% Only send an error reply if there is no resp_sent message.