Skip to content

Commit e590363

Browse files
committed
1 parent 510b4ea commit e590363

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

httplib.h

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ class DataSink {
281281
private:
282282
class data_sink_streambuf : public std::streambuf {
283283
public:
284-
data_sink_streambuf(DataSink &sink) : sink_(sink) {}
284+
explicit data_sink_streambuf(DataSink &sink) : sink_(sink) {}
285285

286286
protected:
287287
std::streamsize xsputn(const char *s, std::streamsize n) {
@@ -402,15 +402,15 @@ struct Response {
402402

403403
void set_content_provider(
404404
size_t length, const char *content_type, ContentProvider provider,
405-
std::function<void()> resource_releaser = [] {});
405+
const std::function<void()> &resource_releaser = nullptr);
406406

407407
void set_content_provider(
408408
const char *content_type, ContentProviderWithoutLength provider,
409-
std::function<void()> resource_releaser = [] {});
409+
const std::function<void()> &resource_releaser = nullptr);
410410

411411
void set_chunked_content_provider(
412412
const char *content_type, ContentProviderWithoutLength provider,
413-
std::function<void()> resource_releaser = [] {});
413+
const std::function<void()> &resource_releaser = nullptr);
414414

415415
Response() = default;
416416
Response(const Response &) = default;
@@ -634,10 +634,11 @@ class Server {
634634

635635
bool routing(Request &req, Response &res, Stream &strm);
636636
bool handle_file_request(Request &req, Response &res, bool head = false);
637-
bool dispatch_request(Request &req, Response &res, Handlers &handlers);
638-
bool dispatch_request_for_content_reader(Request &req, Response &res,
639-
ContentReader content_reader,
640-
HandlersForContentReader &handlers);
637+
bool dispatch_request(Request &req, Response &res, const Handlers &handlers);
638+
bool
639+
dispatch_request_for_content_reader(Request &req, Response &res,
640+
ContentReader content_reader,
641+
const HandlersForContentReader &handlers);
641642

642643
bool parse_request_line(const char *s, Request &req);
643644
bool write_response(Stream &strm, bool close_connection, const Request &req,
@@ -696,7 +697,8 @@ enum Error {
696697

697698
class Result {
698699
public:
699-
Result(std::shared_ptr<Response> res, Error err) : res_(res), err_(err) {}
700+
Result(const std::shared_ptr<Response> &res, Error err)
701+
: res_(res), err_(err) {}
700702
operator bool() const { return res_ != nullptr; }
701703
bool operator==(std::nullptr_t) const { return res_ == nullptr; }
702704
bool operator!=(std::nullptr_t) const { return res_ != nullptr; }
@@ -899,7 +901,7 @@ class ClientImpl {
899901
std::string interface_;
900902

901903
std::string proxy_host_;
902-
int proxy_port_;
904+
int proxy_port_ = -1;
903905

904906
std::string proxy_basic_auth_username_;
905907
std::string proxy_basic_auth_password_;
@@ -1971,7 +1973,7 @@ inline socket_t create_client_socket(const char *host, int port,
19711973
});
19721974

19731975
if (sock != INVALID_SOCKET) {
1974-
if (error != Error::Success) { error = Error::Success; }
1976+
error = Error::Success;
19751977
} else {
19761978
if (error == Error::Success) { error = Error::Connection; }
19771979
}
@@ -2607,7 +2609,7 @@ bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status,
26072609
Progress progress, ContentReceiver receiver,
26082610
bool decompress) {
26092611
return prepare_content_receiver(
2610-
x, status, receiver, decompress, [&](ContentReceiver &out) {
2612+
x, status, receiver, decompress, [&](const ContentReceiver &out) {
26112613
auto ret = true;
26122614
auto exceed_payload_max_length = false;
26132615

@@ -2835,7 +2837,7 @@ inline std::string params_to_query_str(const Params &params) {
28352837
}
28362838

28372839
inline void parse_query_text(const std::string &s, Params &params) {
2838-
split(&s[0], &s[s.size()], '&', [&](const char *b, const char *e) {
2840+
split(s.data(), s.data() + s.size(), '&', [&](const char *b, const char *e) {
28392841
std::string key;
28402842
std::string val;
28412843
split(b, e, '=', [&](const char *b2, const char *e2) {
@@ -3019,14 +3021,14 @@ class MultipartFormDataParser {
30193021
}
30203022
case 4: { // Boundary
30213023
if (crlf_.size() > buf_.size()) { return true; }
3022-
if (buf_.find(crlf_) == 0) {
3024+
if (buf_.compare(0, crlf_.size(), crlf_) == 0) {
30233025
buf_.erase(0, crlf_.size());
30243026
off_ += crlf_.size();
30253027
state_ = 1;
30263028
} else {
30273029
auto pattern = dash_ + crlf_;
30283030
if (pattern.size() > buf_.size()) { return true; }
3029-
if (buf_.find(pattern) == 0) {
3031+
if (buf_.compare(0, pattern.size(), pattern) == 0) {
30303032
buf_.erase(0, pattern.size());
30313033
off_ += pattern.size();
30323034
is_valid_ = true;
@@ -3568,7 +3570,7 @@ inline void Response::set_content(std::string s, const char *content_type) {
35683570
inline void
35693571
Response::set_content_provider(size_t in_length, const char *content_type,
35703572
ContentProvider provider,
3571-
std::function<void()> resource_releaser) {
3573+
const std::function<void()> &resource_releaser) {
35723574
assert(in_length > 0);
35733575
set_header("Content-Type", content_type);
35743576
content_length_ = in_length;
@@ -3579,9 +3581,10 @@ Response::set_content_provider(size_t in_length, const char *content_type,
35793581
is_chunked_content_provider = false;
35803582
}
35813583

3582-
inline void Response::set_content_provider(
3583-
const char *content_type, ContentProviderWithoutLength provider,
3584-
std::function<void()> resource_releaser) {
3584+
inline void
3585+
Response::set_content_provider(const char *content_type,
3586+
ContentProviderWithoutLength provider,
3587+
const std::function<void()> &resource_releaser) {
35853588
set_header("Content-Type", content_type);
35863589
content_length_ = 0;
35873590
content_provider_ = [provider](size_t offset, size_t, DataSink &sink) {
@@ -3593,7 +3596,7 @@ inline void Response::set_content_provider(
35933596

35943597
inline void Response::set_chunked_content_provider(
35953598
const char *content_type, ContentProviderWithoutLength provider,
3596-
std::function<void()> resource_releaser) {
3599+
const std::function<void()> &resource_releaser) {
35973600
set_header("Content-Type", content_type);
35983601
content_length_ = 0;
35993602
content_provider_ = [provider](size_t offset, size_t, DataSink &sink) {
@@ -3727,11 +3730,13 @@ inline const std::string &BufferStream::get_buffer() const { return buffer; }
37273730
} // namespace detail
37283731

37293732
// HTTP server implementation
3730-
inline Server::Server() : svr_sock_(INVALID_SOCKET), is_running_(false) {
3733+
inline Server::Server()
3734+
: new_task_queue(
3735+
[] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); }),
3736+
svr_sock_(INVALID_SOCKET), is_running_(false) {
37313737
#ifndef _WIN32
37323738
signal(SIGPIPE, SIG_IGN);
37333739
#endif
3734-
new_task_queue = [] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); };
37353740
}
37363741

37373742
inline Server::~Server() {}
@@ -4233,7 +4238,7 @@ inline bool Server::handle_file_request(Request &req, Response &res,
42334238
const auto &base_dir = kv.second;
42344239

42354240
// Prefix match
4236-
if (!req.path.find(mount_point)) {
4241+
if (!req.path.compare(0, mount_point.size(), mount_point)) {
42374242
std::string sub_path = "/" + req.path.substr(mount_point.size());
42384243
if (detail::is_valid_path(sub_path)) {
42394244
auto path = base_dir + sub_path;
@@ -4417,7 +4422,7 @@ inline bool Server::routing(Request &req, Response &res, Stream &strm) {
44174422
}
44184423

44194424
inline bool Server::dispatch_request(Request &req, Response &res,
4420-
Handlers &handlers) {
4425+
const Handlers &handlers) {
44214426

44224427
try {
44234428
for (const auto &x : handlers) {
@@ -4441,7 +4446,7 @@ inline bool Server::dispatch_request(Request &req, Response &res,
44414446

44424447
inline bool Server::dispatch_request_for_content_reader(
44434448
Request &req, Response &res, ContentReader content_reader,
4444-
HandlersForContentReader &handlers) {
4449+
const HandlersForContentReader &handlers) {
44454450
for (const auto &x : handlers) {
44464451
const auto &pattern = x.first;
44474452
const auto &handler = x.second;
@@ -4569,7 +4574,7 @@ inline bool ClientImpl::is_valid() const { return true; }
45694574
inline Error ClientImpl::get_last_error() const { return error_; }
45704575

45714576
inline socket_t ClientImpl::create_client_socket() const {
4572-
if (!proxy_host_.empty()) {
4577+
if (!proxy_host_.empty() && proxy_port_ != -1) {
45734578
return detail::create_client_socket(
45744579
proxy_host_.c_str(), proxy_port_, tcp_nodelay_, socket_options_,
45754580
connection_timeout_sec_, connection_timeout_usec_, interface_, error_);
@@ -4632,7 +4637,7 @@ inline bool ClientImpl::send(const Request &req, Response &res) {
46324637
// TODO: refactoring
46334638
if (is_ssl()) {
46344639
auto &scli = static_cast<SSLClient &>(*this);
4635-
if (!proxy_host_.empty()) {
4640+
if (!proxy_host_.empty() && proxy_port_ != -1) {
46364641
bool success = false;
46374642
if (!scli.connect_with_proxy(socket_, res, success)) {
46384643
return success;
@@ -4669,7 +4674,7 @@ inline bool ClientImpl::handle_request(Stream &strm, const Request &req,
46694674

46704675
bool ret;
46714676

4672-
if (!is_ssl() && !proxy_host_.empty()) {
4677+
if (!is_ssl() && !proxy_host_.empty() && proxy_port_ != -1) {
46734678
auto req2 = req;
46744679
req2.path = "http://" + host_and_port_ + req.path;
46754680
ret = process_request(strm, req2, res, close_connection);

0 commit comments

Comments
 (0)