From: Casey Bodley Date: Thu, 5 Jan 2023 16:30:03 +0000 (-0500) Subject: rgw/beast: fix interaction between keepalive and 100-continue X-Git-Tag: v18.1.0~482^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4358cf2a6a60d780791322f17cb216addd8ddae6;p=ceph.git rgw/beast: fix interaction between keepalive and 100-continue 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 --- diff --git a/src/rgw/rgw_asio_frontend.cc b/src/rgw/rgw_asio_frontend.cc index 71d145ed56552..000a0bc6a9f16 100644 --- a/src/rgw/rgw_asio_frontend.cc +++ b/src/rgw/rgw_asio_frontend.cc @@ -229,6 +229,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) { @@ -285,6 +287,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()) { @@ -293,7 +299,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 discard_buffer; auto& body = parser.get().body();