Skip to content

Commit ebec365

Browse files
authored
Merge pull request #1205 from Anohkka/cancelable-callbacks
Make cpr::async and HTTP (Get, Post, Put, etc.) callbacks cancelable
2 parents 6002d9b + bb04e12 commit ebec365

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

include/cpr/api.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ AsyncResponse GetAsync(Ts... ts) {
131131
template <typename Then, typename... Ts>
132132
// NOLINTNEXTLINE(fuchsia-trailing-return)
133133
auto GetCallback(Then then, Ts... ts) {
134-
return cpr::async([](Then then_inner, Ts... ts_inner) { return then_inner(Get(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
134+
return cpr::async<true>([](Then then_inner, Ts... ts_inner) { return then_inner(Get(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
135135
}
136136

137137
// Post methods
@@ -152,7 +152,7 @@ AsyncResponse PostAsync(Ts... ts) {
152152
template <typename Then, typename... Ts>
153153
// NOLINTNEXTLINE(fuchsia-trailing-return)
154154
auto PostCallback(Then then, Ts... ts) {
155-
return cpr::async([](Then then_inner, Ts... ts_inner) { return then_inner(Post(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
155+
return cpr::async<true>([](Then then_inner, Ts... ts_inner) { return then_inner(Post(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
156156
}
157157

158158
// Put methods
@@ -173,7 +173,7 @@ AsyncResponse PutAsync(Ts... ts) {
173173
template <typename Then, typename... Ts>
174174
// NOLINTNEXTLINE(fuchsia-trailing-return)
175175
auto PutCallback(Then then, Ts... ts) {
176-
return cpr::async([](Then then_inner, Ts... ts_inner) { return then_inner(Put(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
176+
return cpr::async<true>([](Then then_inner, Ts... ts_inner) { return then_inner(Put(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
177177
}
178178

179179
// Head methods
@@ -194,7 +194,7 @@ AsyncResponse HeadAsync(Ts... ts) {
194194
template <typename Then, typename... Ts>
195195
// NOLINTNEXTLINE(fuchsia-trailing-return)
196196
auto HeadCallback(Then then, Ts... ts) {
197-
return cpr::async([](Then then_inner, Ts... ts_inner) { return then_inner(Head(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
197+
return cpr::async<true>([](Then then_inner, Ts... ts_inner) { return then_inner(Head(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
198198
}
199199

200200
// Delete methods
@@ -215,7 +215,7 @@ AsyncResponse DeleteAsync(Ts... ts) {
215215
template <typename Then, typename... Ts>
216216
// NOLINTNEXTLINE(fuchsia-trailing-return)
217217
auto DeleteCallback(Then then, Ts... ts) {
218-
return cpr::async([](Then then_inner, Ts... ts_inner) { return then_inner(Delete(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
218+
return cpr::async<true>([](Then then_inner, Ts... ts_inner) { return then_inner(Delete(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
219219
}
220220

221221
// Options methods
@@ -236,7 +236,7 @@ AsyncResponse OptionsAsync(Ts... ts) {
236236
template <typename Then, typename... Ts>
237237
// NOLINTNEXTLINE(fuchsia-trailing-return)
238238
auto OptionsCallback(Then then, Ts... ts) {
239-
return cpr::async([](Then then_inner, Ts... ts_inner) { return then_inner(Options(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
239+
return cpr::async<true>([](Then then_inner, Ts... ts_inner) { return then_inner(Options(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
240240
}
241241

242242
// Patch methods
@@ -257,7 +257,7 @@ AsyncResponse PatchAsync(Ts... ts) {
257257
template <typename Then, typename... Ts>
258258
// NOLINTNEXTLINE(fuchsia-trailing-return)
259259
auto PatchCallback(Then then, Ts... ts) {
260-
return cpr::async([](Then then_inner, Ts... ts_inner) { return then_inner(Patch(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
260+
return cpr::async<true>([](Then then_inner, Ts... ts_inner) { return then_inner(Patch(std::move(ts_inner)...)); }, std::move(then), std::move(ts)...);
261261
}
262262

263263
// Download methods

include/cpr/async.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,15 @@ class GlobalThreadPool : public ThreadPool {
2222
* async(std::bind(&Class::mem_fn, &obj))
2323
* async(std::mem_fn(&Class::mem_fn, &obj))
2424
**/
25-
template <class Fn, class... Args>
25+
template <bool isCancellable = false, class Fn, class... Args>
2626
auto async(Fn&& fn, Args&&... args) {
27-
return AsyncWrapper{GlobalThreadPool::GetInstance()->Submit(std::forward<Fn>(fn), std::forward<Args>(args)...)};
27+
std::future future = GlobalThreadPool::GetInstance()->Submit(std::forward<Fn>(fn), std::forward<Args>(args)...);
28+
using async_wrapper_t = AsyncWrapper<decltype(future.get()), isCancellable>;
29+
if constexpr (isCancellable) {
30+
return async_wrapper_t{std::move(future), std::make_shared<std::atomic_bool>(false)};
31+
} else {
32+
return async_wrapper_t{std::move(future)};
33+
}
2834
}
2935

3036
class async {

0 commit comments

Comments
 (0)