]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/beast: fix interaction between keepalive and 100-continue
authorCasey Bodley <cbodley@redhat.com>
Thu, 5 Jan 2023 16:30:03 +0000 (11:30 -0500)
committerKonstantin Shalygin <k0ste@k0ste.ru>
Fri, 3 Mar 2023 03:14:51 +0000 (10:14 +0700)
if we reject a request with a "Expect: 100-continue" header before
sending a "100 Continue" response, the keepalive logic should not try to
read/discard request body before parsing the next request headers

Fixes: https://tracker.ceph.com/issues/58286
Signed-off-by: Casey Bodley <cbodley@redhat.com>
(cherry picked from commit 4358cf2a6a60d780791322f17cb216addd8ddae6)

src/rgw/rgw_asio_frontend.cc

index 519e96923b0af863ed6de5723ab53246ebf5e32c..3eea508596d16485ddaae3d8b601dbc7fa083761 100644 (file)
@@ -227,6 +227,8 @@ void handle_connection(boost::asio::io_context& context,
       return;
     }
 
+    bool expect_continue = (message[http::field::expect] == "100-continue");
+
     {
       auto lock = pause_mutex.async_lock_shared(yield[ec]);
       if (ec == boost::asio::error::operation_aborted) {
@@ -278,6 +280,10 @@ void handle_connection(boost::asio::io_context& context,
             << log_header{message, http::field::range} << " latency="
             << latency << dendl;
       }
+
+      if (real_client.sent_100_continue()) {
+        expect_continue = false;
+      }
     }
 
     if (!parser.keep_alive()) {
@@ -286,7 +292,7 @@ void handle_connection(boost::asio::io_context& context,
 
     // if we failed before reading the entire message, discard any remaining
     // bytes before reading the next
-    while (!parser.is_done()) {
+    while (!expect_continue && !parser.is_done()) {
       static std::array<char, 1024> discard_buffer;
 
       auto& body = parser.get().body();