@@ -281,7 +281,7 @@ class DataSink {
281281private:
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
697698class Result {
698699public:
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 ¶ms) {
28352837}
28362838
28372839inline void parse_query_text (const std::string &s, Params ¶ms) {
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) {
35683570inline void
35693571Response::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
35943597inline 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
37373742inline 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
44194424inline 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
44424447inline 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; }
45694574inline Error ClientImpl::get_last_error () const { return error_; }
45704575
45714576inline 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