From f5019d2a8388c2046065d550b2fcdb8ef00c4145 Mon Sep 17 00:00:00 2001 From: Soumya Koduri Date: Fri, 18 Sep 2020 23:01:12 +0530 Subject: [PATCH] rgw: Set CURLOPT_NOBODY for HEAD request Set "CURLOPT_NOBODY" for HEAD request so that libcurl doesn't throw error when there is no body in the response. Signed-off-by: Soumya Koduri --- src/rgw/rgw_http_client.cc | 5 +++++ src/test/rgw/test_http_manager.cc | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/rgw/rgw_http_client.cc b/src/rgw/rgw_http_client.cc index 1ade7dfe828..06559a4790f 100644 --- a/src/rgw/rgw_http_client.cc +++ b/src/rgw/rgw_http_client.cc @@ -557,6 +557,11 @@ int RGWHTTPClient::init_request(rgw_http_req_data *_req_data) h = curl_slist_append(h, "Expect:"); } } + + if (method == "HEAD") { + curl_easy_setopt(easy_handle, CURLOPT_NOBODY, 1L); + } + if (h) { curl_easy_setopt(easy_handle, CURLOPT_HTTPHEADER, (void *)h); } diff --git a/src/test/rgw/test_http_manager.cc b/src/test/rgw/test_http_manager.cc index e27e1895a45..3ecd01d9f18 100644 --- a/src/test/rgw/test_http_manager.cc +++ b/src/test/rgw/test_http_manager.cc @@ -49,6 +49,33 @@ TEST(HTTPManager, ReadTruncated) server.join(); } +TEST(HTTPManager, Head) +{ + using tcp = boost::asio::ip::tcp; + tcp::endpoint endpoint(tcp::v4(), 0); + boost::asio::io_context ioctx; + tcp::acceptor acceptor(ioctx); + acceptor.open(endpoint.protocol()); + acceptor.bind(endpoint); + acceptor.listen(); + + std::thread server{[&] { + tcp::socket socket{ioctx}; + acceptor.accept(socket); + std::string_view response = + "HTTP/1.1 200 OK\r\n" + "Content-Length: 1024\r\n" + "\r\n"; + boost::asio::write(socket, boost::asio::buffer(response)); + }}; + const auto url = std::string{"http://127.0.0.1:"} + std::to_string(acceptor.local_endpoint().port()); + + RGWHTTPClient client{g_ceph_context, "HEAD", url}; + EXPECT_EQ(0, RGWHTTP::process(&client, null_yield)); + + server.join(); +} + TEST(HTTPManager, SignalThread) { auto cct = g_ceph_context; -- 2.39.5