Request cancelation feature

This commit modifies the signature of the `Progress` callback
so that its return value will indicate whether the request shall
continue to be processed by returning `true`, or if it shall
be aborted by returning `false`. Such modification will allow
one to cancel an ongoing request before it has completed.

When migrating, developers should modify there `Progress`
callbacks to always return `true` by default in case there
do not want to benefit from the cancelation feature.

A few unit tests use cases were provided, but anyone should feel
free to provide additional uses cases that they find relevant.
This commit is contained in:
Thomas Tissot 2018-08-06 11:54:52 +02:00
parent cc983be31f
commit 82fc7d5591
2 changed files with 64 additions and 2 deletions

View file

@ -230,6 +230,66 @@ TEST(ConnectionErrorTest, Timeout)
ASSERT_TRUE(res == nullptr);
}
TEST(CancelTest, NoCancel) {
auto host = "httpbin.org";
auto sec = 5;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
auto port = 443;
httplib::SSLClient cli(host, port, sec);
#else
auto port = 80;
httplib::Client cli(host, port, sec);
#endif
httplib::Headers headers;
auto res = cli.Get("/range/32", headers, [](uint64_t, uint64_t) {
return true;
});
ASSERT_TRUE(res != nullptr);
EXPECT_EQ(res->body, "abcdefghijklmnopqrstuvwxyzabcdef");
EXPECT_EQ(200, res->status);
}
TEST(CancelTest, WithCancelSmallPayload) {
auto host = "httpbin.org";
auto sec = 5;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
auto port = 443;
httplib::SSLClient cli(host, port, sec);
#else
auto port = 80;
httplib::Client cli(host, port, sec);
#endif
httplib::Headers headers;
auto res = cli.Get("/range/32", headers, [](uint64_t, uint64_t) {
return false;
});
ASSERT_TRUE(res == nullptr);
}
TEST(CancelTest, WithCancelLargePayload) {
auto host = "httpbin.org";
auto sec = 5;
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
auto port = 443;
httplib::SSLClient cli(host, port, sec);
#else
auto port = 80;
httplib::Client cli(host, port, sec);
#endif
uint32_t count = 0;
httplib::Headers headers;
auto res = cli.Get("/range/65536", headers, [&count](uint64_t, uint64_t) {
return (count++ == 0);
});
ASSERT_TRUE(res == nullptr);
}
TEST(Server, BindAndListenSeparately) {
Server svr;
int port = svr.bind_to_any_port("localhost");