Skip to content

Commit 033bc35

Browse files
committed
Improve multipart content reader interface
1 parent d910bfc commit 033bc35

File tree

3 files changed

+31
-29
lines changed

3 files changed

+31
-29
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,14 @@ svr.Post("/content_receiver",
121121
if (req.is_multipart_form_data()) {
122122
MultipartFiles files;
123123
content_reader(
124+
[&](const std::string &name, const MultipartFile &file) {
125+
files.emplace(name, file);
126+
return true;
127+
},
124128
[&](const std::string &name, const char *data, size_t data_length) {
125129
auto &file = files.find(name)->second;
126130
file.content.append(data, data_length);
127131
return true;
128-
},
129-
[&](const std::string &name, const MultipartFile &file) {
130-
files.emplace(name, file);
131-
return true;
132132
});
133133
} else {
134134
std::string body;

httplib.h

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -225,22 +225,22 @@ using MultipartFormDataItems = std::vector<MultipartFormData>;
225225
using ContentReceiver =
226226
std::function<bool(const char *data, size_t data_length)>;
227227

228-
using MultipartContentReceiver =
229-
std::function<bool(const std::string& name, const char *data, size_t data_length)>;
230-
231228
using MultipartContentHeader =
232229
std::function<bool(const std::string &name, const MultipartFile &file)>;
233230

231+
using MultipartContentReceiver =
232+
std::function<bool(const std::string& name, const char *data, size_t data_length)>;
233+
234234
class ContentReader {
235235
public:
236236
using Reader = std::function<bool(ContentReceiver receiver)>;
237-
using MultipartReader = std::function<bool(MultipartContentReceiver receiver, MultipartContentHeader header)>;
237+
using MultipartReader = std::function<bool(MultipartContentHeader header, MultipartContentReceiver receiver)>;
238238

239239
ContentReader(Reader reader, MultipartReader muitlpart_reader)
240240
: reader_(reader), muitlpart_reader_(muitlpart_reader) {}
241241

242-
bool operator()(MultipartContentReceiver receiver, MultipartContentHeader header) const {
243-
return muitlpart_reader_(receiver, header);
242+
bool operator()(MultipartContentHeader header, MultipartContentReceiver receiver) const {
243+
return muitlpart_reader_(header, receiver);
244244
}
245245

246246
bool operator()(ContentReceiver receiver) const {
@@ -591,13 +591,13 @@ class Server {
591591
bool read_content_with_content_receiver(Stream &strm, bool last_connection,
592592
Request &req, Response &res,
593593
ContentReceiver receiver,
594-
MultipartContentReceiver multipart_receiver,
595-
MultipartContentHeader multipart_header);
594+
MultipartContentHeader multipart_header,
595+
MultipartContentReceiver multipart_receiver);
596596
bool read_content_core(Stream &strm, bool last_connection,
597597
Request &req, Response &res,
598598
ContentReceiver receiver,
599-
MultipartContentReceiver multipart_receiver,
600-
MultipartContentHeader mulitpart_header);
599+
MultipartContentHeader mulitpart_header,
600+
MultipartContentReceiver multipart_receiver);
601601

602602
virtual bool process_and_close_socket(socket_t sock);
603603

@@ -2796,22 +2796,24 @@ Server::write_content_with_provider(Stream &strm, const Request &req,
27962796
inline bool Server::read_content(Stream &strm, bool last_connection,
27972797
Request &req, Response &res) {
27982798
auto ret = read_content_core(strm, last_connection, req, res,
2799+
// Regular
27992800
[&](const char *buf, size_t n) {
28002801
if (req.body.size() + n > req.body.max_size()) { return false; }
28012802
req.body.append(buf, n);
28022803
return true;
28032804
},
2805+
// Multipart
2806+
[&](const std::string &name, const MultipartFile &file) {
2807+
req.files.emplace(name, file);
2808+
return true;
2809+
},
28042810
[&](const std::string &name, const char *buf, size_t n) {
28052811
// TODO: handle elements with a same key
28062812
auto it = req.files.find(name);
28072813
auto &content = it->second.content;
28082814
if (content.size() + n > content.max_size()) { return false; }
28092815
content.append(buf, n);
28102816
return true;
2811-
},
2812-
[&](const std::string &name, const MultipartFile &file) {
2813-
req.files.emplace(name, file);
2814-
return true;
28152817
}
28162818
);
28172819

@@ -2827,18 +2829,18 @@ inline bool
28272829
Server::read_content_with_content_receiver(Stream &strm, bool last_connection,
28282830
Request &req, Response &res,
28292831
ContentReceiver receiver,
2830-
MultipartContentReceiver multipart_receiver,
2831-
MultipartContentHeader multipart_header) {
2832+
MultipartContentHeader multipart_header,
2833+
MultipartContentReceiver multipart_receiver) {
28322834
return read_content_core(strm, last_connection, req, res,
2833-
receiver, multipart_receiver, multipart_header);
2835+
receiver, multipart_header, multipart_receiver);
28342836
}
28352837

28362838
inline bool
28372839
Server::read_content_core(Stream &strm, bool last_connection,
28382840
Request &req, Response &res,
28392841
ContentReceiver receiver,
2840-
MultipartContentReceiver multipart_receiver,
2841-
MultipartContentHeader mulitpart_header) {
2842+
MultipartContentHeader mulitpart_header,
2843+
MultipartContentReceiver multipart_receiver) {
28422844
detail::MultipartFormDataParser multipart_form_data_parser;
28432845
ContentReceiver out;
28442846

@@ -3001,9 +3003,9 @@ inline bool Server::routing(Request &req, Response &res, Stream &strm,
30013003
return read_content_with_content_receiver(strm, last_connection, req, res,
30023004
receiver, nullptr, nullptr);
30033005
},
3004-
[&](MultipartContentReceiver receiver, MultipartContentHeader header) {
3006+
[&](MultipartContentHeader header, MultipartContentReceiver receiver) {
30053007
return read_content_with_content_receiver(strm, last_connection, req, res,
3006-
nullptr, receiver, header);
3008+
nullptr, header, receiver);
30073009
}
30083010
);
30093011

test/test.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -761,14 +761,14 @@ class ServerTest : public ::testing::Test {
761761
if (req.is_multipart_form_data()) {
762762
MultipartFiles files;
763763
content_reader(
764+
[&](const std::string &name, const MultipartFile &file) {
765+
files.emplace(name, file);
766+
return true;
767+
},
764768
[&](const std::string &name, const char *data, size_t data_length) {
765769
auto &file = files.find(name)->second;
766770
file.content.append(data, data_length);
767771
return true;
768-
},
769-
[&](const std::string &name, const MultipartFile &file) {
770-
files.emplace(name, file);
771-
return true;
772772
});
773773

774774
EXPECT_EQ(5u, files.size());

0 commit comments

Comments
 (0)