Skip to content

Commit 372a40b

Browse files
Copilotyhirose
andcommitted
Implement Issue #2210: Add POST methods with raw binary data and ContentReceiver support
Co-authored-by: yhirose <[email protected]>
1 parent 3cb7cb7 commit 372a40b

File tree

8 files changed

+12110
-0
lines changed

8 files changed

+12110
-0
lines changed

httplib.h

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,13 +1411,15 @@ class ClientImpl {
14111411

14121412
Result Post(const std::string &path);
14131413
Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
1414+
Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
14141415
Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
14151416
Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
14161417
Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
14171418
Result Post(const std::string &path, const Params &params);
14181419
Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
14191420
Result Post(const std::string &path, const Headers &headers);
14201421
Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
1422+
Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
14211423
Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
14221424
Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
14231425
Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
@@ -1767,13 +1769,15 @@ class Client {
17671769

17681770
Result Post(const std::string &path);
17691771
Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
1772+
Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
17701773
Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
17711774
Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
17721775
Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
17731776
Result Post(const std::string &path, const Params &params);
17741777
Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
17751778
Result Post(const std::string &path, const Headers &headers);
17761779
Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
1780+
Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
17771781
Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
17781782
Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
17791783
Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
@@ -9773,6 +9777,15 @@ inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
97739777
nullptr, nullptr, content_type, progress);
97749778
}
97759779

9780+
inline Result ClientImpl::Post(const std::string &path, const char *body,
9781+
size_t content_length,
9782+
const std::string &content_type,
9783+
ContentReceiver content_receiver,
9784+
DownloadProgress progress) {
9785+
return Post(path, Headers(), body, content_length, content_type,
9786+
content_receiver, progress);
9787+
}
9788+
97769789
inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
97779790
const std::string &body,
97789791
const std::string &content_type,
@@ -9840,6 +9853,32 @@ inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
98409853
return send_(std::move(req));
98419854
}
98429855

9856+
inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
9857+
const char *body, size_t content_length,
9858+
const std::string &content_type,
9859+
ContentReceiver content_receiver,
9860+
DownloadProgress progress) {
9861+
Request req;
9862+
req.method = "POST";
9863+
req.path = path;
9864+
req.headers = headers;
9865+
req.body.assign(body, content_length);
9866+
req.content_receiver =
9867+
[content_receiver](const char *data, size_t data_length,
9868+
size_t /*offset*/, size_t /*total_length*/) {
9869+
return content_receiver(data, data_length);
9870+
};
9871+
req.download_progress = std::move(progress);
9872+
9873+
if (max_timeout_msec_ > 0) {
9874+
req.start_time_ = std::chrono::steady_clock::now();
9875+
}
9876+
9877+
if (!content_type.empty()) { req.set_header("Content-Type", content_type); }
9878+
9879+
return send_(std::move(req));
9880+
}
9881+
98439882
inline Result ClientImpl::Put(const std::string &path) {
98449883
return Put(path, std::string(), std::string());
98459884
}
@@ -11402,13 +11441,31 @@ inline Result Client::Post(const std::string &path, const char *body,
1140211441
UploadProgress progress) {
1140311442
return cli_->Post(path, body, content_length, content_type, progress);
1140411443
}
11444+
11445+
inline Result Client::Post(const std::string &path, const char *body,
11446+
size_t content_length,
11447+
const std::string &content_type,
11448+
ContentReceiver content_receiver,
11449+
DownloadProgress progress) {
11450+
return cli_->Post(path, body, content_length, content_type, content_receiver,
11451+
progress);
11452+
}
1140511453
inline Result Client::Post(const std::string &path, const Headers &headers,
1140611454
const char *body, size_t content_length,
1140711455
const std::string &content_type,
1140811456
UploadProgress progress) {
1140911457
return cli_->Post(path, headers, body, content_length, content_type,
1141011458
progress);
1141111459
}
11460+
11461+
inline Result Client::Post(const std::string &path, const Headers &headers,
11462+
const char *body, size_t content_length,
11463+
const std::string &content_type,
11464+
ContentReceiver content_receiver,
11465+
DownloadProgress progress) {
11466+
return cli_->Post(path, headers, body, content_length, content_type,
11467+
content_receiver, progress);
11468+
}
1141211469
inline Result Client::Post(const std::string &path, const std::string &body,
1141311470
const std::string &content_type,
1141411471
UploadProgress progress) {

0 commit comments

Comments
 (0)