cancel_all_pending_requests function #26

This commit is contained in:
BlackMATov
2021-02-01 09:18:58 +07:00
parent d6a3f477f5
commit 1db3807b24
3 changed files with 64 additions and 0 deletions

View File

@@ -417,4 +417,5 @@ namespace curly_hpp
{
void perform();
void wait_activity(time_ms_t ms);
void cancel_all_pending_requests();
}

View File

@@ -1141,4 +1141,20 @@ namespace curly_hpp
}
});
}
void cancel_all_pending_requests() {
curl_state::with([](CURLM* curlm){
req_state_t sreq;
while ( new_handles.try_dequeue(sreq) ) {
sreq->cancel();
sreq->call_callback(sreq);
}
for ( auto iter = active_handles.begin(); iter != active_handles.end(); ) {
(*iter)->cancel();
(*iter)->dequeue(curlm);
(*iter)->call_callback(*iter);
iter = active_handles.erase(iter);
}
});
}
}

View File

@@ -908,6 +908,53 @@ TEST_CASE("curly") {
}
}
TEST_CASE("curly/cancel_all_pending_requests") {
SUBCASE("cancel new requests") {
std::atomic_size_t call_count{0u};
auto req1 = net::request_builder("https://httpbin.org/delay/2")
.callback([&call_count](net::request request){
REQUIRE(request.status() == net::req_status::cancelled);
++call_count;
}).send();
auto req2 = net::request_builder("https://httpbin.org/delay/2")
.callback([&call_count](net::request request){
REQUIRE(request.status() == net::req_status::cancelled);
++call_count;
}).send();
net::cancel_all_pending_requests();
REQUIRE(call_count == 2u);
REQUIRE(req1.status() == net::req_status::cancelled);
REQUIRE(req2.status() == net::req_status::cancelled);
}
SUBCASE("cancel active requests") {
std::atomic_size_t call_count{0u};
auto req1 = net::request_builder("https://httpbin.org/delay/2")
.callback([&call_count](net::request request){
REQUIRE(request.status() == net::req_status::cancelled);
++call_count;
}).send();
auto req2 = net::request_builder("https://httpbin.org/delay/2")
.callback([&call_count](net::request request){
REQUIRE(request.status() == net::req_status::cancelled);
++call_count;
}).send();
net::perform();
net::cancel_all_pending_requests();
REQUIRE(call_count == 2u);
REQUIRE(req1.status() == net::req_status::cancelled);
REQUIRE(req2.status() == net::req_status::cancelled);
}
}
TEST_CASE("curly_examples") {
net::performer performer;