@@ -156,6 +156,7 @@ using socket_t = int;
156156#include < openssl/x509v3.h>
157157
158158#include < iomanip>
159+ #include < iostream>
159160#include < sstream>
160161
161162// #if OPENSSL_VERSION_NUMBER < 0x1010100fL
@@ -511,7 +512,7 @@ class Server {
511512 int bind_internal (const char *host, int port, int socket_flags);
512513 bool listen_internal ();
513514
514- bool routing (Request &req, Response &res, Stream &strm, bool last_connection );
515+ bool routing (Request &req, Response &res, Stream &strm);
515516 bool handle_file_request (Request &req, Response &res, bool head = false );
516517 bool dispatch_request (Request &req, Response &res, Handlers &handlers);
517518 bool dispatch_request_for_content_reader (Request &req, Response &res,
@@ -524,14 +525,14 @@ class Server {
524525 bool write_content_with_provider (Stream &strm, const Request &req,
525526 Response &res, const std::string &boundary,
526527 const std::string &content_type);
527- bool read_content (Stream &strm, bool last_connection, Request &req,
528- Response &res);
529- bool read_content_with_content_receiver (
530- Stream &strm, bool last_connection, Request &req, Response &res ,
531- ContentReceiver receiver, MultipartContentHeader multipart_header,
532- ContentReceiver multipart_receiver);
533- bool read_content_core (Stream &strm, bool last_connection, Request &req ,
534- Response &res, ContentReceiver receiver,
528+ bool read_content (Stream &strm, Request &req, Response &res);
529+ bool
530+ read_content_with_content_receiver (Stream &strm, Request &req, Response &res,
531+ ContentReceiver receiver ,
532+ MultipartContentHeader multipart_header,
533+ ContentReceiver multipart_receiver);
534+ bool read_content_core (Stream &strm, Request &req, Response &res ,
535+ ContentReceiver receiver,
535536 MultipartContentHeader mulitpart_header,
536537 ContentReceiver multipart_receiver);
537538
@@ -859,8 +860,8 @@ class SSLServer : public Server {
859860class SSLClient : public Client {
860861public:
861862 explicit SSLClient (const std::string &host, int port = 443 ,
862- const std::string &client_cert_path = std::string(),
863- const std::string &client_key_path = std::string());
863+ const std::string &client_cert_path = std::string(),
864+ const std::string &client_key_path = std::string());
864865
865866 ~SSLClient () override ;
866867
@@ -2779,8 +2780,7 @@ inline void Response::set_content(const char *s, size_t n,
27792780 set_header (" Content-Type" , content_type);
27802781}
27812782
2782- inline void Response::set_content (std::string s,
2783- const char *content_type) {
2783+ inline void Response::set_content (std::string s, const char *content_type) {
27842784 body = std::move (s);
27852785 set_header (" Content-Type" , content_type);
27862786}
@@ -3244,47 +3244,45 @@ Server::write_content_with_provider(Stream &strm, const Request &req,
32443244 return true ;
32453245}
32463246
3247- inline bool Server::read_content (Stream &strm, bool last_connection,
3248- Request &req, Response &res) {
3247+ inline bool Server::read_content (Stream &strm, Request &req, Response &res) {
32493248 MultipartFormDataMap::iterator cur;
3250- auto ret = read_content_core (
3251- strm, last_connection, req, res,
3252- // Regular
3253- [&](const char *buf, size_t n) {
3254- if (req.body .size () + n > req.body .max_size ()) { return false ; }
3255- req.body .append (buf, n);
3256- return true ;
3257- },
3258- // Multipart
3259- [&](const MultipartFormData &file) {
3260- cur = req.files .emplace (file.name , file);
3261- return true ;
3262- },
3263- [&](const char *buf, size_t n) {
3264- auto &content = cur->second .content ;
3265- if (content.size () + n > content.max_size ()) { return false ; }
3266- content.append (buf, n);
3267- return true ;
3268- });
3269-
3270- const auto &content_type = req.get_header_value (" Content-Type" );
3271- if (!content_type.find (" application/x-www-form-urlencoded" )) {
3272- detail::parse_query_text (req.body , req.params );
3249+ if (read_content_core (
3250+ strm, req, res,
3251+ // Regular
3252+ [&](const char *buf, size_t n) {
3253+ if (req.body .size () + n > req.body .max_size ()) { return false ; }
3254+ req.body .append (buf, n);
3255+ return true ;
3256+ },
3257+ // Multipart
3258+ [&](const MultipartFormData &file) {
3259+ cur = req.files .emplace (file.name , file);
3260+ return true ;
3261+ },
3262+ [&](const char *buf, size_t n) {
3263+ auto &content = cur->second .content ;
3264+ if (content.size () + n > content.max_size ()) { return false ; }
3265+ content.append (buf, n);
3266+ return true ;
3267+ })) {
3268+ const auto &content_type = req.get_header_value (" Content-Type" );
3269+ if (!content_type.find (" application/x-www-form-urlencoded" )) {
3270+ detail::parse_query_text (req.body , req.params );
3271+ }
3272+ return true ;
32733273 }
3274-
3275- return ret;
3274+ return false ;
32763275}
32773276
32783277inline bool Server::read_content_with_content_receiver (
3279- Stream &strm, bool last_connection, Request &req, Response &res,
3280- ContentReceiver receiver, MultipartContentHeader multipart_header,
3278+ Stream &strm, Request &req, Response &res, ContentReceiver receiver ,
3279+ MultipartContentHeader multipart_header,
32813280 ContentReceiver multipart_receiver) {
3282- return read_content_core (strm, last_connection, req, res, receiver,
3283- multipart_header, multipart_receiver);
3281+ return read_content_core (strm, req, res, receiver, multipart_header ,
3282+ multipart_receiver);
32843283}
32853284
3286- inline bool Server::read_content_core (Stream &strm, bool last_connection,
3287- Request &req, Response &res,
3285+ inline bool Server::read_content_core (Stream &strm, Request &req, Response &res,
32883286 ContentReceiver receiver,
32893287 MultipartContentHeader mulitpart_header,
32903288 ContentReceiver multipart_receiver) {
@@ -3296,7 +3294,7 @@ inline bool Server::read_content_core(Stream &strm, bool last_connection,
32963294 std::string boundary;
32973295 if (!detail::parse_multipart_boundary (content_type, boundary)) {
32983296 res.status = 400 ;
3299- return write_response (strm, last_connection, req, res) ;
3297+ return false ;
33003298 }
33013299
33023300 multipart_form_data_parser.set_boundary (std::move (boundary));
@@ -3310,13 +3308,13 @@ inline bool Server::read_content_core(Stream &strm, bool last_connection,
33103308
33113309 if (!detail::read_content (strm, req, payload_max_length_, res.status ,
33123310 Progress (), out)) {
3313- return write_response (strm, last_connection, req, res) ;
3311+ return false ;
33143312 }
33153313
33163314 if (req.is_multipart_form_data ()) {
33173315 if (!multipart_form_data_parser.is_valid ()) {
33183316 res.status = 400 ;
3319- return write_response (strm, last_connection, req, res) ;
3317+ return false ;
33203318 }
33213319 }
33223320
@@ -3446,8 +3444,7 @@ inline bool Server::listen_internal() {
34463444 return ret;
34473445}
34483446
3449- inline bool Server::routing (Request &req, Response &res, Stream &strm,
3450- bool last_connection) {
3447+ inline bool Server::routing (Request &req, Response &res, Stream &strm) {
34513448 // File handler
34523449 bool is_head_request = req.method == " HEAD" ;
34533450 if ((req.method == " GET" || is_head_request) &&
@@ -3460,12 +3457,12 @@ inline bool Server::routing(Request &req, Response &res, Stream &strm,
34603457 {
34613458 ContentReader reader (
34623459 [&](ContentReceiver receiver) {
3463- return read_content_with_content_receiver (
3464- strm, last_connection, req, res, receiver, nullptr , nullptr );
3460+ return read_content_with_content_receiver (strm, req, res, receiver,
3461+ nullptr , nullptr );
34653462 },
34663463 [&](MultipartContentHeader header, ContentReceiver receiver) {
3467- return read_content_with_content_receiver (
3468- strm, last_connection, req, res, nullptr , header, receiver);
3464+ return read_content_with_content_receiver (strm, req, res, nullptr ,
3465+ header, receiver);
34693466 });
34703467
34713468 if (req.method == " POST" ) {
@@ -3487,7 +3484,7 @@ inline bool Server::routing(Request &req, Response &res, Stream &strm,
34873484 }
34883485
34893486 // Read content into `req.body`
3490- if (!read_content (strm, last_connection, req, res)) { return false ; }
3487+ if (!read_content (strm, req, res)) { return false ; }
34913488 }
34923489
34933490 // Regular handler
@@ -3614,7 +3611,7 @@ Server::process_request(Stream &strm, bool last_connection,
36143611 }
36153612
36163613 // Rounting
3617- if (routing (req, res, strm, last_connection )) {
3614+ if (routing (req, res, strm)) {
36183615 if (res.status == -1 ) { res.status = req.ranges .empty () ? 200 : 206 ; }
36193616 } else {
36203617 if (res.status == -1 ) { res.status = 404 ; }
0 commit comments