Skip to content

Commit 53b2f4d

Browse files
author
smorivan
committed
fix core: await pending requests completion in clients::http::Client destructor
commit_hash:84e415cc3be3bbcfc3918ad949fc3853ec5c4f9e
1 parent 6dc7354 commit 53b2f4d

File tree

6 files changed

+22
-1
lines changed

6 files changed

+22
-1
lines changed

core/include/userver/clients/http/client_with_plugins.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <userver/clients/http/client.hpp>
1111
#include <userver/clients/http/plugin.hpp>
1212
#include <userver/utils/impl/internal_tag.hpp>
13+
#include <userver/utils/impl/wait_token_storage.hpp>
1314

1415
USERVER_NAMESPACE_BEGIN
1516

@@ -46,6 +47,7 @@ class ClientWithPlugins final : public Client {
4647
private:
4748
std::shared_ptr<ClientCore> client_core_;
4849
std::vector<utils::NotNull<clients::http::Plugin*>> plugins_;
50+
utils::impl::WaitTokenStorage wts_;
4951
};
5052

5153
} // namespace clients::http

core/include/userver/clients/http/request.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <userver/crypto/certificate.hpp>
1616
#include <userver/crypto/private_key.hpp>
1717
#include <userver/http/http_version.hpp>
18+
#include <userver/utils/impl/internal_tag.hpp>
1819
#include <userver/utils/impl/source_location.hpp>
1920
#include <userver/utils/not_null.hpp>
2021

@@ -24,6 +25,10 @@ namespace tracing {
2425
class TracingManagerBase;
2526
} // namespace tracing
2627

28+
namespace utils::impl {
29+
class WaitTokenStorageLock;
30+
} // namespace utils::impl
31+
2732
/// HTTP client helpers
2833
namespace clients::http {
2934

@@ -350,6 +355,8 @@ class Request final {
350355

351356
// Set deadline propagation settings. For internal use only.
352357
void SetDeadlinePropagationConfig(const DeadlinePropagationConfig& deadline_propagation_config) &;
358+
359+
void SetWaitToken(utils::impl::InternalTag, utils::impl::WaitTokenStorageLock&&);
353360
/// @endcond
354361

355362
/// Disable auto-decoding of received replies. Useful to proxy replies 'as is'.

core/src/clients/http/client_with_plugins.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ ClientWithPlugins::ClientWithPlugins(
1313
)
1414
: client_core_(std::move(client_core)), plugins_(std::move(plugins)) {}
1515

16-
ClientWithPlugins::~ClientWithPlugins() = default;
16+
ClientWithPlugins::~ClientWithPlugins() { wts_.WaitForAllTokens(); }
1717

1818
Request ClientWithPlugins::CreateRequest() {
1919
auto request = client_core_->CreateRequest();
2020
request.SetPluginsList(plugins_);
21+
request.SetWaitToken(utils::impl::InternalTag{}, wts_.GetToken());
2122
return request;
2223
}
2324

core/src/clients/http/request.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,10 @@ const std::string& Request::GetData() const& { return pimpl_->easy().get_post_da
558558

559559
std::string Request::ExtractData() { return pimpl_->easy().extract_post_data(); }
560560

561+
void Request::SetWaitToken(utils::impl::InternalTag, utils::impl::WaitTokenStorageLock&& wait_token) {
562+
pimpl_->SetWaitToken(std::move(wait_token));
563+
}
564+
561565
} // namespace clients::http
562566

563567
USERVER_NAMESPACE_END

core/src/clients/http/request_state.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,8 @@ void RequestState::SetTracingManager(const tracing::TracingManagerBase& m) { tra
10961096

10971097
PluginRequest RequestState::GetEditableRequestInstance() { return PluginRequest(*this); }
10981098

1099+
void RequestState::SetWaitToken(utils::impl::WaitTokenStorageLock&& wait_token) { wait_token_ = std::move(wait_token); }
1100+
10991101
} // namespace clients::http
11001102

11011103
USERVER_NAMESPACE_END

core/src/clients/http/request_state.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <userver/tracing/manager.hpp>
2626
#include <userver/tracing/span.hpp>
2727
#include <userver/tracing/tags.hpp>
28+
#include <userver/utils/impl/wait_token_storage.hpp>
2829
#include <userver/utils/not_null.hpp>
2930
#include <userver/utils/zstring_view.hpp>
3031

@@ -145,6 +146,8 @@ class RequestState : public std::enable_shared_from_this<RequestState> {
145146

146147
void SetTracingManager(const tracing::TracingManagerBase&);
147148

149+
void SetWaitToken(utils::impl::WaitTokenStorageLock&&);
150+
148151
/// true if proxy was set using proxy method
149152
bool IsProxySet() const;
150153

@@ -264,6 +267,8 @@ class RequestState : public std::enable_shared_from_this<RequestState> {
264267
};
265268

266269
std::variant<FullBufferedData, StreamData> data_;
270+
271+
utils::impl::WaitTokenStorageLock wait_token_;
267272
};
268273

269274
} // namespace clients::http

0 commit comments

Comments
 (0)