@@ -224,20 +224,17 @@ using ContentReceiver =
224
224
std::function<bool (const char *data, size_t data_length)>;
225
225
226
226
using MultipartContentHeader =
227
- std::function<bool (const std::string &name, const MultipartFormData &file)>;
228
-
229
- using MultipartContentReceiver =
230
- std::function<bool (const std::string& name, const char *data, size_t data_length)>;
227
+ std::function<bool (const MultipartFormData &file)>;
231
228
232
229
class ContentReader {
233
230
public:
234
231
using Reader = std::function<bool (ContentReceiver receiver)>;
235
- using MultipartReader = std::function<bool (MultipartContentHeader header, MultipartContentReceiver receiver)>;
232
+ using MultipartReader = std::function<bool (MultipartContentHeader header, ContentReceiver receiver)>;
236
233
237
234
ContentReader (Reader reader, MultipartReader muitlpart_reader)
238
235
: reader_(reader), muitlpart_reader_(muitlpart_reader) {}
239
236
240
- bool operator ()(MultipartContentHeader header, MultipartContentReceiver receiver) const {
237
+ bool operator ()(MultipartContentHeader header, ContentReceiver receiver) const {
241
238
return muitlpart_reader_ (header, receiver);
242
239
}
243
240
@@ -590,12 +587,12 @@ class Server {
590
587
Request &req, Response &res,
591
588
ContentReceiver receiver,
592
589
MultipartContentHeader multipart_header,
593
- MultipartContentReceiver multipart_receiver);
590
+ ContentReceiver multipart_receiver);
594
591
bool read_content_core (Stream &strm, bool last_connection,
595
592
Request &req, Response &res,
596
593
ContentReceiver receiver,
597
594
MultipartContentHeader mulitpart_header,
598
- MultipartContentReceiver multipart_receiver);
595
+ ContentReceiver multipart_receiver);
599
596
600
597
virtual bool process_and_close_socket (socket_t sock);
601
598
@@ -2011,7 +2008,7 @@ class MultipartFormDataParser {
2011
2008
while (pos != std::string::npos) {
2012
2009
// Empty line
2013
2010
if (pos == 0 ) {
2014
- if (!header_callback (name_, file_)) {
2011
+ if (!header_callback (file_)) {
2015
2012
is_valid_ = false ;
2016
2013
is_done_ = false ;
2017
2014
return false ;
@@ -2028,8 +2025,7 @@ class MultipartFormDataParser {
2028
2025
if (std::regex_match (header, m, re_content_type)) {
2029
2026
file_.content_type = m[1 ];
2030
2027
} else if (std::regex_match (header, m, re_content_disposition)) {
2031
- name_ = m[1 ];
2032
- file_.name = name_;
2028
+ file_.name = m[1 ];
2033
2029
file_.filename = m[2 ];
2034
2030
}
2035
2031
}
@@ -2047,7 +2043,7 @@ class MultipartFormDataParser {
2047
2043
if (pos == std::string::npos) {
2048
2044
pos = buf_.size ();
2049
2045
}
2050
- if (!content_callback (name_, buf_.data (), pos)) {
2046
+ if (!content_callback (buf_.data (), pos)) {
2051
2047
is_valid_ = false ;
2052
2048
is_done_ = false ;
2053
2049
return false ;
@@ -2063,7 +2059,7 @@ class MultipartFormDataParser {
2063
2059
2064
2060
auto pos = buf_.find (pattern);
2065
2061
if (pos != std::string::npos) {
2066
- if (!content_callback (name_, buf_.data (), pos)) {
2062
+ if (!content_callback (buf_.data (), pos)) {
2067
2063
is_valid_ = false ;
2068
2064
is_done_ = false ;
2069
2065
return false ;
@@ -2073,7 +2069,7 @@ class MultipartFormDataParser {
2073
2069
buf_.erase (0 , pos + pattern.size ());
2074
2070
state_ = 4 ;
2075
2071
} else {
2076
- if (!content_callback (name_, buf_.data (), pattern.size ())) {
2072
+ if (!content_callback (buf_.data (), pattern.size ())) {
2077
2073
is_valid_ = false ;
2078
2074
is_done_ = false ;
2079
2075
return false ;
@@ -2118,7 +2114,7 @@ class MultipartFormDataParser {
2118
2114
2119
2115
private:
2120
2116
void clear_file_info () {
2121
- name_ .clear ();
2117
+ file_. name .clear ();
2122
2118
file_.filename .clear ();
2123
2119
file_.content_type .clear ();
2124
2120
}
@@ -2132,7 +2128,6 @@ class MultipartFormDataParser {
2132
2128
size_t is_valid_ = false ;
2133
2129
size_t is_done_ = false ;
2134
2130
size_t off_ = 0 ;
2135
- std::string name_;
2136
2131
MultipartFormData file_;
2137
2132
};
2138
2133
@@ -2973,6 +2968,7 @@ Server::write_content_with_provider(Stream &strm, const Request &req,
2973
2968
2974
2969
inline bool Server::read_content (Stream &strm, bool last_connection,
2975
2970
Request &req, Response &res) {
2971
+ MultipartFormDataMap::iterator cur;
2976
2972
auto ret = read_content_core (strm, last_connection, req, res,
2977
2973
// Regular
2978
2974
[&](const char *buf, size_t n) {
@@ -2981,14 +2977,12 @@ inline bool Server::read_content(Stream &strm, bool last_connection,
2981
2977
return true ;
2982
2978
},
2983
2979
// Multipart
2984
- [&](const std::string &name, const MultipartFormData &file) {
2985
- req.files .emplace (name, file);
2980
+ [&](const MultipartFormData &file) {
2981
+ cur = req.files .emplace (file. name , file);
2986
2982
return true ;
2987
2983
},
2988
- [&](const std::string &name, const char *buf, size_t n) {
2989
- // TODO: handle elements with a same key
2990
- auto it = req.files .find (name);
2991
- auto &content = it->second .content ;
2984
+ [&](const char *buf, size_t n) {
2985
+ auto &content = cur->second .content ;
2992
2986
if (content.size () + n > content.max_size ()) { return false ; }
2993
2987
content.append (buf, n);
2994
2988
return true ;
@@ -3008,7 +3002,7 @@ Server::read_content_with_content_receiver(Stream &strm, bool last_connection,
3008
3002
Request &req, Response &res,
3009
3003
ContentReceiver receiver,
3010
3004
MultipartContentHeader multipart_header,
3011
- MultipartContentReceiver multipart_receiver) {
3005
+ ContentReceiver multipart_receiver) {
3012
3006
return read_content_core (strm, last_connection, req, res,
3013
3007
receiver, multipart_header, multipart_receiver);
3014
3008
}
@@ -3018,7 +3012,7 @@ Server::read_content_core(Stream &strm, bool last_connection,
3018
3012
Request &req, Response &res,
3019
3013
ContentReceiver receiver,
3020
3014
MultipartContentHeader mulitpart_header,
3021
- MultipartContentReceiver multipart_receiver) {
3015
+ ContentReceiver multipart_receiver) {
3022
3016
detail::MultipartFormDataParser multipart_form_data_parser;
3023
3017
ContentReceiver out;
3024
3018
@@ -3181,7 +3175,7 @@ inline bool Server::routing(Request &req, Response &res, Stream &strm,
3181
3175
return read_content_with_content_receiver (strm, last_connection, req, res,
3182
3176
receiver, nullptr , nullptr );
3183
3177
},
3184
- [&](MultipartContentHeader header, MultipartContentReceiver receiver) {
3178
+ [&](MultipartContentHeader header, ContentReceiver receiver) {
3185
3179
return read_content_with_content_receiver (strm, last_connection, req, res,
3186
3180
nullptr , header, receiver);
3187
3181
}
0 commit comments