@@ -120,7 +120,7 @@ typedef SOCKET socket_t;
120
120
#include < poll.h>
121
121
#endif
122
122
#include < pthread.h>
123
- #include < signal.h >
123
+ #include < csignal >
124
124
#include < sys/select.h>
125
125
#include < sys/socket.h>
126
126
#include < unistd.h>
@@ -129,7 +129,7 @@ typedef int socket_t;
129
129
#define INVALID_SOCKET (-1 )
130
130
#endif // _WIN32
131
131
132
- #include < assert.h >
132
+ #include < cassert >
133
133
#include < atomic>
134
134
#include < condition_variable>
135
135
#include < errno.h>
@@ -145,6 +145,7 @@ typedef int socket_t;
145
145
#include < string>
146
146
#include < sys/stat.h>
147
147
#include < thread>
148
+ #include < array>
148
149
149
150
#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
150
151
#include < openssl/err.h>
@@ -186,50 +187,46 @@ struct ci {
186
187
187
188
enum class HttpVersion { v1_0 = 0 , v1_1 };
188
189
189
- typedef std::multimap<std::string, std::string, detail::ci> Headers ;
190
+ using Headers = std::multimap<std::string, std::string, detail::ci>;
190
191
191
- typedef std::multimap<std::string, std::string> Params ;
192
- typedef std::smatch Match ;
192
+ using Params = std::multimap<std::string, std::string>;
193
+ using Match = std::smatch;
193
194
194
- typedef std::function<void (const char *data, size_t data_len)> DataSink ;
195
+ using DataSink = std::function<void (const char *data, size_t data_len)>;
195
196
196
- typedef std::function<void ()> Done ;
197
+ using Done = std::function<void ()>;
197
198
198
- typedef std::function<void (size_t offset, size_t length, DataSink sink)>
199
- ContentProvider;
199
+ using ContentProvider = std::function<void (size_t offset, size_t length, DataSink sink)>;
200
200
201
- typedef std::function<void (size_t offset, size_t length, DataSink sink,
202
- Done done)>
203
- ContentProviderWithCloser;
201
+ using ContentProviderWithCloser = std::function<void (size_t offset, size_t length, DataSink sink, Done done)>;
204
202
205
- typedef std::function<bool (const char *data, size_t data_length)>
206
- ContentReceiver;
203
+ using ContentReceiver = std::function<bool (const char *data, size_t data_length)>;
207
204
208
- typedef std::function<bool (ContentReceiver receiver)> ContentReader ;
205
+ using ContentReader = std::function<bool (ContentReceiver receiver)>;
209
206
210
- typedef std::function<bool (uint64_t current, uint64_t total)> Progress ;
207
+ using Progress = std::function<bool (uint64_t current, uint64_t total)>;
211
208
212
209
struct Response ;
213
- typedef std::function<bool (const Response &response)> ResponseHandler ;
210
+ using ResponseHandler = std::function<bool (const Response &response)>;
214
211
215
212
struct MultipartFile {
216
213
std::string filename;
217
214
std::string content_type;
218
215
size_t offset = 0 ;
219
216
size_t length = 0 ;
220
217
};
221
- typedef std::multimap<std::string, MultipartFile> MultipartFiles ;
218
+ using MultipartFiles = std::multimap<std::string, MultipartFile>;
222
219
223
220
struct MultipartFormData {
224
221
std::string name;
225
222
std::string content;
226
223
std::string filename;
227
224
std::string content_type;
228
225
};
229
- typedef std::vector<MultipartFormData> MultipartFormDataItems ;
226
+ using MultipartFormDataItems = std::vector<MultipartFormData>;
230
227
231
- typedef std::pair<ssize_t , ssize_t > Range ;
232
- typedef std::vector<Range> Ranges ;
228
+ using Range = std::pair<ssize_t , ssize_t >;
229
+ using Ranges = std::vector<Range>;
233
230
234
231
struct Request {
235
232
std::string method;
@@ -285,7 +282,7 @@ struct Response {
285
282
void set_header (const char *key, const char *val);
286
283
void set_header (const char *key, const std::string &val);
287
284
288
- void set_redirect (const char *uri );
285
+ void set_redirect (const char *url );
289
286
void set_content (const char *s, size_t n, const char *content_type);
290
287
void set_content (const std::string &s, const char *content_type);
291
288
@@ -331,11 +328,11 @@ class SocketStream : public Stream {
331
328
time_t read_timeout_usec);
332
329
virtual ~SocketStream ();
333
330
334
- virtual int read (char *ptr, size_t size);
335
- virtual int write (const char *ptr, size_t size);
336
- virtual int write (const char *ptr);
337
- virtual int write (const std::string &s);
338
- virtual std::string get_remote_addr () const ;
331
+ int read (char *ptr, size_t size) override ;
332
+ int write (const char *ptr, size_t size) override ;
333
+ int write (const char *ptr) override ;
334
+ int write (const std::string &s) override ;
335
+ std::string get_remote_addr () const override ;
339
336
340
337
private:
341
338
socket_t sock_;
@@ -348,11 +345,11 @@ class BufferStream : public Stream {
348
345
BufferStream () {}
349
346
virtual ~BufferStream () {}
350
347
351
- virtual int read (char *ptr, size_t size);
352
- virtual int write (const char *ptr, size_t size);
353
- virtual int write (const char *ptr);
354
- virtual int write (const std::string &s);
355
- virtual std::string get_remote_addr () const ;
348
+ int read (char *ptr, size_t size) override ;
349
+ int write (const char *ptr, size_t size) override ;
350
+ int write (const char *ptr) override ;
351
+ int write (const std::string &s) override ;
352
+ std::string get_remote_addr () const override ;
356
353
357
354
const std::string &get_buffer () const ;
358
355
@@ -523,7 +520,7 @@ class Server {
523
520
protected:
524
521
bool process_request (Stream &strm, bool last_connection,
525
522
bool &connection_close,
526
- std::function<void (Request &)> setup_request);
523
+ const std::function<void (Request &)>& setup_request);
527
524
528
525
size_t keep_alive_max_count_;
529
526
time_t read_timeout_sec_;
@@ -1117,7 +1114,7 @@ class stream_line_reader {
1117
1114
Stream &strm_;
1118
1115
char *fixed_buffer_;
1119
1116
const size_t fixed_buffer_size_;
1120
- size_t fixed_buffer_used_size_;
1117
+ size_t fixed_buffer_used_size_ = 0 ;
1121
1118
std::string glowable_buffer_;
1122
1119
};
1123
1120
@@ -1184,7 +1181,7 @@ inline bool wait_until_socket_is_ready(socket_t sock, time_t sec, time_t usec) {
1184
1181
(FD_ISSET (sock, &fdsr) || FD_ISSET (sock, &fdsw))) {
1185
1182
int error = 0 ;
1186
1183
socklen_t len = sizeof (error);
1187
- return getsockopt (sock, SOL_SOCKET, SO_ERROR, ( char *) &error, &len) >= 0 &&
1184
+ return getsockopt (sock, SOL_SOCKET, SO_ERROR, reinterpret_cast < char *>( &error) , &len) >= 0 &&
1188
1185
!error;
1189
1186
}
1190
1187
return false ;
@@ -1321,11 +1318,11 @@ inline std::string get_remote_addr(socket_t sock) {
1321
1318
socklen_t len = sizeof (addr);
1322
1319
1323
1320
if (!getpeername (sock, reinterpret_cast <struct sockaddr *>(&addr), &len)) {
1324
- char ipstr[ NI_MAXHOST] ;
1321
+ std::array< char , NI_MAXHOST> ipstr{} ;
1325
1322
1326
- if (!getnameinfo (reinterpret_cast <struct sockaddr *>(&addr), len, ipstr,
1327
- sizeof (ipstr), nullptr , 0 , NI_NUMERICHOST)) {
1328
- return ipstr;
1323
+ if (!getnameinfo (reinterpret_cast <struct sockaddr *>(&addr), len, ipstr. data (), ipstr. size () ,
1324
+ nullptr , 0 , NI_NUMERICHOST)) {
1325
+ return ipstr. data () ;
1329
1326
}
1330
1327
}
1331
1328
@@ -1410,14 +1407,13 @@ inline bool compress(std::string &content) {
1410
1407
1411
1408
std::string compressed;
1412
1409
1413
- const auto bufsiz = 16384 ;
1414
- char buff[bufsiz];
1410
+ std::array<char , 16384 > buff{};
1415
1411
do {
1416
- strm.avail_out = bufsiz ;
1417
- strm.next_out = reinterpret_cast <Bytef *>(buff);
1412
+ strm.avail_out = buff. size () ;
1413
+ strm.next_out = reinterpret_cast <Bytef*>(buff. data () );
1418
1414
ret = deflate (&strm, Z_FINISH);
1419
1415
assert (ret != Z_STREAM_ERROR);
1420
- compressed.append (buff, bufsiz - strm.avail_out );
1416
+ compressed.append (buff. data (), buff. size () - strm.avail_out );
1421
1417
} while (strm.avail_out == 0 );
1422
1418
1423
1419
assert (ret == Z_STREAM_END);
@@ -1453,11 +1449,10 @@ class decompressor {
1453
1449
strm.avail_in = data_length;
1454
1450
strm.next_in = const_cast <Bytef *>(reinterpret_cast <const Bytef *>(data));
1455
1451
1456
- const auto bufsiz = 16384 ;
1457
- char buff[bufsiz];
1452
+ std::array<char , 16384 > buff{};
1458
1453
do {
1459
- strm.avail_out = bufsiz ;
1460
- strm.next_out = reinterpret_cast <Bytef *>(buff);
1454
+ strm.avail_out = buff. size () ;
1455
+ strm.next_out = reinterpret_cast <Bytef*>(buff. data () );
1461
1456
1462
1457
ret = inflate (&strm, Z_NO_FLUSH);
1463
1458
assert (ret != Z_STREAM_ERROR);
@@ -1467,7 +1462,7 @@ class decompressor {
1467
1462
case Z_MEM_ERROR: inflateEnd (&strm); return false ;
1468
1463
}
1469
1464
1470
- if (!callback (buff, bufsiz - strm.avail_out )) { return false ; }
1465
+ if (!callback (buff. data (), buff. size () - strm.avail_out )) { return false ; }
1471
1466
} while (strm.avail_out == 0 );
1472
1467
1473
1468
return ret == Z_STREAM_END;
@@ -2245,18 +2240,17 @@ inline void Response::set_chunked_content_provider(
2245
2240
// Rstream implementation
2246
2241
template <typename ... Args>
2247
2242
inline int Stream::write_format (const char *fmt, const Args &... args) {
2248
- const auto bufsiz = 2048 ;
2249
- char buf[bufsiz];
2243
+ std::array<char , 2048 > buf;
2250
2244
2251
2245
#if defined(_MSC_VER) && _MSC_VER < 1900
2252
- auto n = _snprintf_s (buf, bufsiz, bufsiz - 1 , fmt, args...);
2246
+ auto n = _snprintf_s (buf, bufsiz, buf. size () - 1 , fmt, args...);
2253
2247
#else
2254
- auto n = snprintf (buf, bufsiz - 1 , fmt, args...);
2248
+ auto n = snprintf (buf. data (), buf. size () - 1 , fmt, args...);
2255
2249
#endif
2256
2250
if (n <= 0 ) { return n; }
2257
2251
2258
- if (n >= bufsiz - 1 ) {
2259
- std::vector<char > glowable_buf (bufsiz );
2252
+ if (n >= static_cast < int >(buf. size ()) - 1 ) {
2253
+ std::vector<char > glowable_buf (buf. size () );
2260
2254
2261
2255
while (n >= static_cast <int >(glowable_buf.size () - 1 )) {
2262
2256
glowable_buf.resize (glowable_buf.size () * 2 );
@@ -2269,7 +2263,7 @@ inline int Stream::write_format(const char *fmt, const Args &... args) {
2269
2263
}
2270
2264
return write (&glowable_buf[0 ], n);
2271
2265
} else {
2272
- return write (buf, n);
2266
+ return write (buf. data () , n);
2273
2267
}
2274
2268
}
2275
2269
@@ -2411,14 +2405,14 @@ inline bool Server::set_base_dir(const char *path) {
2411
2405
}
2412
2406
2413
2407
inline void Server::set_file_request_handler (Handler handler) {
2414
- file_request_handler_ = handler;
2408
+ file_request_handler_ = std::move ( handler) ;
2415
2409
}
2416
2410
2417
2411
inline void Server::set_error_handler (Handler handler) {
2418
- error_handler_ = handler;
2412
+ error_handler_ = std::move ( handler) ;
2419
2413
}
2420
2414
2421
- inline void Server::set_logger (Logger logger) { logger_ = logger; }
2415
+ inline void Server::set_logger (Logger logger) { logger_ = std::move ( logger) ; }
2422
2416
2423
2417
inline void Server::set_keep_alive_max_count (size_t count) {
2424
2418
keep_alive_max_count_ = count;
@@ -2728,8 +2722,7 @@ inline int Server::bind_internal(const char *host, int port, int socket_flags) {
2728
2722
if (address.ss_family == AF_INET) {
2729
2723
return ntohs (reinterpret_cast <struct sockaddr_in *>(&address)->sin_port );
2730
2724
} else if (address.ss_family == AF_INET6) {
2731
- return ntohs (
2732
- reinterpret_cast <struct sockaddr_in6 *>(&address)->sin6_port );
2725
+ return ntohs (reinterpret_cast <struct sockaddr_in6 *>(&address)->sin6_port );
2733
2726
} else {
2734
2727
return -1 ;
2735
2728
}
@@ -2863,11 +2856,10 @@ Server::dispatch_request_for_content_reader(Request &req, Response &res,
2863
2856
inline bool
2864
2857
Server::process_request (Stream &strm, bool last_connection,
2865
2858
bool &connection_close,
2866
- std::function<void (Request &)> setup_request) {
2867
- const auto bufsiz = 2048 ;
2868
- char buf[bufsiz];
2859
+ const std::function<void (Request &)>& setup_request) {
2860
+ std::array<char , 2048 > buf{};
2869
2861
2870
- detail::stream_line_reader line_reader (strm, buf, bufsiz );
2862
+ detail::stream_line_reader line_reader (strm, buf. data (), buf. size () );
2871
2863
2872
2864
// Connection has been closed on client
2873
2865
if (!line_reader.getline ()) { return false ; }
@@ -2981,10 +2973,9 @@ inline socket_t Client::create_client_socket() const {
2981
2973
}
2982
2974
2983
2975
inline bool Client::read_response_line (Stream &strm, Response &res) {
2984
- const auto bufsiz = 2048 ;
2985
- char buf[bufsiz];
2976
+ std::array<char , 2048 > buf;
2986
2977
2987
- detail::stream_line_reader line_reader (strm, buf, bufsiz );
2978
+ detail::stream_line_reader line_reader (strm, buf. data (), buf. size () );
2988
2979
2989
2980
if (!line_reader.getline ()) { return false ; }
2990
2981
@@ -3283,7 +3274,7 @@ inline std::shared_ptr<Response> Client::Get(const char *path) {
3283
3274
3284
3275
inline std::shared_ptr<Response> Client::Get (const char *path,
3285
3276
Progress progress) {
3286
- return Get (path, Headers (), progress);
3277
+ return Get (path, Headers (), std::move ( progress) );
3287
3278
}
3288
3279
3289
3280
inline std::shared_ptr<Response> Client::Get (const char *path,
@@ -3298,7 +3289,7 @@ Client::Get(const char *path, const Headers &headers, Progress progress) {
3298
3289
req.method = " GET" ;
3299
3290
req.path = path;
3300
3291
req.headers = headers;
3301
- req.progress = progress;
3292
+ req.progress = std::move ( progress) ;
3302
3293
3303
3294
auto res = std::make_shared<Response>();
3304
3295
return send (req, *res) ? res : nullptr ;
@@ -3307,35 +3298,35 @@ Client::Get(const char *path, const Headers &headers, Progress progress) {
3307
3298
inline std::shared_ptr<Response> Client::Get (const char *path,
3308
3299
ContentReceiver content_receiver) {
3309
3300
Progress dummy;
3310
- return Get (path, Headers (), nullptr , content_receiver, dummy);
3301
+ return Get (path, Headers (), nullptr , std::move ( content_receiver) , dummy);
3311
3302
}
3312
3303
3313
3304
inline std::shared_ptr<Response> Client::Get (const char *path,
3314
3305
ContentReceiver content_receiver,
3315
3306
Progress progress) {
3316
- return Get (path, Headers (), nullptr , content_receiver, progress);
3307
+ return Get (path, Headers (), nullptr , std::move ( content_receiver) , progress);
3317
3308
}
3318
3309
3319
3310
inline std::shared_ptr<Response> Client::Get (const char *path,
3320
3311
const Headers &headers,
3321
3312
ContentReceiver content_receiver) {
3322
3313
Progress dummy;
3323
- return Get (path, headers, nullptr , content_receiver, dummy);
3314
+ return Get (path, headers, nullptr , std::move ( content_receiver) , dummy);
3324
3315
}
3325
3316
3326
3317
inline std::shared_ptr<Response> Client::Get (const char *path,
3327
3318
const Headers &headers,
3328
3319
ContentReceiver content_receiver,
3329
3320
Progress progress) {
3330
- return Get (path, headers, nullptr , content_receiver, progress);
3321
+ return Get (path, headers, nullptr , std::move ( content_receiver) , progress);
3331
3322
}
3332
3323
3333
3324
inline std::shared_ptr<Response> Client::Get (const char *path,
3334
3325
const Headers &headers,
3335
3326
ResponseHandler response_handler,
3336
3327
ContentReceiver content_receiver) {
3337
3328
Progress dummy;
3338
- return Get (path, headers, response_handler, content_receiver, dummy);
3329
+ return Get (path, headers, std::move ( response_handler) , content_receiver, dummy);
3339
3330
}
3340
3331
3341
3332
inline std::shared_ptr<Response> Client::Get (const char *path,
@@ -3347,9 +3338,9 @@ inline std::shared_ptr<Response> Client::Get(const char *path,
3347
3338
req.method = " GET" ;
3348
3339
req.path = path;
3349
3340
req.headers = headers;
3350
- req.response_handler = response_handler;
3351
- req.content_receiver = content_receiver;
3352
- req.progress = progress;
3341
+ req.response_handler = std::move ( response_handler) ;
3342
+ req.content_receiver = std::move ( content_receiver) ;
3343
+ req.progress = std::move ( progress) ;
3353
3344
3354
3345
auto res = std::make_shared<Response>();
3355
3346
return send (req, *res) ? res : nullptr ;
0 commit comments