|
|
@@ -561,24 +561,47 @@ using UploadProgress = std::function<bool(uint64_t current, uint64_t total)>;
|
|
|
struct Response;
|
|
|
using ResponseHandler = std::function<bool(const Response &response)>;
|
|
|
|
|
|
-struct MultipartFormData {
|
|
|
+struct FormData {
|
|
|
std::string name;
|
|
|
std::string content;
|
|
|
std::string filename;
|
|
|
std::string content_type;
|
|
|
Headers headers;
|
|
|
};
|
|
|
-using MultipartFormDataItems = std::vector<MultipartFormData>;
|
|
|
-using MultipartFormDataMap = std::multimap<std::string, MultipartFormData>;
|
|
|
|
|
|
-struct MultipartFormDataForClientInput {
|
|
|
+struct FormField {
|
|
|
+ std::string name;
|
|
|
+ std::string content;
|
|
|
+ Headers headers;
|
|
|
+};
|
|
|
+using FormFields = std::multimap<std::string, FormField>;
|
|
|
+
|
|
|
+using FormFiles = std::multimap<std::string, FormData>;
|
|
|
+
|
|
|
+struct MultipartFormData {
|
|
|
+ FormFields fields; // Text fields from multipart
|
|
|
+ FormFiles files; // Files from multipart
|
|
|
+
|
|
|
+ // Text field access
|
|
|
+ std::string get_field(const std::string &key, size_t id = 0) const;
|
|
|
+ std::vector<std::string> get_fields(const std::string &key) const;
|
|
|
+ bool has_field(const std::string &key) const;
|
|
|
+ size_t get_field_count(const std::string &key) const;
|
|
|
+
|
|
|
+ // File access
|
|
|
+ FormData get_file(const std::string &key, size_t id = 0) const;
|
|
|
+ std::vector<FormData> get_files(const std::string &key) const;
|
|
|
+ bool has_file(const std::string &key) const;
|
|
|
+ size_t get_file_count(const std::string &key) const;
|
|
|
+};
|
|
|
+
|
|
|
+struct UploadFormData {
|
|
|
std::string name;
|
|
|
std::string content;
|
|
|
std::string filename;
|
|
|
std::string content_type;
|
|
|
};
|
|
|
-using MultipartFormDataItemsForClientInput =
|
|
|
- std::vector<MultipartFormDataForClientInput>;
|
|
|
+using UploadFormDataItems = std::vector<UploadFormData>;
|
|
|
|
|
|
class DataSink {
|
|
|
public:
|
|
|
@@ -621,13 +644,13 @@ using ContentProviderWithoutLength =
|
|
|
|
|
|
using ContentProviderResourceReleaser = std::function<void(bool success)>;
|
|
|
|
|
|
-struct MultipartFormDataProvider {
|
|
|
+struct FormDataProvider {
|
|
|
std::string name;
|
|
|
ContentProviderWithoutLength provider;
|
|
|
std::string filename;
|
|
|
std::string content_type;
|
|
|
};
|
|
|
-using MultipartFormDataProviderItems = std::vector<MultipartFormDataProvider>;
|
|
|
+using FormDataProviderItems = std::vector<FormDataProvider>;
|
|
|
|
|
|
using ContentReceiverWithProgress =
|
|
|
std::function<bool(const char *data, size_t data_length, uint64_t offset,
|
|
|
@@ -636,22 +659,20 @@ using ContentReceiverWithProgress =
|
|
|
using ContentReceiver =
|
|
|
std::function<bool(const char *data, size_t data_length)>;
|
|
|
|
|
|
-using MultipartContentHeader =
|
|
|
- std::function<bool(const MultipartFormData &file)>;
|
|
|
+using FormDataHeader = std::function<bool(const FormData &file)>;
|
|
|
|
|
|
class ContentReader {
|
|
|
public:
|
|
|
using Reader = std::function<bool(ContentReceiver receiver)>;
|
|
|
- using MultipartReader = std::function<bool(MultipartContentHeader header,
|
|
|
- ContentReceiver receiver)>;
|
|
|
+ using FormDataReader =
|
|
|
+ std::function<bool(FormDataHeader header, ContentReceiver receiver)>;
|
|
|
|
|
|
- ContentReader(Reader reader, MultipartReader multipart_reader)
|
|
|
+ ContentReader(Reader reader, FormDataReader multipart_reader)
|
|
|
: reader_(std::move(reader)),
|
|
|
- multipart_reader_(std::move(multipart_reader)) {}
|
|
|
+ formdata_reader_(std::move(multipart_reader)) {}
|
|
|
|
|
|
- bool operator()(MultipartContentHeader header,
|
|
|
- ContentReceiver receiver) const {
|
|
|
- return multipart_reader_(std::move(header), std::move(receiver));
|
|
|
+ bool operator()(FormDataHeader header, ContentReceiver receiver) const {
|
|
|
+ return formdata_reader_(std::move(header), std::move(receiver));
|
|
|
}
|
|
|
|
|
|
bool operator()(ContentReceiver receiver) const {
|
|
|
@@ -659,7 +680,7 @@ public:
|
|
|
}
|
|
|
|
|
|
Reader reader_;
|
|
|
- MultipartReader multipart_reader_;
|
|
|
+ FormDataReader formdata_reader_;
|
|
|
};
|
|
|
|
|
|
using Range = std::pair<ssize_t, ssize_t>;
|
|
|
@@ -681,7 +702,7 @@ struct Request {
|
|
|
// for server
|
|
|
std::string version;
|
|
|
std::string target;
|
|
|
- MultipartFormDataMap files;
|
|
|
+ MultipartFormData form;
|
|
|
Ranges ranges;
|
|
|
Match matches;
|
|
|
std::unordered_map<std::string, std::string> path_params;
|
|
|
@@ -711,10 +732,6 @@ struct Request {
|
|
|
|
|
|
bool is_multipart_form_data() const;
|
|
|
|
|
|
- bool has_file(const std::string &key) const;
|
|
|
- MultipartFormData get_file_value(const std::string &key) const;
|
|
|
- std::vector<MultipartFormData> get_file_values(const std::string &key) const;
|
|
|
-
|
|
|
// private members...
|
|
|
size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT;
|
|
|
size_t content_length_ = 0;
|
|
|
@@ -1159,14 +1176,14 @@ private:
|
|
|
Response &res, const std::string &boundary,
|
|
|
const std::string &content_type);
|
|
|
bool read_content(Stream &strm, Request &req, Response &res);
|
|
|
- bool
|
|
|
- read_content_with_content_receiver(Stream &strm, Request &req, Response &res,
|
|
|
- ContentReceiver receiver,
|
|
|
- MultipartContentHeader multipart_header,
|
|
|
- ContentReceiver multipart_receiver);
|
|
|
+ bool read_content_with_content_receiver(Stream &strm, Request &req,
|
|
|
+ Response &res,
|
|
|
+ ContentReceiver receiver,
|
|
|
+ FormDataHeader multipart_header,
|
|
|
+ ContentReceiver multipart_receiver);
|
|
|
bool read_content_core(Stream &strm, Request &req, Response &res,
|
|
|
ContentReceiver receiver,
|
|
|
- MultipartContentHeader multipart_header,
|
|
|
+ FormDataHeader multipart_header,
|
|
|
ContentReceiver multipart_receiver) const;
|
|
|
|
|
|
virtual bool process_and_close_socket(socket_t sock);
|
|
|
@@ -1333,16 +1350,16 @@ public:
|
|
|
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, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
|
|
|
Result Post(const std::string &path, const Params ¶ms);
|
|
|
- Result Post(const std::string &path, const MultipartFormDataItemsForClientInput &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, 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, size_t content_length, ContentProvider 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, const Params ¶ms);
|
|
|
- Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, UploadProgress progress = nullptr);
|
|
|
- Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const std::string &boundary, UploadProgress progress = nullptr);
|
|
|
- Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const MultipartFormDataProviderItems &provider_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 FormDataProviderItems &provider_items, UploadProgress progress = nullptr);
|
|
|
Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
|
|
|
|
|
|
Result Put(const std::string &path);
|
|
|
@@ -1351,16 +1368,16 @@ public:
|
|
|
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, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
|
|
|
Result Put(const std::string &path, const Params ¶ms);
|
|
|
- Result Put(const std::string &path, const MultipartFormDataItemsForClientInput &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, 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, size_t content_length, ContentProvider 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, const Params ¶ms);
|
|
|
- Result Put(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, UploadProgress progress = nullptr);
|
|
|
- Result Put(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const std::string &boundary, UploadProgress progress = nullptr);
|
|
|
- Result Put(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const MultipartFormDataProviderItems &provider_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 FormDataProviderItems &provider_items, UploadProgress progress = nullptr);
|
|
|
Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
|
|
|
|
|
|
Result Patch(const std::string &path);
|
|
|
@@ -1369,16 +1386,16 @@ public:
|
|
|
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, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
|
|
|
Result Patch(const std::string &path, const Params ¶ms);
|
|
|
- Result Patch(const std::string &path, const MultipartFormDataItemsForClientInput &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, 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, size_t content_length, ContentProvider 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, const Params ¶ms);
|
|
|
- Result Patch(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, UploadProgress progress = nullptr);
|
|
|
- Result Patch(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const std::string &boundary, UploadProgress progress = nullptr);
|
|
|
- Result Patch(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const MultipartFormDataProviderItems &provider_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 FormDataProviderItems &provider_items, UploadProgress progress = nullptr);
|
|
|
Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
|
|
|
|
|
|
Result Delete(const std::string &path, DownloadProgress progress = nullptr);
|
|
|
@@ -1628,9 +1645,8 @@ private:
|
|
|
ContentProviderWithoutLength content_provider_without_length,
|
|
|
const std::string &content_type, UploadProgress progress);
|
|
|
ContentProviderWithoutLength get_multipart_content_provider(
|
|
|
- const std::string &boundary,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items) const;
|
|
|
+ const std::string &boundary, const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items) const;
|
|
|
|
|
|
std::string adjust_host_string(const std::string &host) const;
|
|
|
|
|
|
@@ -1684,16 +1700,16 @@ public:
|
|
|
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, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
|
|
|
Result Post(const std::string &path, const Params ¶ms);
|
|
|
- Result Post(const std::string &path, const MultipartFormDataItemsForClientInput &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, 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, size_t content_length, ContentProvider 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, const Params ¶ms);
|
|
|
- Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, UploadProgress progress = nullptr);
|
|
|
- Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const std::string &boundary, UploadProgress progress = nullptr);
|
|
|
- Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const MultipartFormDataProviderItems &provider_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 FormDataProviderItems &provider_items, UploadProgress progress = nullptr);
|
|
|
Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
|
|
|
|
|
|
Result Put(const std::string &path);
|
|
|
@@ -1702,16 +1718,16 @@ public:
|
|
|
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, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
|
|
|
Result Put(const std::string &path, const Params ¶ms);
|
|
|
- Result Put(const std::string &path, const MultipartFormDataItemsForClientInput &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, 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, size_t content_length, ContentProvider 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, const Params ¶ms);
|
|
|
- Result Put(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, UploadProgress progress = nullptr);
|
|
|
- Result Put(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const std::string &boundary, UploadProgress progress = nullptr);
|
|
|
- Result Put(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const MultipartFormDataProviderItems &provider_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 FormDataProviderItems &provider_items, UploadProgress progress = nullptr);
|
|
|
Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
|
|
|
|
|
|
Result Patch(const std::string &path);
|
|
|
@@ -1720,16 +1736,16 @@ public:
|
|
|
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, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr);
|
|
|
Result Patch(const std::string &path, const Params ¶ms);
|
|
|
- Result Patch(const std::string &path, const MultipartFormDataItemsForClientInput &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, 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, size_t content_length, ContentProvider 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, const Params ¶ms);
|
|
|
- Result Patch(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, UploadProgress progress = nullptr);
|
|
|
- Result Patch(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const std::string &boundary, UploadProgress progress = nullptr);
|
|
|
- Result Patch(const std::string &path, const Headers &headers, const MultipartFormDataItemsForClientInput &items, const MultipartFormDataProviderItems &provider_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 FormDataProviderItems &provider_items, UploadProgress progress = nullptr);
|
|
|
Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr);
|
|
|
|
|
|
Result Delete(const std::string &path, DownloadProgress progress = nullptr);
|
|
|
@@ -5327,9 +5343,9 @@ inline bool parse_accept_header(const std::string &s,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-class MultipartFormDataParser {
|
|
|
+class FormDataParser {
|
|
|
public:
|
|
|
- MultipartFormDataParser() = default;
|
|
|
+ FormDataParser() = default;
|
|
|
|
|
|
void set_boundary(std::string &&boundary) {
|
|
|
boundary_ = boundary;
|
|
|
@@ -5339,8 +5355,8 @@ public:
|
|
|
|
|
|
bool is_valid() const { return is_valid_; }
|
|
|
|
|
|
- bool parse(const char *buf, size_t n, const ContentReceiver &content_callback,
|
|
|
- const MultipartContentHeader &header_callback) {
|
|
|
+ bool parse(const char *buf, size_t n, const FormDataHeader &header_callback,
|
|
|
+ const ContentReceiver &content_callback) {
|
|
|
|
|
|
buf_append(buf, n);
|
|
|
|
|
|
@@ -5381,7 +5397,7 @@ public:
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- // parse and emplace space trimmed headers into a map
|
|
|
+ // Parse and emplace space trimmed headers into a map
|
|
|
if (!parse_header(
|
|
|
header.data(), header.data() + header.size(),
|
|
|
[&](const std::string &key, const std::string &val) {
|
|
|
@@ -5512,7 +5528,7 @@ private:
|
|
|
|
|
|
size_t state_ = 0;
|
|
|
bool is_valid_ = false;
|
|
|
- MultipartFormData file_;
|
|
|
+ FormData file_;
|
|
|
|
|
|
// Buffer
|
|
|
bool start_with(const std::string &a, size_t spos, size_t epos,
|
|
|
@@ -5650,7 +5666,7 @@ serialize_multipart_formdata_get_content_type(const std::string &boundary) {
|
|
|
}
|
|
|
|
|
|
inline std::string
|
|
|
-serialize_multipart_formdata(const MultipartFormDataItemsForClientInput &items,
|
|
|
+serialize_multipart_formdata(const UploadFormDataItems &items,
|
|
|
const std::string &boundary, bool finish = true) {
|
|
|
std::string body;
|
|
|
|
|
|
@@ -6422,19 +6438,47 @@ inline bool Request::is_multipart_form_data() const {
|
|
|
return !content_type.rfind("multipart/form-data", 0);
|
|
|
}
|
|
|
|
|
|
-inline bool Request::has_file(const std::string &key) const {
|
|
|
- return files.find(key) != files.end();
|
|
|
+// Multipart FormData implementation
|
|
|
+inline std::string MultipartFormData::get_field(const std::string &key,
|
|
|
+ size_t id) const {
|
|
|
+ auto rng = fields.equal_range(key);
|
|
|
+ auto it = rng.first;
|
|
|
+ std::advance(it, static_cast<ssize_t>(id));
|
|
|
+ if (it != rng.second) { return it->second.content; }
|
|
|
+ return std::string();
|
|
|
}
|
|
|
|
|
|
-inline MultipartFormData Request::get_file_value(const std::string &key) const {
|
|
|
- auto it = files.find(key);
|
|
|
- if (it != files.end()) { return it->second; }
|
|
|
- return MultipartFormData();
|
|
|
+inline std::vector<std::string>
|
|
|
+MultipartFormData::get_fields(const std::string &key) const {
|
|
|
+ std::vector<std::string> values;
|
|
|
+ auto rng = fields.equal_range(key);
|
|
|
+ for (auto it = rng.first; it != rng.second; it++) {
|
|
|
+ values.push_back(it->second.content);
|
|
|
+ }
|
|
|
+ return values;
|
|
|
+}
|
|
|
+
|
|
|
+inline bool MultipartFormData::has_field(const std::string &key) const {
|
|
|
+ return fields.find(key) != fields.end();
|
|
|
}
|
|
|
|
|
|
-inline std::vector<MultipartFormData>
|
|
|
-Request::get_file_values(const std::string &key) const {
|
|
|
- std::vector<MultipartFormData> values;
|
|
|
+inline size_t MultipartFormData::get_field_count(const std::string &key) const {
|
|
|
+ auto r = fields.equal_range(key);
|
|
|
+ return static_cast<size_t>(std::distance(r.first, r.second));
|
|
|
+}
|
|
|
+
|
|
|
+inline FormData MultipartFormData::get_file(const std::string &key,
|
|
|
+ size_t id) const {
|
|
|
+ auto rng = files.equal_range(key);
|
|
|
+ auto it = rng.first;
|
|
|
+ std::advance(it, static_cast<ssize_t>(id));
|
|
|
+ if (it != rng.second) { return it->second; }
|
|
|
+ return FormData();
|
|
|
+}
|
|
|
+
|
|
|
+inline std::vector<FormData>
|
|
|
+MultipartFormData::get_files(const std::string &key) const {
|
|
|
+ std::vector<FormData> values;
|
|
|
auto rng = files.equal_range(key);
|
|
|
for (auto it = rng.first; it != rng.second; it++) {
|
|
|
values.push_back(it->second);
|
|
|
@@ -6442,6 +6486,15 @@ Request::get_file_values(const std::string &key) const {
|
|
|
return values;
|
|
|
}
|
|
|
|
|
|
+inline bool MultipartFormData::has_file(const std::string &key) const {
|
|
|
+ return files.find(key) != files.end();
|
|
|
+}
|
|
|
+
|
|
|
+inline size_t MultipartFormData::get_file_count(const std::string &key) const {
|
|
|
+ auto r = files.equal_range(key);
|
|
|
+ return static_cast<size_t>(std::distance(r.first, r.second));
|
|
|
+}
|
|
|
+
|
|
|
// Response implementation
|
|
|
inline bool Response::has_header(const std::string &key) const {
|
|
|
return headers.find(key) != headers.end();
|
|
|
@@ -7300,8 +7353,10 @@ Server::write_content_with_provider(Stream &strm, const Request &req,
|
|
|
}
|
|
|
|
|
|
inline bool Server::read_content(Stream &strm, Request &req, Response &res) {
|
|
|
- MultipartFormDataMap::iterator cur;
|
|
|
- auto file_count = 0;
|
|
|
+ FormFields::iterator cur_field;
|
|
|
+ FormFiles::iterator cur_file;
|
|
|
+ auto is_text_field = false;
|
|
|
+ size_t count = 0;
|
|
|
if (read_content_core(
|
|
|
strm, req, res,
|
|
|
// Regular
|
|
|
@@ -7310,18 +7365,32 @@ inline bool Server::read_content(Stream &strm, Request &req, Response &res) {
|
|
|
req.body.append(buf, n);
|
|
|
return true;
|
|
|
},
|
|
|
- // Multipart
|
|
|
- [&](const MultipartFormData &file) {
|
|
|
- if (file_count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) {
|
|
|
+ // Multipart FormData
|
|
|
+ [&](const FormData &file) {
|
|
|
+ if (count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) {
|
|
|
return false;
|
|
|
}
|
|
|
- cur = req.files.emplace(file.name, file);
|
|
|
+
|
|
|
+ if (file.filename.empty()) {
|
|
|
+ cur_field = req.form.fields.emplace(
|
|
|
+ file.name, FormField{file.name, file.content, file.headers});
|
|
|
+ is_text_field = true;
|
|
|
+ } else {
|
|
|
+ cur_file = req.form.files.emplace(file.name, file);
|
|
|
+ is_text_field = false;
|
|
|
+ }
|
|
|
return true;
|
|
|
},
|
|
|
[&](const char *buf, size_t n) {
|
|
|
- auto &content = cur->second.content;
|
|
|
- if (content.size() + n > content.max_size()) { return false; }
|
|
|
- content.append(buf, n);
|
|
|
+ if (is_text_field) {
|
|
|
+ auto &content = cur_field->second.content;
|
|
|
+ if (content.size() + n > content.max_size()) { return false; }
|
|
|
+ content.append(buf, n);
|
|
|
+ } else {
|
|
|
+ auto &content = cur_file->second.content;
|
|
|
+ if (content.size() + n > content.max_size()) { return false; }
|
|
|
+ content.append(buf, n);
|
|
|
+ }
|
|
|
return true;
|
|
|
})) {
|
|
|
const auto &content_type = req.get_header_value("Content-Type");
|
|
|
@@ -7339,19 +7408,16 @@ inline bool Server::read_content(Stream &strm, Request &req, Response &res) {
|
|
|
|
|
|
inline bool Server::read_content_with_content_receiver(
|
|
|
Stream &strm, Request &req, Response &res, ContentReceiver receiver,
|
|
|
- MultipartContentHeader multipart_header,
|
|
|
- ContentReceiver multipart_receiver) {
|
|
|
+ FormDataHeader multipart_header, ContentReceiver multipart_receiver) {
|
|
|
return read_content_core(strm, req, res, std::move(receiver),
|
|
|
std::move(multipart_header),
|
|
|
std::move(multipart_receiver));
|
|
|
}
|
|
|
|
|
|
-inline bool
|
|
|
-Server::read_content_core(Stream &strm, Request &req, Response &res,
|
|
|
- ContentReceiver receiver,
|
|
|
- MultipartContentHeader multipart_header,
|
|
|
- ContentReceiver multipart_receiver) const {
|
|
|
- detail::MultipartFormDataParser multipart_form_data_parser;
|
|
|
+inline bool Server::read_content_core(
|
|
|
+ Stream &strm, Request &req, Response &res, ContentReceiver receiver,
|
|
|
+ FormDataHeader multipart_header, ContentReceiver multipart_receiver) const {
|
|
|
+ detail::FormDataParser multipart_form_data_parser;
|
|
|
ContentReceiverWithProgress out;
|
|
|
|
|
|
if (req.is_multipart_form_data()) {
|
|
|
@@ -7364,19 +7430,8 @@ Server::read_content_core(Stream &strm, Request &req, Response &res,
|
|
|
|
|
|
multipart_form_data_parser.set_boundary(std::move(boundary));
|
|
|
out = [&](const char *buf, size_t n, uint64_t /*off*/, uint64_t /*len*/) {
|
|
|
- /* For debug
|
|
|
- size_t pos = 0;
|
|
|
- while (pos < n) {
|
|
|
- auto read_size = (std::min)<size_t>(1, n - pos);
|
|
|
- auto ret = multipart_form_data_parser.parse(
|
|
|
- buf + pos, read_size, multipart_receiver, multipart_header);
|
|
|
- if (!ret) { return false; }
|
|
|
- pos += read_size;
|
|
|
- }
|
|
|
- return true;
|
|
|
- */
|
|
|
- return multipart_form_data_parser.parse(buf, n, multipart_receiver,
|
|
|
- multipart_header);
|
|
|
+ return multipart_form_data_parser.parse(buf, n, multipart_header,
|
|
|
+ multipart_receiver);
|
|
|
};
|
|
|
} else {
|
|
|
out = [receiver](const char *buf, size_t n, uint64_t /*off*/,
|
|
|
@@ -7582,7 +7637,7 @@ inline bool Server::routing(Request &req, Response &res, Stream &strm) {
|
|
|
return read_content_with_content_receiver(
|
|
|
strm, req, res, std::move(receiver), nullptr, nullptr);
|
|
|
},
|
|
|
- [&](MultipartContentHeader header, ContentReceiver receiver) {
|
|
|
+ [&](FormDataHeader header, ContentReceiver receiver) {
|
|
|
return read_content_with_content_receiver(strm, req, res, nullptr,
|
|
|
std::move(header),
|
|
|
std::move(receiver));
|
|
|
@@ -7731,7 +7786,7 @@ inline void Server::apply_ranges(const Request &req, Response &res,
|
|
|
|
|
|
if (type != detail::EncodingType::None) {
|
|
|
if (pre_compression_logger_) { pre_compression_logger_(req, res); }
|
|
|
-
|
|
|
+
|
|
|
std::unique_ptr<detail::compressor> compressor;
|
|
|
std::string content_encoding;
|
|
|
|
|
|
@@ -8949,9 +9004,8 @@ inline bool ClientImpl::process_request(Stream &strm, Request &req,
|
|
|
}
|
|
|
|
|
|
inline ContentProviderWithoutLength ClientImpl::get_multipart_content_provider(
|
|
|
- const std::string &boundary,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items) const {
|
|
|
+ const std::string &boundary, const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items) const {
|
|
|
size_t cur_item = 0;
|
|
|
size_t cur_start = 0;
|
|
|
// cur_item and cur_start are copied to within the std::function and maintain
|
|
|
@@ -9164,17 +9218,15 @@ inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
return Post(path, headers, query, "application/x-www-form-urlencoded");
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Post(const std::string &path,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Post(const std::string &path,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ UploadProgress progress) {
|
|
|
return Post(path, Headers(), items, progress);
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ UploadProgress progress) {
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
detail::serialize_multipart_formdata_get_content_type(boundary);
|
|
|
@@ -9182,10 +9234,10 @@ ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
return Post(path, headers, body, content_type, progress);
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const std::string &boundary, UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const std::string &boundary,
|
|
|
+ UploadProgress progress) {
|
|
|
if (!detail::is_multipart_boundary_chars_valid(boundary)) {
|
|
|
return Result{nullptr, Error::UnsupportedMultipartBoundaryChars};
|
|
|
}
|
|
|
@@ -9232,11 +9284,10 @@ inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
progress);
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items,
|
|
|
+ UploadProgress progress) {
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
detail::serialize_multipart_formdata_get_content_type(boundary);
|
|
|
@@ -9320,13 +9371,13 @@ inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
}
|
|
|
|
|
|
inline Result ClientImpl::Put(const std::string &path,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
return Put(path, Headers(), items, progress);
|
|
|
}
|
|
|
|
|
|
inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
@@ -9336,7 +9387,7 @@ inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
}
|
|
|
|
|
|
inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
const std::string &boundary,
|
|
|
UploadProgress progress) {
|
|
|
if (!detail::is_multipart_boundary_chars_valid(boundary)) {
|
|
|
@@ -9385,11 +9436,10 @@ inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
progress);
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Put(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items,
|
|
|
+ UploadProgress progress) {
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
detail::serialize_multipart_formdata_get_content_type(boundary);
|
|
|
@@ -9474,17 +9524,15 @@ inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
return Patch(path, headers, query, "application/x-www-form-urlencoded");
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Patch(const std::string &path,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Patch(const std::string &path,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ UploadProgress progress) {
|
|
|
return Patch(path, Headers(), items, progress);
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ UploadProgress progress) {
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
detail::serialize_multipart_formdata_get_content_type(boundary);
|
|
|
@@ -9492,10 +9540,10 @@ ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
return Patch(path, headers, body, content_type, progress);
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const std::string &boundary, UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const std::string &boundary,
|
|
|
+ UploadProgress progress) {
|
|
|
if (!detail::is_multipart_boundary_chars_valid(boundary)) {
|
|
|
return Result{nullptr, Error::UnsupportedMultipartBoundaryChars};
|
|
|
}
|
|
|
@@ -9543,11 +9591,10 @@ inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
progress);
|
|
|
}
|
|
|
|
|
|
-inline Result
|
|
|
-ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result ClientImpl::Patch(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items,
|
|
|
+ UploadProgress progress) {
|
|
|
const auto &boundary = detail::make_multipart_data_boundary();
|
|
|
const auto &content_type =
|
|
|
detail::serialize_multipart_formdata_get_content_type(boundary);
|
|
|
@@ -10880,24 +10927,24 @@ inline Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
return cli_->Post(path, headers, params);
|
|
|
}
|
|
|
inline Result Client::Post(const std::string &path,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Post(path, items, progress);
|
|
|
}
|
|
|
inline Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Post(path, headers, items, progress);
|
|
|
}
|
|
|
inline Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
const std::string &boundary,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Post(path, headers, items, boundary, progress);
|
|
|
}
|
|
|
inline Result Client::Post(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Post(path, headers, items, provider_items, progress);
|
|
|
}
|
|
|
@@ -10973,24 +11020,24 @@ inline Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
return cli_->Put(path, headers, params);
|
|
|
}
|
|
|
inline Result Client::Put(const std::string &path,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Put(path, items, progress);
|
|
|
}
|
|
|
inline Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Put(path, headers, items, progress);
|
|
|
}
|
|
|
inline Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
const std::string &boundary,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Put(path, headers, items, boundary, progress);
|
|
|
}
|
|
|
inline Result Client::Put(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Put(path, headers, items, provider_items, progress);
|
|
|
}
|
|
|
@@ -11069,26 +11116,25 @@ inline Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
return cli_->Patch(path, headers, params);
|
|
|
}
|
|
|
inline Result Client::Patch(const std::string &path,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Patch(path, items, progress);
|
|
|
}
|
|
|
inline Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Patch(path, headers, items, progress);
|
|
|
}
|
|
|
inline Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
const std::string &boundary,
|
|
|
UploadProgress progress) {
|
|
|
return cli_->Patch(path, headers, items, boundary, progress);
|
|
|
}
|
|
|
-inline Result
|
|
|
-Client::Patch(const std::string &path, const Headers &headers,
|
|
|
- const MultipartFormDataItemsForClientInput &items,
|
|
|
- const MultipartFormDataProviderItems &provider_items,
|
|
|
- UploadProgress progress) {
|
|
|
+inline Result Client::Patch(const std::string &path, const Headers &headers,
|
|
|
+ const UploadFormDataItems &items,
|
|
|
+ const FormDataProviderItems &provider_items,
|
|
|
+ UploadProgress progress) {
|
|
|
return cli_->Patch(path, headers, items, provider_items, progress);
|
|
|
}
|
|
|
inline Result Client::Patch(const std::string &path, const Headers &headers,
|