Browse Source

Introduce cowboy_http_req:body/1 to read the full request body.

Loïc Hoguin 14 years ago
parent
commit
7cacb88fec
2 changed files with 15 additions and 13 deletions
  1. 2 11
      src/cowboy_http_protocol.erl
  2. 13 2
      src/cowboy_http_req.erl

+ 2 - 11
src/cowboy_http_protocol.erl

@@ -167,17 +167,8 @@ handler_terminate(HandlerState, Req, State=#state{handler={Handler, _Opts}}) ->
 ensure_body_processed(#http_req{body_state=done}) ->
 	ok;
 ensure_body_processed(Req=#http_req{body_state=waiting}) ->
-	{Length, Req2} = cowboy_http_req:header('Content-Length', Req),
-	case Length of
-		"" -> ok;
-		_Any ->
-			Length2 = list_to_integer(Length),
-			skip_body(Length2, Req2)
-	end.
-
--spec skip_body(Length::non_neg_integer(), Req::#http_req{}) -> ok | close.
-skip_body(Length, Req) ->
-	case cowboy_http_req:body(Length, Req) of
+	case cowboy_http_req:body(Req) of
+		{error, badarg} -> ok; %% No body.
 		{error, _Reason} -> close;
 		_Any -> ok
 	end.

+ 13 - 2
src/cowboy_http_req.erl

@@ -25,7 +25,7 @@
 ]). %% Request API.
 
 -export([
-	body/2
+	body/1, body/2
 ]). %% Request Body API.
 
 -export([
@@ -137,8 +137,19 @@ headers(Req) ->
 
 %% Request Body API.
 
-%% @todo We probably want to configure the timeout.
 %% @todo We probably want to allow a max length.
+-spec body(Req::#http_req{})
+	-> {Body::binary(), Req::#http_req{}} | {error, Reason::posix()}.
+body(Req) ->
+	{Length, Req2} = cowboy_http_req:header('Content-Length', Req),
+	case Length of
+		"" -> {error, badarg};
+		_Any ->
+			Length2 = list_to_integer(Length),
+			body(Length2, Req2)
+	end.
+
+%% @todo We probably want to configure the timeout.
 -spec body(Length::non_neg_integer(), Req::#http_req{})
 	-> {Body::binary(), Req::#http_req{}} | {error, Reason::posix()}.
 body(Length, Req=#http_req{socket=Socket, transport=Transport, body_state=waiting}) ->