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]