88#include < utility>
99
1010#include " cpr/async.h"
11+ #include " cpr/async_wrapper.h"
1112#include " cpr/auth.h"
1213#include " cpr/bearer.h"
1314#include " cpr/cprtypes.h"
1718#include " cpr/response.h"
1819#include " cpr/session.h"
1920#include < cpr/filesystem.h>
20- #include < utility>
2121
2222namespace cpr {
2323
24- using AsyncResponse = std::future <Response>;
24+ using AsyncResponse = AsyncWrapper <Response>;
2525
2626namespace priv {
2727
@@ -85,6 +85,32 @@ void setup_multiperform(MultiPerform& multiperform, Ts&&... ts) {
8585 setup_multiperform_internal<Ts...>(multiperform, std::forward<Ts>(ts)...);
8686}
8787
88+ using session_action_t = cpr::Response (cpr::Session::*)();
89+
90+ template <session_action_t SessionAction, typename T>
91+ void setup_multiasync (std::vector<AsyncWrapper<Response, true >>& responses, T&& parameters) {
92+ std::shared_ptr<std::atomic_bool> cancellation_state = std::make_shared<std::atomic_bool>(false );
93+
94+ std::function<Response (T)> execFn{[cancellation_state](T params) {
95+ if (cancellation_state->load ()) {
96+ return Response{};
97+ }
98+ cpr::Session s{};
99+ s.SetCancellationParam (cancellation_state);
100+ apply_set_option (s, std::forward<T>(params));
101+ return std::invoke (SessionAction, s);
102+ }};
103+ responses.emplace_back (GlobalThreadPool::GetInstance ()->Submit (std::move (execFn), std::forward<T>(parameters)), std::move (cancellation_state));
104+ }
105+
106+ template <session_action_t SessionAction, typename T, typename ... Ts>
107+ void setup_multiasync (std::vector<AsyncWrapper<Response, true >>& responses, T&& head, Ts&&... tail) {
108+ setup_multiasync<SessionAction>(responses, std::forward<T>(head));
109+ if constexpr (sizeof ...(Ts) > 0 ) {
110+ setup_multiasync<SessionAction>(responses, std::forward<Ts>(tail)...);
111+ }
112+ }
113+
88114} // namespace priv
89115
90116// Get methods
@@ -245,7 +271,7 @@ Response Download(std::ofstream& file, Ts&&... ts) {
245271// Download async method
246272template <typename ... Ts>
247273AsyncResponse DownloadAsync (fs::path local_path, Ts... ts) {
248- return std::async (
274+ return AsyncWrapper{ std::async (
249275 std::launch::async,
250276 [](fs::path local_path_, Ts... ts_) {
251277#ifdef CPR_USE_BOOST_FILESYSTEM
@@ -255,7 +281,7 @@ AsyncResponse DownloadAsync(fs::path local_path, Ts... ts) {
255281#endif
256282 return Download (f, std::move (ts_)...);
257283 },
258- std::move (local_path), std::move (ts)...);
284+ std::move (local_path), std::move (ts)...)} ;
259285}
260286
261287// Download with user callback
@@ -316,6 +342,55 @@ std::vector<Response> MultiPost(Ts&&... ts) {
316342 return multiperform.Post ();
317343}
318344
345+ template <typename ... Ts>
346+ std::vector<AsyncWrapper<Response, true >> MultiGetAsync (Ts&&... ts) {
347+ std::vector<AsyncWrapper<Response, true >> ret{};
348+ priv::setup_multiasync<&cpr::Session::Get>(ret, std::forward<Ts>(ts)...);
349+ return ret;
350+ }
351+
352+ template <typename ... Ts>
353+ std::vector<AsyncWrapper<Response, true >> MultiDeleteAsync (Ts&&... ts) {
354+ std::vector<AsyncWrapper<Response, true >> ret{};
355+ priv::setup_multiasync<&cpr::Session::Delete>(ret, std::forward<Ts>(ts)...);
356+ return ret;
357+ }
358+
359+ template <typename ... Ts>
360+ std::vector<AsyncWrapper<Response, true >> MultiHeadAsync (Ts&&... ts) {
361+ std::vector<AsyncWrapper<Response, true >> ret{};
362+ priv::setup_multiasync<&cpr::Session::Head>(ret, std::forward<Ts>(ts)...);
363+ return ret;
364+ }
365+ template <typename ... Ts>
366+ std::vector<AsyncWrapper<Response, true >> MultiOptionsAsync (Ts&&... ts) {
367+ std::vector<AsyncWrapper<Response, true >> ret{};
368+ priv::setup_multiasync<&cpr::Session::Options>(ret, std::forward<Ts>(ts)...);
369+ return ret;
370+ }
371+
372+ template <typename ... Ts>
373+ std::vector<AsyncWrapper<Response, true >> MultiPatchAsync (Ts&&... ts) {
374+ std::vector<AsyncWrapper<Response, true >> ret{};
375+ priv::setup_multiasync<&cpr::Session::Patch>(ret, std::forward<Ts>(ts)...);
376+ return ret;
377+ }
378+
379+ template <typename ... Ts>
380+ std::vector<AsyncWrapper<Response, true >> MultiPostAsync (Ts&&... ts) {
381+ std::vector<AsyncWrapper<Response, true >> ret{};
382+ priv::setup_multiasync<&cpr::Session::Post>(ret, std::forward<Ts>(ts)...);
383+ return ret;
384+ }
385+
386+ template <typename ... Ts>
387+ std::vector<AsyncWrapper<Response, true >> MultiPutAsync (Ts&&... ts) {
388+ std::vector<AsyncWrapper<Response, true >> ret{};
389+ priv::setup_multiasync<&cpr::Session::Put>(ret, std::forward<Ts>(ts)...);
390+ return ret;
391+ }
392+
393+
319394} // namespace cpr
320395
321396#endif
0 commit comments