diff --git a/include/seastar/http/client.hh b/include/seastar/http/client.hh index ab6277356ad..21396a5e382 100644 --- a/include/seastar/http/client.hh +++ b/include/seastar/http/client.hh @@ -126,7 +126,7 @@ public: future<> close(); private: - future do_make_request(request rq); + future do_make_request(request& rq); void setup_request(request& rq); future<> send_request_head(const request& rq); future maybe_wait_for_continue(const request& req); @@ -166,6 +166,10 @@ public: */ class client { +public: + using reply_handler = noncopyable_function(const reply&, input_stream&& body)>; + +private: friend class http::internal::client_ref; using connections_list_t = bi::list, bi::constant_time_size>; static constexpr unsigned default_max_connections = 100; @@ -191,8 +195,9 @@ class client { requires std::invocable auto with_new_connection(Fn&& fn); + future<> do_make_request(connection& con, request& req, reply_handler& handle, std::optional expected); + public: - using reply_handler = noncopyable_function(const reply&, input_stream&& body)>; /** * \brief Construct a simple client * diff --git a/src/http/client.cc b/src/http/client.cc index af45700144f..bc6abb4791c 100644 --- a/src/http/client.cc +++ b/src/http/client.cc @@ -156,8 +156,7 @@ future connection::recv_reply() { }); } -future connection::do_make_request(request req) { - return do_with(std::move(req), [this] (auto& req) { +future connection::do_make_request(request& req) { setup_request(req); return send_request_head(req).then([this, &req] { return maybe_wait_for_continue(req).then([this, &req] (reply_ptr cont) { @@ -172,13 +171,14 @@ future connection::do_make_request(request req) { }); }); }); - }); } future connection::make_request(request req) { - return do_make_request(std::move(req)).then([] (reply_ptr rep) { + return do_with(std::move(req), [this] (auto& req) { + return do_make_request(req).then([] (reply_ptr rep) { return make_ready_future(std::move(*rep)); }); + }); } input_stream connection::in(reply& rep) { @@ -329,8 +329,15 @@ auto client::with_new_connection(Fn&& fn) { } future<> client::make_request(request req, reply_handler handle, std::optional expected) { - return with_connection([req = std::move(req), handle = std::move(handle), expected] (connection& con) mutable { - return con.do_make_request(std::move(req)).then([&con, expected, handle = std::move(handle)] (connection::reply_ptr reply) mutable { + return do_with(std::move(req), std::move(handle), [this, expected] (request& req, reply_handler& handle) mutable { + return with_connection([this, &req, &handle, expected] (connection& con) { + return do_make_request(con, req, handle, expected); + }); + }); +} + +future<> client::do_make_request(connection& con, request& req, reply_handler& handle, std::optional expected) { + return con.do_make_request(req).then([&con, &handle, expected] (connection::reply_ptr reply) mutable { auto& rep = *reply; if (expected.has_value() && rep._status != expected.value()) { if (!http_log.is_enabled(log_level::debug)) { @@ -350,7 +357,6 @@ future<> client::make_request(request req, reply_handler handle, std::optional(std::move(ex)); }); - }); } future<> client::close() {