This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git


The following commit(s) were added to refs/heads/3.x by this push:
     new b91ec0b48 Handle mochiweb client processes crashing with `{shutdown, 
Error}`
b91ec0b48 is described below

commit b91ec0b48660b018c89113c89d82c883bdd72faf
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Mon May 2 18:29:59 2022 -0400

    Handle mochiweb client processes crashing with `{shutdown, Error}`
    
    Previously on error they exited `normal`, and now exit with the `{shutdown, 
Error}`
    reason.
    
    See: 
https://github.com/mochi/mochiweb/commit/e56a4dce6b360c5c5d037e8de33dd267790092e4
---
 rebar.config.script                |  2 +-
 src/chttpd/src/chttpd.erl          | 11 ++++++++---
 src/chttpd/src/chttpd_external.erl |  2 ++
 src/couch/src/couch_httpd.erl      |  2 ++
 4 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/rebar.config.script b/rebar.config.script
index da3fc58a1..20cf9af0f 100644
--- a/rebar.config.script
+++ b/rebar.config.script
@@ -162,7 +162,7 @@ DepDescs = [
 {hyper,            "hyper",            {tag, "CouchDB-2.2.0-7"}},
 {ibrowse,          "ibrowse",          {tag, "CouchDB-4.4.2-5"}},
 {jiffy,            "jiffy",            {tag, "CouchDB-1.0.9-1"}},
-{mochiweb,         "mochiweb",         {tag, "CouchDB-v2.21.0-1"}},
+{mochiweb,         "mochiweb",         {tag, "CouchDB-v2.22.0-1"}},
 {meck,             "meck",             {tag, "0.9.2"}},
 {recon,            "recon",            {tag, "2.5.2"}}
 ].
diff --git a/src/chttpd/src/chttpd.erl b/src/chttpd/src/chttpd.erl
index 3cfdb5584..cd8982aa1 100644
--- a/src/chttpd/src/chttpd.erl
+++ b/src/chttpd/src/chttpd.erl
@@ -342,7 +342,7 @@ handle_request_int(MochiReq) ->
             {ok, Resp};
         #httpd_resp{status = aborted, reason = Reason} ->
             couch_log:error("Response abnormally terminated: ~p", [Reason]),
-            exit(normal)
+            exit({shutdown, Reason})
     end.
 
 before_request(HttpReq) ->
@@ -423,7 +423,7 @@ catch_error(HttpReq, exit, {mochiweb_recv_error, E}, 
_Stack) ->
         MochiReq:get(raw_path),
         E
     ]),
-    exit(normal);
+    exit({shutdown, E});
 catch_error(HttpReq, exit, {uri_too_long, _}, _Stack) ->
     send_error(HttpReq, request_uri_too_long);
 catch_error(HttpReq, exit, {body_too_large, _}, _Stack) ->
@@ -437,7 +437,10 @@ catch_error(HttpReq, Tag, Error, Stack) ->
     case {Tag, Error, Stack} of
         {exit, normal, [{mochiweb_request, send, _, _} | _]} ->
             % Client disconnect (R15+)
-            exit(normal);
+            exit(shutdown);
+        {exit, {shutdown, _}, [{mochiweb_request, send, _, _} | _]} ->
+            % Client disconnect (R15+)
+            exit(shutdown);
         _Else ->
             send_error(HttpReq, {Error, nil, Stack})
     end.
@@ -1135,6 +1138,8 @@ maybe_handle_error(Error) ->
             {500, couch_util:to_binary(Err), couch_util:to_binary(Reason)};
         normal ->
             exit(normal);
+        {shutdown, Err} ->
+            exit({shutdown, Err});
         Error ->
             {500, <<"unknown_error">>, couch_util:to_binary(Error)}
     end.
diff --git a/src/chttpd/src/chttpd_external.erl 
b/src/chttpd/src/chttpd_external.erl
index 84cfc9620..352087d58 100644
--- a/src/chttpd/src/chttpd_external.erl
+++ b/src/chttpd/src/chttpd_external.erl
@@ -79,6 +79,8 @@ json_req_obj_field(<<"body">>, #httpd{req_body = undefined, 
mochi_req = Req}, _D
     try
         Req:recv_body(MaxSize)
     catch
+        exit:{shutdown, _} ->
+            exit({bad_request, <<"Invalid request body">>});
         exit:normal ->
             exit({bad_request, <<"Invalid request body">>})
     end;
diff --git a/src/couch/src/couch_httpd.erl b/src/couch/src/couch_httpd.erl
index 64b68ce3f..629cbbdcc 100644
--- a/src/couch/src/couch_httpd.erl
+++ b/src/couch/src/couch_httpd.erl
@@ -411,6 +411,8 @@ handle_request_int(MochiReq, DefaultFun,
         throw:bad_accept_encoding_value ->
             couch_log:error("received invalid Accept-Encoding header", []),
             send_error(HttpReq, bad_request);
+        exit:{shutdown, Error} ->
+            exit({shutdown, Error});
         exit:normal ->
             exit(normal);
         exit:snappy_nif_not_loaded ->

Reply via email to