Skip to content

Commit 402d47e

Browse files
committed
Fix #407
1 parent 171fc2e commit 402d47e

File tree

1 file changed

+54
-57
lines changed

1 file changed

+54
-57
lines changed

httplib.h

Lines changed: 54 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
859860
class SSLClient : public Client {
860861
public:
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

32783277
inline 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

Comments
 (0)