You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2012/08/12 01:09:33 UTC

git commit: Restore max_document_size protection

Updated Branches:
  refs/heads/honor-max_document_size [created] bf1eb135f


Restore max_document_size protection


Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/bf1eb135
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/bf1eb135
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/bf1eb135

Branch: refs/heads/honor-max_document_size
Commit: bf1eb135f2b46861474b9276dee02d8edb05fe3b
Parents: bde29be
Author: Robert Newson <rn...@apache.org>
Authored: Sat Aug 11 23:48:59 2012 +0100
Committer: Robert Newson <rn...@apache.org>
Committed: Sat Aug 11 23:48:59 2012 +0100

----------------------------------------------------------------------
 src/couchdb/couch_httpd.erl |   36 ++++++++++--------------------------
 1 files changed, 10 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/bf1eb135/src/couchdb/couch_httpd.erl
----------------------------------------------------------------------
diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl
index 9bdc08d..90d5c80 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) ->


Re: git commit: Restore max_document_size protection

Posted by Benoit Chesneau <bc...@gmail.com>.
On Sun, Aug 12, 2012 at 1:09 AM,  <rn...@apache.org> wrote:
> Updated Branches:
>   refs/heads/honor-max_document_size [created] bf1eb135f
>
>
> Restore max_document_size protection
>
>
> Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
> Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/bf1eb135
> Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/bf1eb135
> Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/bf1eb135
>
> Branch: refs/heads/honor-max_document_size
> Commit: bf1eb135f2b46861474b9276dee02d8edb05fe3b
> Parents: bde29be
> Author: Robert Newson <rn...@apache.org>
> Authored: Sat Aug 11 23:48:59 2012 +0100
> Committer: Robert Newson <rn...@apache.org>
> Committed: Sat Aug 11 23:48:59 2012 +0100
>
> ----------------------------------------------------------------------
>  src/couchdb/couch_httpd.erl |   36 ++++++++++--------------------------
>  1 files changed, 10 insertions(+), 26 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/couchdb/blob/bf1eb135/src/couchdb/couch_httpd.erl
> ----------------------------------------------------------------------
> diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl
> index 9bdc08d..90d5c80 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) ->
>

+1