]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/beast: fix interaction between keepalive and 100-continue 49840/head
authorCasey Bodley <cbodley@redhat.com>
Thu, 5 Jan 2023 16:30:03 +0000 (11:30 -0500)
committerKonstantin Shalygin <k0ste@k0ste.ru>
Tue, 24 Jan 2023 03:25:14 +0000 (10:25 +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 d6001a67f16ca26aa12dc34c770d1854297b8997..532ae0183d18c91d56452607fd537d9f0e44d2f9 100644 (file)
@@ -228,6 +228,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) {
@@ -283,6 +285,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()) {
@@ -291,7 +297,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();