Merge pull request #89 from dolphineye/request-cancelation

Request cancelation feature
This commit is contained in:
yhirose 2018-08-06 22:46:05 -04:00 committed by GitHub
commit f4981459b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 2 deletions

View File

@ -107,7 +107,7 @@ std::pair<std::string, std::string> make_range_header(uint64_t value, Args... ar
typedef std::multimap<std::string, std::string> Params;
typedef std::smatch Match;
typedef std::function<void (uint64_t current, uint64_t total)> Progress;
typedef std::function<bool (uint64_t current, uint64_t total)> Progress;
struct MultipartFile {
std::string filename;
@ -804,7 +804,9 @@ inline bool read_content_with_length(Stream& strm, std::string& out, size_t len,
r += n;
if (progress) {
progress(r, len);
if (!progress(r, len)) {
return false;
}
}
}

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");