mirror of
https://github.com/BlackMATov/curly.hpp.git
synced 2025-12-13 03:29:37 +07:00
cancel_all_pending_requests function #26
This commit is contained in:
@@ -417,4 +417,5 @@ namespace curly_hpp
|
||||
{
|
||||
void perform();
|
||||
void wait_activity(time_ms_t ms);
|
||||
void cancel_all_pending_requests();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user