1
0
mirror of synced 2025-11-17 01:43:25 +03:00

Add Client::Post with both content provider and receiver (#2268)

Co-authored-by: Clarkok Zhang <clarkok8@gmail.com>
This commit is contained in:
Clarkok Zhang
2025-11-14 11:52:06 -08:00
committed by GitHub
parent 61e9f7ce8f
commit 59882752aa
2 changed files with 432 additions and 52 deletions

363
httplib.h
View File

@@ -1421,14 +1421,18 @@ public:
Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Params &params); Result Post(const std::string &path, const Params &params);
Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers); Result Post(const std::string &path, const Headers &headers);
Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, const Params &params); Result Post(const std::string &path, const Headers &headers, const Params &params);
Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr);
@@ -1439,14 +1443,18 @@ public:
Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Params &params); Result Put(const std::string &path, const Params &params);
Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers); Result Put(const std::string &path, const Headers &headers);
Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, const Params &params); Result Put(const std::string &path, const Headers &headers, const Params &params);
Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr);
@@ -1457,14 +1465,18 @@ public:
Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Params &params); Result Patch(const std::string &path, const Params &params);
Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, const Params &params); Result Patch(const std::string &path, const Headers &headers, const Params &params);
Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr);
@@ -1712,17 +1724,19 @@ private:
template <typename ClientType> void setup_redirect_client(ClientType &client); template <typename ClientType> void setup_redirect_client(ClientType &client);
bool handle_request(Stream &strm, Request &req, Response &res, bool handle_request(Stream &strm, Request &req, Response &res,
bool close_connection, Error &error); bool close_connection, Error &error);
std::unique_ptr<Response> send_with_content_provider( std::unique_ptr<Response> send_with_content_provider_and_receiver(
Request &req, const char *body, size_t content_length, Request &req, const char *body, size_t content_length,
ContentProvider content_provider, ContentProvider content_provider,
ContentProviderWithoutLength content_provider_without_length, ContentProviderWithoutLength content_provider_without_length,
const std::string &content_type, Error &error); const std::string &content_type, ContentReceiver content_receiver,
Result send_with_content_provider( Error &error);
Result send_with_content_provider_and_receiver(
const std::string &method, const std::string &path, const std::string &method, const std::string &path,
const Headers &headers, const char *body, size_t content_length, const Headers &headers, const char *body, size_t content_length,
ContentProvider content_provider, ContentProvider content_provider,
ContentProviderWithoutLength content_provider_without_length, ContentProviderWithoutLength content_provider_without_length,
const std::string &content_type, UploadProgress progress); const std::string &content_type, ContentReceiver content_receiver,
UploadProgress progress);
ContentProviderWithoutLength get_multipart_content_provider( ContentProviderWithoutLength get_multipart_content_provider(
const std::string &boundary, const UploadFormDataItems &items, const std::string &boundary, const UploadFormDataItems &items,
const FormDataProviderItems &provider_items) const; const FormDataProviderItems &provider_items) const;
@@ -1775,14 +1789,18 @@ public:
Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Params &params); Result Post(const std::string &path, const Params &params);
Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers); Result Post(const std::string &path, const Headers &headers);
Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, const Params &params); Result Post(const std::string &path, const Headers &headers, const Params &params);
Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr);
@@ -1793,14 +1811,18 @@ public:
Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Params &params); Result Put(const std::string &path, const Params &params);
Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers); Result Put(const std::string &path, const Headers &headers);
Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, const Params &params); Result Put(const std::string &path, const Headers &headers, const Params &params);
Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr);
@@ -1811,14 +1833,18 @@ public:
Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Params &params); Result Patch(const std::string &path, const Params &params);
Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers); Result Patch(const std::string &path, const Headers &headers);
Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, const Params &params); Result Patch(const std::string &path, const Headers &headers, const Params &params);
Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr);
Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr);
@@ -9387,11 +9413,13 @@ inline bool ClientImpl::write_request(Stream &strm, Request &req,
return true; return true;
} }
inline std::unique_ptr<Response> ClientImpl::send_with_content_provider( inline std::unique_ptr<Response>
ClientImpl::send_with_content_provider_and_receiver(
Request &req, const char *body, size_t content_length, Request &req, const char *body, size_t content_length,
ContentProvider content_provider, ContentProvider content_provider,
ContentProviderWithoutLength content_provider_without_length, ContentProviderWithoutLength content_provider_without_length,
const std::string &content_type, Error &error) { const std::string &content_type, ContentReceiver content_receiver,
Error &error) {
if (!content_type.empty()) { req.set_header("Content-Type", content_type); } if (!content_type.empty()) { req.set_header("Content-Type", content_type); }
#ifdef CPPHTTPLIB_ZLIB_SUPPORT #ifdef CPPHTTPLIB_ZLIB_SUPPORT
@@ -9464,15 +9492,24 @@ inline std::unique_ptr<Response> ClientImpl::send_with_content_provider(
} }
} }
if (content_receiver) {
req.content_receiver =
[content_receiver](const char *data, size_t data_length,
size_t /*offset*/, size_t /*total_length*/) {
return content_receiver(data, data_length);
};
}
auto res = detail::make_unique<Response>(); auto res = detail::make_unique<Response>();
return send(req, *res, error) ? std::move(res) : nullptr; return send(req, *res, error) ? std::move(res) : nullptr;
} }
inline Result ClientImpl::send_with_content_provider( inline Result ClientImpl::send_with_content_provider_and_receiver(
const std::string &method, const std::string &path, const Headers &headers, const std::string &method, const std::string &path, const Headers &headers,
const char *body, size_t content_length, ContentProvider content_provider, const char *body, size_t content_length, ContentProvider content_provider,
ContentProviderWithoutLength content_provider_without_length, ContentProviderWithoutLength content_provider_without_length,
const std::string &content_type, UploadProgress progress) { const std::string &content_type, ContentReceiver content_receiver,
UploadProgress progress) {
Request req; Request req;
req.method = method; req.method = method;
req.headers = headers; req.headers = headers;
@@ -9484,9 +9521,10 @@ inline Result ClientImpl::send_with_content_provider(
auto error = Error::Success; auto error = Error::Success;
auto res = send_with_content_provider( auto res = send_with_content_provider_and_receiver(
req, body, content_length, std::move(content_provider), req, body, content_length, std::move(content_provider),
std::move(content_provider_without_length), content_type, error); std::move(content_provider_without_length), content_type,
std::move(content_receiver), error);
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_OPENSSL_SUPPORT
return Result{std::move(res), error, std::move(req.headers), last_ssl_error_, return Result{std::move(res), error, std::move(req.headers), last_ssl_error_,
@@ -9815,6 +9853,15 @@ inline Result ClientImpl::Post(const std::string &path, size_t content_length,
content_type, progress); content_type, progress);
} }
inline Result ClientImpl::Post(const std::string &path, size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return Post(path, Headers(), content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result ClientImpl::Post(const std::string &path, inline Result ClientImpl::Post(const std::string &path,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
@@ -9823,6 +9870,15 @@ inline Result ClientImpl::Post(const std::string &path,
progress); progress);
} }
inline Result ClientImpl::Post(const std::string &path,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return Post(path, Headers(), std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result ClientImpl::Post(const std::string &path, const Headers &headers, inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
const Params &params) { const Params &params) {
auto query = detail::params_to_query_str(params); auto query = detail::params_to_query_str(params);
@@ -9863,17 +9919,18 @@ inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
const char *body, size_t content_length, const char *body, size_t content_length,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("POST", path, headers, body, content_length, return send_with_content_provider_and_receiver(
nullptr, nullptr, content_type, progress); "POST", path, headers, body, content_length, nullptr, nullptr,
content_type, nullptr, progress);
} }
inline Result ClientImpl::Post(const std::string &path, const Headers &headers, inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
const std::string &body, const std::string &body,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("POST", path, headers, body.data(), return send_with_content_provider_and_receiver(
body.size(), nullptr, nullptr, content_type, "POST", path, headers, body.data(), body.size(), nullptr, nullptr,
progress); content_type, nullptr, progress);
} }
inline Result ClientImpl::Post(const std::string &path, const Headers &headers, inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
@@ -9881,18 +9938,40 @@ inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
ContentProvider content_provider, ContentProvider content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("POST", path, headers, nullptr, return send_with_content_provider_and_receiver(
content_length, std::move(content_provider), "POST", path, headers, nullptr, content_length,
nullptr, content_type, progress); std::move(content_provider), nullptr, content_type, nullptr, progress);
}
inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
DownloadProgress progress) {
return send_with_content_provider_and_receiver(
"POST", path, headers, nullptr, content_length,
std::move(content_provider), nullptr, content_type,
std::move(content_receiver), std::move(progress));
} }
inline Result ClientImpl::Post(const std::string &path, const Headers &headers, inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr, return send_with_content_provider_and_receiver(
std::move(content_provider), content_type, "POST", path, headers, nullptr, 0, nullptr, std::move(content_provider),
progress); content_type, nullptr, progress);
}
inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
DownloadProgress progress) {
return send_with_content_provider_and_receiver(
"POST", path, headers, nullptr, 0, nullptr, std::move(content_provider),
content_type, std::move(content_receiver), std::move(progress));
} }
inline Result ClientImpl::Post(const std::string &path, const Headers &headers, inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
@@ -9902,10 +9981,10 @@ inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
const auto &boundary = detail::make_multipart_data_boundary(); const auto &boundary = detail::make_multipart_data_boundary();
const auto &content_type = const auto &content_type =
detail::serialize_multipart_formdata_get_content_type(boundary); detail::serialize_multipart_formdata_get_content_type(boundary);
return send_with_content_provider( return send_with_content_provider_and_receiver(
"POST", path, headers, nullptr, 0, nullptr, "POST", path, headers, nullptr, 0, nullptr,
get_multipart_content_provider(boundary, items, provider_items), get_multipart_content_provider(boundary, items, provider_items),
content_type, progress); content_type, nullptr, progress);
} }
inline Result ClientImpl::Post(const std::string &path, const Headers &headers, inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
@@ -9967,6 +10046,15 @@ inline Result ClientImpl::Put(const std::string &path, size_t content_length,
content_type, progress); content_type, progress);
} }
inline Result ClientImpl::Put(const std::string &path, size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return Put(path, Headers(), content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result ClientImpl::Put(const std::string &path, inline Result ClientImpl::Put(const std::string &path,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
@@ -9975,6 +10063,15 @@ inline Result ClientImpl::Put(const std::string &path,
progress); progress);
} }
inline Result ClientImpl::Put(const std::string &path,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return Put(path, Headers(), std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result ClientImpl::Put(const std::string &path, const Headers &headers, inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
const Params &params) { const Params &params) {
auto query = detail::params_to_query_str(params); auto query = detail::params_to_query_str(params);
@@ -10015,17 +10112,18 @@ inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
const char *body, size_t content_length, const char *body, size_t content_length,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PUT", path, headers, body, content_length, return send_with_content_provider_and_receiver(
nullptr, nullptr, content_type, progress); "PUT", path, headers, body, content_length, nullptr, nullptr,
content_type, nullptr, progress);
} }
inline Result ClientImpl::Put(const std::string &path, const Headers &headers, inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
const std::string &body, const std::string &body,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PUT", path, headers, body.data(), return send_with_content_provider_and_receiver(
body.size(), nullptr, nullptr, content_type, "PUT", path, headers, body.data(), body.size(), nullptr, nullptr,
progress); content_type, nullptr, progress);
} }
inline Result ClientImpl::Put(const std::string &path, const Headers &headers, inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
@@ -10033,18 +10131,40 @@ inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
ContentProvider content_provider, ContentProvider content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PUT", path, headers, nullptr, return send_with_content_provider_and_receiver(
content_length, std::move(content_provider), "PUT", path, headers, nullptr, content_length,
nullptr, content_type, progress); std::move(content_provider), nullptr, content_type, nullptr, progress);
}
inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return send_with_content_provider_and_receiver(
"PUT", path, headers, nullptr, content_length,
std::move(content_provider), nullptr, content_type,
std::move(content_receiver), progress);
} }
inline Result ClientImpl::Put(const std::string &path, const Headers &headers, inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr, return send_with_content_provider_and_receiver(
std::move(content_provider), content_type, "PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider),
progress); content_type, nullptr, progress);
}
inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return send_with_content_provider_and_receiver(
"PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider),
content_type, std::move(content_receiver), progress);
} }
inline Result ClientImpl::Put(const std::string &path, const Headers &headers, inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
@@ -10054,10 +10174,10 @@ inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
const auto &boundary = detail::make_multipart_data_boundary(); const auto &boundary = detail::make_multipart_data_boundary();
const auto &content_type = const auto &content_type =
detail::serialize_multipart_formdata_get_content_type(boundary); detail::serialize_multipart_formdata_get_content_type(boundary);
return send_with_content_provider( return send_with_content_provider_and_receiver(
"PUT", path, headers, nullptr, 0, nullptr, "PUT", path, headers, nullptr, 0, nullptr,
get_multipart_content_provider(boundary, items, provider_items), get_multipart_content_provider(boundary, items, provider_items),
content_type, progress); content_type, nullptr, progress);
} }
inline Result ClientImpl::Put(const std::string &path, const Headers &headers, inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
@@ -10121,6 +10241,15 @@ inline Result ClientImpl::Patch(const std::string &path, size_t content_length,
content_type, progress); content_type, progress);
} }
inline Result ClientImpl::Patch(const std::string &path, size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return Patch(path, Headers(), content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result ClientImpl::Patch(const std::string &path, inline Result ClientImpl::Patch(const std::string &path,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
@@ -10129,6 +10258,15 @@ inline Result ClientImpl::Patch(const std::string &path,
progress); progress);
} }
inline Result ClientImpl::Patch(const std::string &path,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return Patch(path, Headers(), std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
const Params &params) { const Params &params) {
auto query = detail::params_to_query_str(params); auto query = detail::params_to_query_str(params);
@@ -10169,18 +10307,18 @@ inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
const char *body, size_t content_length, const char *body, size_t content_length,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PATCH", path, headers, body, return send_with_content_provider_and_receiver(
content_length, nullptr, nullptr, "PATCH", path, headers, body, content_length, nullptr, nullptr,
content_type, progress); content_type, nullptr, progress);
} }
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
const std::string &body, const std::string &body,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PATCH", path, headers, body.data(), return send_with_content_provider_and_receiver(
body.size(), nullptr, nullptr, content_type, "PATCH", path, headers, body.data(), body.size(), nullptr, nullptr,
progress); content_type, nullptr, progress);
} }
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
@@ -10188,18 +10326,40 @@ inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
ContentProvider content_provider, ContentProvider content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PATCH", path, headers, nullptr, return send_with_content_provider_and_receiver(
content_length, std::move(content_provider), "PATCH", path, headers, nullptr, content_length,
nullptr, content_type, progress); std::move(content_provider), nullptr, content_type, nullptr, progress);
}
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return send_with_content_provider_and_receiver(
"PATCH", path, headers, nullptr, content_length,
std::move(content_provider), nullptr, content_type,
std::move(content_receiver), progress);
} }
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return send_with_content_provider("PATCH", path, headers, nullptr, 0, nullptr, return send_with_content_provider_and_receiver(
std::move(content_provider), content_type, "PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider),
progress); content_type, nullptr, progress);
}
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return send_with_content_provider_and_receiver(
"PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider),
content_type, std::move(content_receiver), progress);
} }
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
@@ -10209,10 +10369,10 @@ inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
const auto &boundary = detail::make_multipart_data_boundary(); const auto &boundary = detail::make_multipart_data_boundary();
const auto &content_type = const auto &content_type =
detail::serialize_multipart_formdata_get_content_type(boundary); detail::serialize_multipart_formdata_get_content_type(boundary);
return send_with_content_provider( return send_with_content_provider_and_receiver(
"PATCH", path, headers, nullptr, 0, nullptr, "PATCH", path, headers, nullptr, 0, nullptr,
get_multipart_content_provider(boundary, items, provider_items), get_multipart_content_provider(boundary, items, provider_items),
content_type, progress); content_type, nullptr, progress);
} }
inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
@@ -11604,12 +11764,28 @@ inline Result Client::Post(const std::string &path, size_t content_length,
return cli_->Post(path, content_length, std::move(content_provider), return cli_->Post(path, content_length, std::move(content_provider),
content_type, progress); content_type, progress);
} }
inline Result Client::Post(const std::string &path, size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Post(path, content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result Client::Post(const std::string &path, inline Result Client::Post(const std::string &path,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return cli_->Post(path, std::move(content_provider), content_type, progress); return cli_->Post(path, std::move(content_provider), content_type, progress);
} }
inline Result Client::Post(const std::string &path,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Post(path, std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result Client::Post(const std::string &path, const Headers &headers, inline Result Client::Post(const std::string &path, const Headers &headers,
size_t content_length, size_t content_length,
ContentProvider content_provider, ContentProvider content_provider,
@@ -11618,6 +11794,15 @@ inline Result Client::Post(const std::string &path, const Headers &headers,
return cli_->Post(path, headers, content_length, std::move(content_provider), return cli_->Post(path, headers, content_length, std::move(content_provider),
content_type, progress); content_type, progress);
} }
inline Result Client::Post(const std::string &path, const Headers &headers,
size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
DownloadProgress progress) {
return cli_->Post(path, headers, content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result Client::Post(const std::string &path, const Headers &headers, inline Result Client::Post(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
@@ -11625,6 +11810,14 @@ inline Result Client::Post(const std::string &path, const Headers &headers,
return cli_->Post(path, headers, std::move(content_provider), content_type, return cli_->Post(path, headers, std::move(content_provider), content_type,
progress); progress);
} }
inline Result Client::Post(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
DownloadProgress progress) {
return cli_->Post(path, headers, std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result Client::Post(const std::string &path, const Params &params) { inline Result Client::Post(const std::string &path, const Params &params) {
return cli_->Post(path, params); return cli_->Post(path, params);
} }
@@ -11659,8 +11852,8 @@ inline Result Client::Post(const std::string &path, const Headers &headers,
const std::string &content_type, const std::string &content_type,
ContentReceiver content_receiver, ContentReceiver content_receiver,
DownloadProgress progress) { DownloadProgress progress) {
return cli_->Post(path, headers, body, content_type, content_receiver, return cli_->Post(path, headers, body, content_type,
progress); std::move(content_receiver), progress);
} }
inline Result Client::Put(const std::string &path) { return cli_->Put(path); } inline Result Client::Put(const std::string &path) { return cli_->Put(path); }
@@ -11697,12 +11890,28 @@ inline Result Client::Put(const std::string &path, size_t content_length,
return cli_->Put(path, content_length, std::move(content_provider), return cli_->Put(path, content_length, std::move(content_provider),
content_type, progress); content_type, progress);
} }
inline Result Client::Put(const std::string &path, size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Put(path, content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result Client::Put(const std::string &path, inline Result Client::Put(const std::string &path,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return cli_->Put(path, std::move(content_provider), content_type, progress); return cli_->Put(path, std::move(content_provider), content_type, progress);
} }
inline Result Client::Put(const std::string &path,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Put(path, std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result Client::Put(const std::string &path, const Headers &headers, inline Result Client::Put(const std::string &path, const Headers &headers,
size_t content_length, size_t content_length,
ContentProvider content_provider, ContentProvider content_provider,
@@ -11711,6 +11920,15 @@ inline Result Client::Put(const std::string &path, const Headers &headers,
return cli_->Put(path, headers, content_length, std::move(content_provider), return cli_->Put(path, headers, content_length, std::move(content_provider),
content_type, progress); content_type, progress);
} }
inline Result Client::Put(const std::string &path, const Headers &headers,
size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Put(path, headers, content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result Client::Put(const std::string &path, const Headers &headers, inline Result Client::Put(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
@@ -11718,6 +11936,14 @@ inline Result Client::Put(const std::string &path, const Headers &headers,
return cli_->Put(path, headers, std::move(content_provider), content_type, return cli_->Put(path, headers, std::move(content_provider), content_type,
progress); progress);
} }
inline Result Client::Put(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Put(path, headers, std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result Client::Put(const std::string &path, const Params &params) { inline Result Client::Put(const std::string &path, const Params &params) {
return cli_->Put(path, params); return cli_->Put(path, params);
} }
@@ -11793,12 +12019,28 @@ inline Result Client::Patch(const std::string &path, size_t content_length,
return cli_->Patch(path, content_length, std::move(content_provider), return cli_->Patch(path, content_length, std::move(content_provider),
content_type, progress); content_type, progress);
} }
inline Result Client::Patch(const std::string &path, size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Patch(path, content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result Client::Patch(const std::string &path, inline Result Client::Patch(const std::string &path,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
UploadProgress progress) { UploadProgress progress) {
return cli_->Patch(path, std::move(content_provider), content_type, progress); return cli_->Patch(path, std::move(content_provider), content_type, progress);
} }
inline Result Client::Patch(const std::string &path,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Patch(path, std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result Client::Patch(const std::string &path, const Headers &headers, inline Result Client::Patch(const std::string &path, const Headers &headers,
size_t content_length, size_t content_length,
ContentProvider content_provider, ContentProvider content_provider,
@@ -11807,6 +12049,15 @@ inline Result Client::Patch(const std::string &path, const Headers &headers,
return cli_->Patch(path, headers, content_length, std::move(content_provider), return cli_->Patch(path, headers, content_length, std::move(content_provider),
content_type, progress); content_type, progress);
} }
inline Result Client::Patch(const std::string &path, const Headers &headers,
size_t content_length,
ContentProvider content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Patch(path, headers, content_length, std::move(content_provider),
content_type, std::move(content_receiver), progress);
}
inline Result Client::Patch(const std::string &path, const Headers &headers, inline Result Client::Patch(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider, ContentProviderWithoutLength content_provider,
const std::string &content_type, const std::string &content_type,
@@ -11814,6 +12065,14 @@ inline Result Client::Patch(const std::string &path, const Headers &headers,
return cli_->Patch(path, headers, std::move(content_provider), content_type, return cli_->Patch(path, headers, std::move(content_provider), content_type,
progress); progress);
} }
inline Result Client::Patch(const std::string &path, const Headers &headers,
ContentProviderWithoutLength content_provider,
const std::string &content_type,
ContentReceiver content_receiver,
UploadProgress progress) {
return cli_->Patch(path, headers, std::move(content_provider), content_type,
std::move(content_receiver), progress);
}
inline Result Client::Patch(const std::string &path, const Params &params) { inline Result Client::Patch(const std::string &path, const Params &params) {
return cli_->Patch(path, params); return cli_->Patch(path, params);
} }

View File

@@ -3423,6 +3423,39 @@ protected:
EXPECT_EQ(req.body, LARGE_DATA); EXPECT_EQ(req.body, LARGE_DATA);
res.set_content(req.body, "text/plain"); res.set_content(req.body, "text/plain");
}) })
.Post("/post-loopback",
[&](const Request &req, Response &res,
ContentReader const &content_reader) {
std::string body;
content_reader([&](const char *data, size_t data_length) {
body.append(data, data_length);
return true;
});
res.set_content(body, "text/plain");
})
.Put("/put-loopback",
[&](const Request &req, Response &res,
ContentReader const &content_reader) {
std::string body;
content_reader([&](const char *data, size_t data_length) {
body.append(data, data_length);
return true;
});
res.set_content(body, "text/plain");
})
.Patch("/patch-loopback",
[&](const Request &req, Response &res,
ContentReader const &content_reader) {
std::string body;
content_reader([&](const char *data, size_t data_length) {
body.append(data, data_length);
return true;
});
res.set_content(body, "text/plain");
})
.Put("/empty-no-content-type", .Put("/empty-no-content-type",
[&](const Request &req, Response &res) { [&](const Request &req, Response &res) {
EXPECT_EQ(req.body, ""); EXPECT_EQ(req.body, "");
@@ -5183,6 +5216,94 @@ TEST_F(ServerTest, PostWithContentProviderWithoutLengthAbort) {
EXPECT_EQ(Error::Canceled, res.error()); EXPECT_EQ(Error::Canceled, res.error());
} }
TEST_F(ServerTest, PostLoopBack) {
std::string body;
auto res = cli_.Post(
"/post-loopback", 9,
[](size_t /*offset*/, size_t length, DataSink &sink) {
EXPECT_EQ(9u, length);
sink.write("123", 3);
sink.write("456", 3);
sink.write("789", 3);
return true;
},
"text/plain",
[&body](const char *data, size_t data_length) {
body.append(data, data_length);
return true;
});
ASSERT_TRUE(res);
EXPECT_EQ(StatusCode::OK_200, res->status);
EXPECT_EQ("123456789", body);
}
TEST_F(ServerTest, PutLoopBack) {
std::string body;
auto res = cli_.Put(
"/put-loopback", 9,
[](size_t /*offset*/, size_t length, DataSink &sink) {
EXPECT_EQ(9u, length);
sink.write("123", 3);
sink.write("456", 3);
sink.write("789", 3);
return true;
},
"text/plain",
[&body](const char *data, size_t data_length) {
body.append(data, data_length);
return true;
});
ASSERT_TRUE(res);
EXPECT_EQ(StatusCode::OK_200, res->status);
EXPECT_EQ("123456789", body);
}
TEST_F(ServerTest, PatchLoopBack) {
std::string body;
auto res = cli_.Patch(
"/patch-loopback", 9,
[](size_t /*offset*/, size_t length, DataSink &sink) {
EXPECT_EQ(9u, length);
sink.write("123", 3);
sink.write("456", 3);
sink.write("789", 3);
return true;
},
"text/plain",
[&body](const char *data, size_t data_length) {
body.append(data, data_length);
return true;
});
ASSERT_TRUE(res);
EXPECT_EQ(StatusCode::OK_200, res->status);
EXPECT_EQ("123456789", body);
}
TEST_F(ServerTest, PostLoopBackWithoutRequestContentLength) {
std::string body;
auto res = cli_.Post(
"/post-loopback",
[](size_t /*offset*/, DataSink &sink) {
sink.write("123", 3);
sink.write("456", 3);
sink.write("789", 3);
sink.done();
return true;
},
"text/plain",
[&body](const char *data, size_t data_length) {
body.append(data, data_length);
return true;
});
ASSERT_TRUE(res);
EXPECT_EQ(StatusCode::OK_200, res->status);
EXPECT_EQ("123456789", body);
}
#ifdef CPPHTTPLIB_ZLIB_SUPPORT #ifdef CPPHTTPLIB_ZLIB_SUPPORT
TEST_F(ServerTest, PutWithContentProviderWithGzip) { TEST_F(ServerTest, PutWithContentProviderWithGzip) {
cli_.set_compress(true); cli_.set_compress(true);