|
|
@@ -1087,22 +1087,30 @@ int getaddrinfo_with_timeout(const char *node, const char *service,
|
|
|
// Fallback implementation using thread-based timeout for other Unix systems
|
|
|
|
|
|
struct GetAddrInfoState {
|
|
|
+ ~GetAddrInfoState() {
|
|
|
+ if (info) { freeaddrinfo(info); }
|
|
|
+ }
|
|
|
+
|
|
|
std::mutex mutex;
|
|
|
std::condition_variable result_cv;
|
|
|
bool completed = false;
|
|
|
int result = EAI_SYSTEM;
|
|
|
- std::string node = node;
|
|
|
- std::string service = service;
|
|
|
- struct addrinfo hints = hints;
|
|
|
+ std::string node;
|
|
|
+ std::string service;
|
|
|
+ struct addrinfo hints;
|
|
|
struct addrinfo *info = nullptr;
|
|
|
};
|
|
|
|
|
|
// Allocate on the heap, so the resolver thread can keep using the data.
|
|
|
auto state = std::make_shared<GetAddrInfoState>();
|
|
|
+ state->node = node;
|
|
|
+ state->service = service;
|
|
|
+ state->hints = *hints;
|
|
|
|
|
|
- std::thread resolve_thread([=]() {
|
|
|
- auto thread_result = getaddrinfo(
|
|
|
- state->node.c_str(), state->service.c_str(), hints, &state->info);
|
|
|
+ std::thread resolve_thread([state]() {
|
|
|
+ auto thread_result =
|
|
|
+ getaddrinfo(state->node.c_str(), state->service.c_str(), &state->hints,
|
|
|
+ &state->info);
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(state->mutex);
|
|
|
state->result = thread_result;
|
|
|
@@ -1120,6 +1128,7 @@ int getaddrinfo_with_timeout(const char *node, const char *service,
|
|
|
// Operation completed within timeout
|
|
|
resolve_thread.join();
|
|
|
*res = state->info;
|
|
|
+ state->info = nullptr; // Pass ownership to caller
|
|
|
return state->result;
|
|
|
} else {
|
|
|
// Timeout occurred
|
|
|
@@ -4970,7 +4979,8 @@ bool Server::write_response_core(Stream &strm, bool close_connection,
|
|
|
if (need_apply_ranges) { apply_ranges(req, res, content_type, boundary); }
|
|
|
|
|
|
// Prepare additional headers
|
|
|
- if (close_connection || req.get_header_value("Connection") == "close") {
|
|
|
+ if (close_connection || req.get_header_value("Connection") == "close" ||
|
|
|
+ 400 <= res.status) { // Don't leave connections open after errors
|
|
|
res.set_header("Connection", "close");
|
|
|
} else {
|
|
|
std::string s = "timeout=";
|
|
|
@@ -5173,7 +5183,11 @@ bool Server::read_content_core(
|
|
|
size_t /*len*/) { return receiver(buf, n); };
|
|
|
}
|
|
|
|
|
|
- if (req.method == "DELETE" && !req.has_header("Content-Length")) {
|
|
|
+ // RFC 7230 Section 3.3.3: If this is a request message and none of the above
|
|
|
+ // are true (no Transfer-Encoding and no Content-Length), then the message
|
|
|
+ // body length is zero (no message body is present).
|
|
|
+ if (!req.has_header("Content-Length") &&
|
|
|
+ !detail::is_chunked_transfer_encoding(req.headers)) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -5681,8 +5695,6 @@ Server::process_request(Stream &strm, const std::string &remote_addr,
|
|
|
|
|
|
// Check if the request URI doesn't exceed the limit
|
|
|
if (req.target.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) {
|
|
|
- Headers dummy;
|
|
|
- detail::read_headers(strm, dummy);
|
|
|
res.status = StatusCode::UriTooLong_414;
|
|
|
output_error_log(Error::ExceedUriMaxLength, &req);
|
|
|
return write_response(strm, close_connection, req, res);
|
|
|
@@ -6666,11 +6678,13 @@ bool ClientImpl::write_request(Stream &strm, Request &req,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-std::unique_ptr<Response> ClientImpl::send_with_content_provider(
|
|
|
+std::unique_ptr<Response>
|
|
|
+ClientImpl::send_with_content_provider_and_receiver(
|
|
|
Request &req, const char *body, size_t content_length,
|
|
|
ContentProvider content_provider,
|
|
|
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); }
|
|
|
|
|
|
#ifdef CPPHTTPLIB_ZLIB_SUPPORT
|
|
|
@@ -6743,15 +6757,24 @@ 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>();
|
|
|
return send(req, *res, error) ? std::move(res) : nullptr;
|
|
|
}
|
|
|
|
|
|
-Result ClientImpl::send_with_content_provider(
|
|
|
+Result ClientImpl::send_with_content_provider_and_receiver(
|
|
|
const std::string &method, const std::string &path, const Headers &headers,
|
|
|
const char *body, size_t content_length, ContentProvider content_provider,
|
|
|
ContentProviderWithoutLength content_provider_without_length,
|
|
|
- const std::string &content_type, UploadProgress progress) {
|
|
|
+ const std::string &content_type, ContentReceiver content_receiver,
|
|
|
+ UploadProgress progress) {
|
|
|
Request req;
|
|
|
req.method = method;
|
|
|
req.headers = headers;
|
|
|
@@ -6763,9 +6786,10 @@ Result ClientImpl::send_with_content_provider(
|
|
|
|
|
|
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),
|
|
|
- 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
|
|
|
return Result{std::move(res), error, std::move(req.headers), last_ssl_error_,
|
|
|
@@ -7094,6 +7118,15 @@ Result ClientImpl::Post(const std::string &path, size_t content_length,
|
|
|
content_type, progress);
|
|
|
}
|
|
|
|
|
|
+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);
|
|
|
+}
|
|
|
+
|
|
|
Result ClientImpl::Post(const std::string &path,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
@@ -7102,6 +7135,15 @@ Result ClientImpl::Post(const std::string &path,
|
|
|
progress);
|
|
|
}
|
|
|
|
|
|
+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);
|
|
|
+}
|
|
|
+
|
|
|
Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
const Params ¶ms) {
|
|
|
auto query = detail::params_to_query_str(params);
|
|
|
@@ -7142,17 +7184,18 @@ Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
const char *body, size_t content_length,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("POST", path, headers, body, content_length,
|
|
|
- nullptr, nullptr, content_type, progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "POST", path, headers, body, content_length, nullptr, nullptr,
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
const std::string &body,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("POST", path, headers, body.data(),
|
|
|
- body.size(), nullptr, nullptr, content_type,
|
|
|
- progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "POST", path, headers, body.data(), body.size(), nullptr, nullptr,
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
@@ -7160,18 +7203,40 @@ Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
ContentProvider content_provider,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("POST", path, headers, nullptr,
|
|
|
- content_length, std::move(content_provider),
|
|
|
- nullptr, content_type, progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "POST", path, headers, nullptr, content_length,
|
|
|
+ std::move(content_provider), nullptr, content_type, nullptr, progress);
|
|
|
+}
|
|
|
+
|
|
|
+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));
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr,
|
|
|
- std::move(content_provider), content_type,
|
|
|
- progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "POST", path, headers, nullptr, 0, nullptr, std::move(content_provider),
|
|
|
+ content_type, nullptr, progress);
|
|
|
+}
|
|
|
+
|
|
|
+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));
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
@@ -7181,10 +7246,10 @@ Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
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,
|
|
|
get_multipart_content_provider(boundary, items, provider_items),
|
|
|
- content_type, progress);
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
@@ -7246,6 +7311,15 @@ Result ClientImpl::Put(const std::string &path, size_t content_length,
|
|
|
content_type, progress);
|
|
|
}
|
|
|
|
|
|
+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);
|
|
|
+}
|
|
|
+
|
|
|
Result ClientImpl::Put(const std::string &path,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
@@ -7254,6 +7328,15 @@ Result ClientImpl::Put(const std::string &path,
|
|
|
progress);
|
|
|
}
|
|
|
|
|
|
+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);
|
|
|
+}
|
|
|
+
|
|
|
Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
const Params ¶ms) {
|
|
|
auto query = detail::params_to_query_str(params);
|
|
|
@@ -7294,17 +7377,18 @@ Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
const char *body, size_t content_length,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("PUT", path, headers, body, content_length,
|
|
|
- nullptr, nullptr, content_type, progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PUT", path, headers, body, content_length, nullptr, nullptr,
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
const std::string &body,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("PUT", path, headers, body.data(),
|
|
|
- body.size(), nullptr, nullptr, content_type,
|
|
|
- progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PUT", path, headers, body.data(), body.size(), nullptr, nullptr,
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
@@ -7312,18 +7396,40 @@ Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
ContentProvider content_provider,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("PUT", path, headers, nullptr,
|
|
|
- content_length, std::move(content_provider),
|
|
|
- nullptr, content_type, progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PUT", path, headers, nullptr, content_length,
|
|
|
+ std::move(content_provider), nullptr, content_type, nullptr, progress);
|
|
|
+}
|
|
|
+
|
|
|
+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);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr,
|
|
|
- std::move(content_provider), content_type,
|
|
|
- progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider),
|
|
|
+ content_type, nullptr, progress);
|
|
|
+}
|
|
|
+
|
|
|
+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);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
@@ -7333,10 +7439,10 @@ Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
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,
|
|
|
get_multipart_content_provider(boundary, items, provider_items),
|
|
|
- content_type, progress);
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
@@ -7400,6 +7506,15 @@ Result ClientImpl::Patch(const std::string &path, size_t content_length,
|
|
|
content_type, progress);
|
|
|
}
|
|
|
|
|
|
+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);
|
|
|
+}
|
|
|
+
|
|
|
Result ClientImpl::Patch(const std::string &path,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
@@ -7408,6 +7523,15 @@ Result ClientImpl::Patch(const std::string &path,
|
|
|
progress);
|
|
|
}
|
|
|
|
|
|
+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);
|
|
|
+}
|
|
|
+
|
|
|
Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
const Params ¶ms) {
|
|
|
auto query = detail::params_to_query_str(params);
|
|
|
@@ -7448,37 +7572,59 @@ Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
const char *body, size_t content_length,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("PATCH", path, headers, body,
|
|
|
- content_length, nullptr, nullptr,
|
|
|
- content_type, progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PATCH", path, headers, body, content_length, nullptr, nullptr,
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
const std::string &body,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("PATCH", path, headers, body.data(),
|
|
|
- body.size(), nullptr, nullptr, content_type,
|
|
|
- progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PATCH", path, headers, body.data(), body.size(), nullptr, nullptr,
|
|
|
+ content_type, nullptr, progress);
|
|
|
+}
|
|
|
+
|
|
|
+Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
+ size_t content_length,
|
|
|
+ ContentProvider content_provider,
|
|
|
+ const std::string &content_type,
|
|
|
+ UploadProgress progress) {
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PATCH", path, headers, nullptr, content_length,
|
|
|
+ std::move(content_provider), nullptr, content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
+}
|
|
|
+
|
|
|
+Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
+ ContentProviderWithoutLength content_provider,
|
|
|
+ const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
- return send_with_content_provider("PATCH", path, headers, nullptr,
|
|
|
- content_length, std::move(content_provider),
|
|
|
- nullptr, content_type, progress);
|
|
|
+ return send_with_content_provider_and_receiver(
|
|
|
+ "PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider),
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
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("PATCH", path, headers, nullptr, 0, nullptr,
|
|
|
- std::move(content_provider), content_type,
|
|
|
- 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);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
@@ -7488,10 +7634,10 @@ Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
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,
|
|
|
get_multipart_content_provider(boundary, items, provider_items),
|
|
|
- content_type, progress);
|
|
|
+ content_type, nullptr, progress);
|
|
|
}
|
|
|
|
|
|
Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
@@ -8883,12 +9029,28 @@ Result Client::Post(const std::string &path, size_t content_length,
|
|
|
return cli_->Post(path, content_length, std::move(content_provider),
|
|
|
content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Post(const std::string &path,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Post(path, std::move(content_provider), content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
size_t content_length,
|
|
|
ContentProvider content_provider,
|
|
|
@@ -8897,6 +9059,15 @@ Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
return cli_->Post(path, headers, content_length, std::move(content_provider),
|
|
|
content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
@@ -8904,6 +9075,14 @@ Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
return cli_->Post(path, headers, std::move(content_provider), content_type,
|
|
|
progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Post(const std::string &path, const Params ¶ms) {
|
|
|
return cli_->Post(path, params);
|
|
|
}
|
|
|
@@ -8938,8 +9117,8 @@ Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
const std::string &content_type,
|
|
|
ContentReceiver content_receiver,
|
|
|
DownloadProgress progress) {
|
|
|
- return cli_->Post(path, headers, body, content_type, content_receiver,
|
|
|
- progress);
|
|
|
+ return cli_->Post(path, headers, body, content_type,
|
|
|
+ std::move(content_receiver), progress);
|
|
|
}
|
|
|
|
|
|
Result Client::Put(const std::string &path) { return cli_->Put(path); }
|
|
|
@@ -8976,12 +9155,28 @@ Result Client::Put(const std::string &path, size_t content_length,
|
|
|
return cli_->Put(path, content_length, std::move(content_provider),
|
|
|
content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Put(const std::string &path,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Put(path, std::move(content_provider), content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
size_t content_length,
|
|
|
ContentProvider content_provider,
|
|
|
@@ -8990,6 +9185,15 @@ Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
return cli_->Put(path, headers, content_length, std::move(content_provider),
|
|
|
content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
@@ -8997,6 +9201,14 @@ Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
return cli_->Put(path, headers, std::move(content_provider), content_type,
|
|
|
progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Put(const std::string &path, const Params ¶ms) {
|
|
|
return cli_->Put(path, params);
|
|
|
}
|
|
|
@@ -9072,12 +9284,28 @@ Result Client::Patch(const std::string &path, size_t content_length,
|
|
|
return cli_->Patch(path, content_length, std::move(content_provider),
|
|
|
content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Patch(const std::string &path,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Patch(path, std::move(content_provider), content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
size_t content_length,
|
|
|
ContentProvider content_provider,
|
|
|
@@ -9086,6 +9314,15 @@ Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
return cli_->Patch(path, headers, content_length, std::move(content_provider),
|
|
|
content_type, progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
ContentProviderWithoutLength content_provider,
|
|
|
const std::string &content_type,
|
|
|
@@ -9093,6 +9330,14 @@ Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
return cli_->Patch(path, headers, std::move(content_provider), content_type,
|
|
|
progress);
|
|
|
}
|
|
|
+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);
|
|
|
+}
|
|
|
Result Client::Patch(const std::string &path, const Params ¶ms) {
|
|
|
return cli_->Patch(path, params);
|
|
|
}
|