You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ei...@apache.org on 2021/08/25 12:38:32 UTC

[couchdb] branch fix-delete-chunked-response created (now fb55897)

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

eiri pushed a change to branch fix-delete-chunked-response
in repository https://gitbox.apache.org/repos/asf/couchdb.git.


      at fb55897  Discard a payload on a delete attachment request

This branch includes the following new commits:

     new fb55897  Discard a payload on a delete attachment request

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[couchdb] 01/01: Discard a payload on a delete attachment request

Posted by ei...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

eiri pushed a commit to branch fix-delete-chunked-response
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit fb55897a93e7aaa8ea5b8284549bd07d489fc5b8
Author: Eric Avdey <ei...@eiri.ca>
AuthorDate: Wed Aug 25 09:10:35 2021 -0300

    Discard a payload on a delete attachment request
    
    While including a payload within a DELETE request is not forbidden by RFC7231
    its presence on a delete attachment request leaves a mochiweb acceptor
    in a semi-opened state since mochiweb's using lazy load for the request bodies.
    This makes a next immediate request to the same acceptor to hung
    until previous request's receive timeout.
    
    This PR adds a step to explicitly "drain" and discard an entity body on a
    delete attachment request to prevent that.
---
 src/chttpd/src/chttpd_db.erl          |  3 +++
 test/elixir/test/attachments_test.exs | 15 +++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/src/chttpd/src/chttpd_db.erl b/src/chttpd/src/chttpd_db.erl
index ffdab2a..e803454 100644
--- a/src/chttpd/src/chttpd_db.erl
+++ b/src/chttpd/src/chttpd_db.erl
@@ -857,6 +857,9 @@ db_req(#httpd{path_parts=[_DbName, <<"_local">> | _Rest]}, _Db) ->
 db_req(#httpd{path_parts=[_, DocId]}=Req, Db) ->
     db_doc_req(Req, Db, DocId);
 
+db_req(#httpd{method='DELETE', path_parts=[_, DocId | FileNameParts]}=Req, Db) ->
+    chttpd:body(Req),
+    db_attachment_req(Req, Db, DocId, FileNameParts);
 db_req(#httpd{path_parts=[_, DocId | FileNameParts]}=Req, Db) ->
     db_attachment_req(Req, Db, DocId, FileNameParts).
 
diff --git a/test/elixir/test/attachments_test.exs b/test/elixir/test/attachments_test.exs
index c89486a..2bf38de 100644
--- a/test/elixir/test/attachments_test.exs
+++ b/test/elixir/test/attachments_test.exs
@@ -124,6 +124,21 @@ defmodule AttachmentsTest do
   end
 
   @tag :with_db
+  test "delete attachment request with a payload should not block following requests", context do
+    db_name = context[:db_name]
+
+    resp = Couch.put("/#{db_name}/bin_doc", body: @bin_att_doc, query: %{w: 3})
+    assert resp.status_code in [201, 202]
+    rev = resp.body["rev"]
+
+    resp = Couch.delete("/#{db_name}/bin_doc/foo.txt", body: 'some payload', query: %{w: 3, rev: rev}, ibrowse: [{:max_sessions, 1}, {:max_pipeline_size, 1}])
+    assert resp.status_code == 200
+
+    resp = Couch.get("/", timeout: 1000, ibrowse: [{:max_sessions, 1}, {:max_pipeline_size, 1}])
+    assert resp.status_code == 200
+  end
+
+  @tag :with_db
   test "saves binary", context do
     db_name = context[:db_name]