From 84d7671e91bb2dee2081172dbf651860134ae75e Mon Sep 17 00:00:00 2001 From: rambocoder Date: Wed, 6 Mar 2013 08:50:45 -0500 Subject: Check the length before reading the body in body/1 and body_qs/1 --- test/http_handler_echo_body.erl | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) (limited to 'test/http_handler_echo_body.erl') diff --git a/test/http_handler_echo_body.erl b/test/http_handler_echo_body.erl index 31595d5..4b9e765 100644 --- a/test/http_handler_echo_body.erl +++ b/test/http_handler_echo_body.erl @@ -9,11 +9,37 @@ init({_, http}, Req, _) -> handle(Req, State) -> true = cowboy_req:has_body(Req), - {ok, Body, Req2} = cowboy_req:body(Req), - {Size, Req3} = cowboy_req:body_length(Req2), + {ok, Req3} = case cowboy_req:body(1000000, Req) of + {error, chunked} -> handle_chunked(Req); + {error, badlength} -> handle_badlength(Req); + {ok, Body, Req2} -> handle_body(Req2, Body) + end, + {ok, Req3, State}. + +handle_chunked(Req) -> + {ok, Data, Req2} = read_body(Req, <<>>, 1000000), + {ok, Req3} = cowboy_req:reply(200, [], Data, Req2), + {ok, Req3}. + +handle_badlength(Req) -> + {ok, Req2} = cowboy_req:reply(413, [], <<"Request entity too large">>, Req), + {ok, Req2}. + +handle_body(Req, Body) -> + {Size, Req2} = cowboy_req:body_length(Req), Size = byte_size(Body), - {ok, Req4} = cowboy_req:reply(200, [], Body, Req3), - {ok, Req4, State}. + {ok, Req3} = cowboy_req:reply(200, [], Body, Req2), + {ok, Req3}. terminate(_, _, _) -> ok. + +% Read chunked request content +read_body(Req, Acc, BodyLengthRemaining) -> + case cowboy_req:stream_body(Req) of + {ok, Data, Req2} -> + BodyLengthRem = BodyLengthRemaining - byte_size(Data), + read_body(Req2, << Acc/binary, Data/binary >>, BodyLengthRem); + {done, Req2} -> + {ok, Acc, Req2} + end. -- cgit v1.2.3