Skip to content

Commit 3cf235c

Browse files
committedNov 9, 2024·
update curl example
1 parent e333447 commit 3cf235c

File tree

1 file changed

+18
-19
lines changed

1 file changed

+18
-19
lines changed
 

‎tests/test_curl/test_curl.cpp

+18-19
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,50 @@
55

66
#include "curl/curl.h"
77

8-
struct completion_job_data
8+
template<typename ResultType>
9+
struct handler_wrapper
910
{
10-
static void do_completion_job(void* completion_data)
11+
static void invoke_once(void* completion_data, ResultType arg)
1112
{
12-
(*reinterpret_cast<completion_job_data*>(completion_data))();
13-
delete reinterpret_cast<completion_job_data*>(completion_data);
13+
(*reinterpret_cast<handler_wrapper*>(completion_data))(arg);
14+
delete reinterpret_cast<handler_wrapper*>(completion_data);
1415
}
1516

16-
virtual ~completion_job_data()
17+
virtual ~handler_wrapper()
1718
{
1819
}
1920

20-
virtual void operator() ()
21+
virtual void operator() (ResultType)
2122
{
2223
}
2324
};
2425

2526

26-
template<typename continuation_t>
27-
struct completion_job_data_for_coro : public completion_job_data
27+
template<typename T, typename continuation_t>
28+
struct handler_wrapper_impl : public handler_wrapper<T>
2829
{
2930
continuation_t continuation;
3031

31-
completion_job_data_for_coro(continuation_t&& continuation)
32+
handler_wrapper_impl(continuation_t&& continuation)
3233
: continuation(continuation)
3334
{
3435
}
3536

36-
virtual void operator() () override
37+
virtual void operator() (T t) override
3738
{
38-
continuation();
39+
continuation(std::move(t));
3940
}
4041
};
4142

42-
ucoro::awaitable<void> async_curl_http_post(std::string url)
43+
ucoro::awaitable<CURLcode> async_curl_http_post(std::string url)
4344
{
4445
CURLM* curl = co_await ucoro::local_storage_t<CURLM*>{};
4546

46-
co_await callback_awaitable<void>([curl, url](auto continuation)
47+
auto curl_code = co_await callback_awaitable<CURLcode>([curl, url](auto continuation)
4748
{
4849
auto http_handle = curl_easy_init();
4950

50-
auto complete_op = new completion_job_data_for_coro<decltype(continuation)>(std::move(continuation));
51+
auto complete_op = new handler_wrapper_impl<CURLcode, decltype(continuation)>(std::move(continuation));
5152

5253
/* set the options (I left out a few, you get the point anyway) */
5354
curl_easy_setopt(http_handle, CURLOPT_URL, url.c_str());
@@ -60,14 +61,12 @@ ucoro::awaitable<void> async_curl_http_post(std::string url)
6061
});
6162

6263
// NOTE: 记住这个位置,叫 1 号位
63-
co_return;
64+
co_return curl_code;
6465
}
6566

6667
ucoro::awaitable<int> coro_compute_int(std::string url)
6768
{
68-
co_await async_curl_http_post(url);
69-
70-
co_return url.size();
69+
co_return co_await async_curl_http_post(url);
7170
}
7271

7372
ucoro::awaitable<void> coro_compute_exec(std::string url)
@@ -124,7 +123,7 @@ int main(int argc, char** argv)
124123
curl_easy_getinfo(e, CURLINFO_PRIVATE, &completion_job_data);
125124
if (completion_job_data)
126125
{
127-
completion_job_data::do_completion_job(completion_job_data);
126+
handler_wrapper<CURLcode>::invoke_once(completion_job_data, msg->data.result);
128127
}
129128

130129
curl_multi_remove_handle(curl, e);

0 commit comments

Comments
 (0)
Please sign in to comment.