summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2012-08-11 23:48:59 +0100
committerRobert Newson <rnewson@apache.org>2012-08-11 23:48:59 +0100
commitbf1eb135f2b46861474b9276dee02d8edb05fe3b (patch)
tree1ae3cb497bad45049a0d97c61805beef5bdf8b00
parentbde29bea6a4bdb5c73966524bd349335071262b5 (diff)
downloadcouchdb-bf1eb135f2b46861474b9276dee02d8edb05fe3b.tar.gz
Restore max_document_size protection
-rw-r--r--src/couchdb/couch_httpd.erl36
1 files changed, 10 insertions, 26 deletions
diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl
index 9bdc08dc2..90d5c80b6 100644
--- a/src/couchdb/couch_httpd.erl
+++ b/src/couchdb/couch_httpd.erl
@@ -340,6 +340,8 @@ handle_request_int(MochiReq, DefaultFun,
" must be built with Erlang OTP R13B04 or higher.",
?LOG_ERROR("~s", [ErrorReason]),
send_error(HttpReq, {bad_otp_release, ErrorReason});
+ exit:{body_too_large, _} ->
+ send_error(HttpReq, request_entity_too_large);
throw:Error ->
Stack = erlang:get_stacktrace(),
?LOG_DEBUG("Minor error in HTTP request: ~p",[Error]),
@@ -526,33 +528,13 @@ recv_chunked(#httpd{mochi_req=MochiReq}, MaxChunkSize, ChunkFun, InitState) ->
% called with Length == 0 on the last time.
MochiReq:stream_body(MaxChunkSize, ChunkFun, InitState).
-body_length(Req) ->
- case header_value(Req, "Transfer-Encoding") of
- undefined ->
- case header_value(Req, "Content-Length") of
- undefined -> undefined;
- Length -> list_to_integer(Length)
- end;
- "chunked" -> chunked;
- Unknown -> {unknown_transfer_encoding, Unknown}
- end.
+body_length(#httpd{mochi_req=MochiReq}) ->
+ MochiReq:get(body_length).
-body(#httpd{mochi_req=MochiReq, req_body=undefined} = Req) ->
- case body_length(Req) of
- undefined ->
- MaxSize = list_to_integer(
- couch_config:get("couchdb", "max_document_size", "4294967296")),
- MochiReq:recv_body(MaxSize);
- chunked ->
- ChunkFun = fun({0, _Footers}, Acc) ->
- lists:reverse(Acc);
- ({_Len, Chunk}, Acc) ->
- [Chunk | Acc]
- end,
- recv_chunked(Req, 8192, ChunkFun, []);
- Len ->
- MochiReq:recv_body(Len)
- end;
+body(#httpd{mochi_req=MochiReq, req_body=undefined}) ->
+ MaxSize = list_to_integer(
+ couch_config:get("couchdb", "max_document_size", "4294967296")),
+ MochiReq:recv_body(MaxSize);
body(#httpd{req_body=ReqBody}) ->
ReqBody.
@@ -814,6 +796,8 @@ error_info({unauthorized, Msg}) ->
error_info(file_exists) ->
{412, <<"file_exists">>, <<"The database could not be "
"created, the file already exists.">>};
+error_info(request_entity_too_large) ->
+ {413, <<"too_large">>, <<"the request entity is too large">>};
error_info({bad_ctype, Reason}) ->
{415, <<"bad_content_type">>, Reason};
error_info(requested_range_not_satisfiable) ->