From 8decb5cf3124322ff103c9c2ab286c3fda7b3910 Mon Sep 17 00:00:00 2001 From: cxh Date: Fri, 12 Dec 2025 09:02:06 +0800 Subject: [PATCH] init config_server project --- .gitignore | 1 + CMakeLists.txt | 29 + bin/config.html | 296 + bin/config.json | 28 + bin/config_schema.json | 92 + bin/config_server | Bin 0 -> 2656720 bytes include/httplib.h | 12337 +++++++++ include/json.hpp | 25526 ++++++++++++++++++ include/json_fwd.hpp | 187 + mdns/avahi-autoipd_0.8-5ubuntu5.3_arm64.deb | Bin 0 -> 40636 bytes mdns/avahi-daemon_0.8-5ubuntu5.3_arm64.deb | Bin 0 -> 68406 bytes mdns/avahi-utils_0.8-5ubuntu5.3_arm64.deb | Bin 0 -> 25774 bytes mdns/install_mdns.sh | 171 + mdns/libnss-mdns_0.15.1-1ubuntu1_arm64.deb | Bin 0 -> 26620 bytes src/config_server.cpp | 256 + 15 files changed, 38923 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 bin/config.html create mode 100644 bin/config.json create mode 100644 bin/config_schema.json create mode 100755 bin/config_server create mode 100644 include/httplib.h create mode 100644 include/json.hpp create mode 100644 include/json_fwd.hpp create mode 100644 mdns/avahi-autoipd_0.8-5ubuntu5.3_arm64.deb create mode 100644 mdns/avahi-daemon_0.8-5ubuntu5.3_arm64.deb create mode 100644 mdns/avahi-utils_0.8-5ubuntu5.3_arm64.deb create mode 100755 mdns/install_mdns.sh create mode 100644 mdns/libnss-mdns_0.15.1-1ubuntu1_arm64.deb create mode 100644 src/config_server.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..567609b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ea5f409 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.10) + +project(demo_config_server LANGUAGES CXX) + +# C++ 标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# 可执行文件输出到 ./bin 目录 +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) + +# 源文件 +add_executable(config_server + src/config_server.cpp +) + +# 头文件路径(httplib/json 都在这里) +target_include_directories(config_server + PRIVATE + ${CMAKE_SOURCE_DIR}/include +) + +# 如果用到了多线程(httplib 常见),顺手连上线程库,没用也没事 +find_package(Threads REQUIRED) +target_link_libraries(config_server + PRIVATE + Threads::Threads +) diff --git a/bin/config.html b/bin/config.html new file mode 100644 index 0000000..dcc885b --- /dev/null +++ b/bin/config.html @@ -0,0 +1,296 @@ + + + + + + 设备配置界面 + + + + + + +

设备配置界面

+ +
+
+ + + + + + + + diff --git a/bin/config.json b/bin/config.json new file mode 100644 index 0000000..cfea827 --- /dev/null +++ b/bin/config.json @@ -0,0 +1,28 @@ +{ + "vehicle": { + "device_no": "KL001", + "vehicle_id": "V010001", + "vin": "LSV1234567890KUNL" + }, + "cloud": { + "platform_ip": "36.137.175.196", + "platform_port": 11101, + "mqtt_ip": "192.168.4.196", + "mqtt_port": 1883, + "mqtt_username": "", + "mqtt_password": "" + }, + "cockpit": { + "mqtt_ip": "192.168.1.110", + "mqtt_port": 1883 + }, + "serial": { + "dev_name": "/dev/ttyUSB3", + "baudrate": 115200 + }, + "tbox": { + "login_seq": 1, + "login_seq_date": "000000", + "heartbeat_interval": 30 + } +} \ No newline at end of file diff --git a/bin/config_schema.json b/bin/config_schema.json new file mode 100644 index 0000000..ca89c15 --- /dev/null +++ b/bin/config_schema.json @@ -0,0 +1,92 @@ +{ + "vehicle": { + "device_no": { + "type": "string", + "default": "KL001", + "title": "设备编号" + }, + "vehicle_id": { + "type": "string", + "default": "V010001", + "title": "车辆编号" + }, + "vin": { + "type": "string", + "default": "LSV1234567890KUNL", + "title": "车辆 VIN" + } + }, + "cloud": { + "platform_ip": { + "type": "string", + "default": "36.137.175.196", + "title": "平台 IP" + }, + "platform_port": { + "type": "int", + "default": 11101, + "title": "平台端口" + }, + "mqtt_ip": { + "type": "string", + "default": "192.168.4.196", + "title": "MQTT 服务器 IP" + }, + "mqtt_port": { + "type": "int", + "default": 1883, + "title": "MQTT 端口" + }, + "mqtt_username": { + "type": "string", + "default": "", + "title": "MQTT 用户名" + }, + "mqtt_password": { + "type": "string", + "default": "", + "title": "MQTT 密码" + } + }, + "cockpit": { + "mqtt_ip": { + "type": "string", + "default": "192.168.1.110", + "title": "驾驶舱 MQTT IP" + }, + "mqtt_port": { + "type": "int", + "default": 1883, + "title": "驾驶舱 MQTT 端口" + } + }, + "serial": { + "dev_name": { + "type": "string", + "default": "/dev/ttyUSB3", + "title": "串口设备名" + }, + "baudrate": { + "type": "int", + "default": 115200, + "title": "串口波特率" + } + }, + "tbox": { + "login_seq": { + "type": "int", + "default": 1, + "title": "登入序号" + }, + "login_seq_date": { + "type": "string", + "default": "000000", + "title": "登入日期" + }, + "heartbeat_interval": { + "type": "int", + "default": 60, + "title": "心跳间隔(秒)" + } + } +} \ No newline at end of file diff --git a/bin/config_server b/bin/config_server new file mode 100755 index 0000000000000000000000000000000000000000..27fa11cb3b936d4824059f0a5239e1e78cdbac21 GIT binary patch literal 2656720 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%0Dd@uO1lsl+9#f!-;^ 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

n)`Rp2nh2LFb);YXQBEe?5L)hC^PqOQ&?_U;E~z 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�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 VTlM7`u{a::max)()) +#endif + +#ifndef CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH +#define CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH 8192 +#endif + +#ifndef CPPHTTPLIB_RANGE_MAX_COUNT +#define CPPHTTPLIB_RANGE_MAX_COUNT 1024 +#endif + +#ifndef CPPHTTPLIB_TCP_NODELAY +#define CPPHTTPLIB_TCP_NODELAY false +#endif + +#ifndef CPPHTTPLIB_IPV6_V6ONLY +#define CPPHTTPLIB_IPV6_V6ONLY false +#endif + +#ifndef CPPHTTPLIB_RECV_BUFSIZ +#define CPPHTTPLIB_RECV_BUFSIZ size_t(16384u) +#endif + +#ifndef CPPHTTPLIB_SEND_BUFSIZ +#define CPPHTTPLIB_SEND_BUFSIZ size_t(16384u) +#endif + +#ifndef CPPHTTPLIB_COMPRESSION_BUFSIZ +#define CPPHTTPLIB_COMPRESSION_BUFSIZ size_t(16384u) +#endif + +#ifndef CPPHTTPLIB_THREAD_POOL_COUNT +#define CPPHTTPLIB_THREAD_POOL_COUNT \ + ((std::max)(8u, std::thread::hardware_concurrency() > 0 \ + ? std::thread::hardware_concurrency() - 1 \ + : 0)) +#endif + +#ifndef CPPHTTPLIB_RECV_FLAGS +#define CPPHTTPLIB_RECV_FLAGS 0 +#endif + +#ifndef CPPHTTPLIB_SEND_FLAGS +#define CPPHTTPLIB_SEND_FLAGS 0 +#endif + +#ifndef CPPHTTPLIB_LISTEN_BACKLOG +#define CPPHTTPLIB_LISTEN_BACKLOG 5 +#endif + +#ifndef CPPHTTPLIB_MAX_LINE_LENGTH +#define CPPHTTPLIB_MAX_LINE_LENGTH 32768 +#endif + +/* + * Headers + */ + +#ifdef _WIN32 +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif //_CRT_SECURE_NO_WARNINGS + +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE +#endif //_CRT_NONSTDC_NO_DEPRECATE + +#if defined(_MSC_VER) +#if _MSC_VER < 1900 +#error Sorry, Visual Studio versions prior to 2015 are not supported +#endif + +#pragma comment(lib, "ws2_32.lib") + +using ssize_t = __int64; +#endif // _MSC_VER + +#ifndef S_ISREG +#define S_ISREG(m) (((m) & S_IFREG) == S_IFREG) +#endif // S_ISREG + +#ifndef S_ISDIR +#define S_ISDIR(m) (((m) & S_IFDIR) == S_IFDIR) +#endif // S_ISDIR + +#ifndef NOMINMAX +#define NOMINMAX +#endif // NOMINMAX + +#include +#include +#include + +#if defined(__has_include) +#if __has_include() +// afunix.h uses types declared in winsock2.h, so has to be included after it. +#include +#define CPPHTTPLIB_HAVE_AFUNIX_H 1 +#endif +#endif + +#ifndef WSA_FLAG_NO_HANDLE_INHERIT +#define WSA_FLAG_NO_HANDLE_INHERIT 0x80 +#endif + +using nfds_t = unsigned long; +using socket_t = SOCKET; +using socklen_t = int; + +#else // not _WIN32 + +#include +#if !defined(_AIX) && !defined(__MVS__) +#include +#endif +#ifdef __MVS__ +#include +#ifndef NI_MAXHOST +#define NI_MAXHOST 1025 +#endif +#endif +#include +#include +#include +#ifdef __linux__ +#include +#undef _res // Undefine _res macro to avoid conflicts with user code (#2278) +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +using socket_t = int; +#ifndef INVALID_SOCKET +#define INVALID_SOCKET (-1) +#endif +#endif //_WIN32 + +#if defined(__APPLE__) +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) || \ + defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) +#if TARGET_OS_MAC +#include +#include +#endif +#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO or + // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +#ifdef _WIN32 +#include + +// these are defined in wincrypt.h and it breaks compilation if BoringSSL is +// used +#undef X509_NAME +#undef X509_CERT_PAIR +#undef X509_EXTENSIONS +#undef PKCS7_SIGNER_INFO + +#ifdef _MSC_VER +#pragma comment(lib, "crypt32.lib") +#endif +#endif // _WIN32 + +#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) +#if TARGET_OS_MAC +#include +#endif +#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO + +#include +#include +#include +#include + +#if defined(_WIN32) && defined(OPENSSL_USE_APPLINK) +#include +#endif + +#include +#include + +#if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER) +#if OPENSSL_VERSION_NUMBER < 0x1010107f +#error Please use OpenSSL or a current version of BoringSSL +#endif +#define SSL_get1_peer_certificate SSL_get_peer_certificate +#elif OPENSSL_VERSION_NUMBER < 0x30000000L +#error Sorry, OpenSSL versions prior to 3.0.0 are not supported +#endif + +#endif // CPPHTTPLIB_OPENSSL_SUPPORT + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +#include +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +#include +#include +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT +#include +#endif + +/* + * Declaration + */ +namespace httplib { + +namespace detail { + +/* + * Backport std::make_unique from C++14. + * + * NOTE: This code came up with the following stackoverflow post: + * https://stackoverflow.com/questions/10149840/c-arrays-and-make-unique + * + */ + +template +typename std::enable_if::value, std::unique_ptr>::type +make_unique(Args &&...args) { + return std::unique_ptr(new T(std::forward(args)...)); +} + +template +typename std::enable_if::value, std::unique_ptr>::type +make_unique(std::size_t n) { + typedef typename std::remove_extent::type RT; + return std::unique_ptr(new RT[n]); +} + +namespace case_ignore { + +inline unsigned char to_lower(int c) { + const static unsigned char table[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 215, 248, 249, 250, 251, 252, 253, 254, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, + }; + return table[(unsigned char)(char)c]; +} + +inline bool equal(const std::string &a, const std::string &b) { + return a.size() == b.size() && + std::equal(a.begin(), a.end(), b.begin(), [](char ca, char cb) { + return to_lower(ca) == to_lower(cb); + }); +} + +struct equal_to { + bool operator()(const std::string &a, const std::string &b) const { + return equal(a, b); + } +}; + +struct hash { + size_t operator()(const std::string &key) const { + return hash_core(key.data(), key.size(), 0); + } + + size_t hash_core(const char *s, size_t l, size_t h) const { + return (l == 0) ? h + : hash_core(s + 1, l - 1, + // Unsets the 6 high bits of h, therefore no + // overflow happens + (((std::numeric_limits::max)() >> 6) & + h * 33) ^ + static_cast(to_lower(*s))); + } +}; + +template +using unordered_set = std::unordered_set; + +} // namespace case_ignore + +// This is based on +// "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4189". + +struct scope_exit { + explicit scope_exit(std::function &&f) + : exit_function(std::move(f)), execute_on_destruction{true} {} + + scope_exit(scope_exit &&rhs) noexcept + : exit_function(std::move(rhs.exit_function)), + execute_on_destruction{rhs.execute_on_destruction} { + rhs.release(); + } + + ~scope_exit() { + if (execute_on_destruction) { this->exit_function(); } + } + + void release() { this->execute_on_destruction = false; } + +private: + scope_exit(const scope_exit &) = delete; + void operator=(const scope_exit &) = delete; + scope_exit &operator=(scope_exit &&) = delete; + + std::function exit_function; + bool execute_on_destruction; +}; + +} // namespace detail + +enum SSLVerifierResponse { + // no decision has been made, use the built-in certificate verifier + NoDecisionMade, + // connection certificate is verified and accepted + CertificateAccepted, + // connection certificate was processed but is rejected + CertificateRejected +}; + +enum StatusCode { + // Information responses + Continue_100 = 100, + SwitchingProtocol_101 = 101, + Processing_102 = 102, + EarlyHints_103 = 103, + + // Successful responses + OK_200 = 200, + Created_201 = 201, + Accepted_202 = 202, + NonAuthoritativeInformation_203 = 203, + NoContent_204 = 204, + ResetContent_205 = 205, + PartialContent_206 = 206, + MultiStatus_207 = 207, + AlreadyReported_208 = 208, + IMUsed_226 = 226, + + // Redirection messages + MultipleChoices_300 = 300, + MovedPermanently_301 = 301, + Found_302 = 302, + SeeOther_303 = 303, + NotModified_304 = 304, + UseProxy_305 = 305, + unused_306 = 306, + TemporaryRedirect_307 = 307, + PermanentRedirect_308 = 308, + + // Client error responses + BadRequest_400 = 400, + Unauthorized_401 = 401, + PaymentRequired_402 = 402, + Forbidden_403 = 403, + NotFound_404 = 404, + MethodNotAllowed_405 = 405, + NotAcceptable_406 = 406, + ProxyAuthenticationRequired_407 = 407, + RequestTimeout_408 = 408, + Conflict_409 = 409, + Gone_410 = 410, + LengthRequired_411 = 411, + PreconditionFailed_412 = 412, + PayloadTooLarge_413 = 413, + UriTooLong_414 = 414, + UnsupportedMediaType_415 = 415, + RangeNotSatisfiable_416 = 416, + ExpectationFailed_417 = 417, + ImATeapot_418 = 418, + MisdirectedRequest_421 = 421, + UnprocessableContent_422 = 422, + Locked_423 = 423, + FailedDependency_424 = 424, + TooEarly_425 = 425, + UpgradeRequired_426 = 426, + PreconditionRequired_428 = 428, + TooManyRequests_429 = 429, + RequestHeaderFieldsTooLarge_431 = 431, + UnavailableForLegalReasons_451 = 451, + + // Server error responses + InternalServerError_500 = 500, + NotImplemented_501 = 501, + BadGateway_502 = 502, + ServiceUnavailable_503 = 503, + GatewayTimeout_504 = 504, + HttpVersionNotSupported_505 = 505, + VariantAlsoNegotiates_506 = 506, + InsufficientStorage_507 = 507, + LoopDetected_508 = 508, + NotExtended_510 = 510, + NetworkAuthenticationRequired_511 = 511, +}; + +using Headers = + std::unordered_multimap; + +using Params = std::multimap; +using Match = std::smatch; + +using DownloadProgress = std::function; +using UploadProgress = std::function; + +struct Response; +using ResponseHandler = std::function; + +struct FormData { + std::string name; + std::string content; + std::string filename; + std::string content_type; + Headers headers; +}; + +struct FormField { + std::string name; + std::string content; + Headers headers; +}; +using FormFields = std::multimap; + +using FormFiles = std::multimap; + +struct MultipartFormData { + FormFields fields; // Text fields from multipart + FormFiles files; // Files from multipart + + // Text field access + std::string get_field(const std::string &key, size_t id = 0) const; + std::vector get_fields(const std::string &key) const; + bool has_field(const std::string &key) const; + size_t get_field_count(const std::string &key) const; + + // File access + FormData get_file(const std::string &key, size_t id = 0) const; + std::vector get_files(const std::string &key) const; + bool has_file(const std::string &key) const; + size_t get_file_count(const std::string &key) const; +}; + +struct UploadFormData { + std::string name; + std::string content; + std::string filename; + std::string content_type; +}; +using UploadFormDataItems = std::vector; + +class DataSink { +public: + DataSink() : os(&sb_), sb_(*this) {} + + DataSink(const DataSink &) = delete; + DataSink &operator=(const DataSink &) = delete; + DataSink(DataSink &&) = delete; + DataSink &operator=(DataSink &&) = delete; + + std::function write; + std::function is_writable; + std::function done; + std::function done_with_trailer; + std::ostream os; + +private: + class data_sink_streambuf final : public std::streambuf { + public: + explicit data_sink_streambuf(DataSink &sink) : sink_(sink) {} + + protected: + std::streamsize xsputn(const char *s, std::streamsize n) override { + sink_.write(s, static_cast(n)); + return n; + } + + private: + DataSink &sink_; + }; + + data_sink_streambuf sb_; +}; + +using ContentProvider = + std::function; + +using ContentProviderWithoutLength = + std::function; + +using ContentProviderResourceReleaser = std::function; + +struct FormDataProvider { + std::string name; + ContentProviderWithoutLength provider; + std::string filename; + std::string content_type; +}; +using FormDataProviderItems = std::vector; + +using ContentReceiverWithProgress = std::function; + +using ContentReceiver = + std::function; + +using FormDataHeader = std::function; + +class ContentReader { +public: + using Reader = std::function; + using FormDataReader = + std::function; + + ContentReader(Reader reader, FormDataReader multipart_reader) + : reader_(std::move(reader)), + formdata_reader_(std::move(multipart_reader)) {} + + bool operator()(FormDataHeader header, ContentReceiver receiver) const { + return formdata_reader_(std::move(header), std::move(receiver)); + } + + bool operator()(ContentReceiver receiver) const { + return reader_(std::move(receiver)); + } + + Reader reader_; + FormDataReader formdata_reader_; +}; + +using Range = std::pair; +using Ranges = std::vector; + +struct Request { + std::string method; + std::string path; + std::string matched_route; + Params params; + Headers headers; + Headers trailers; + std::string body; + + std::string remote_addr; + int remote_port = -1; + std::string local_addr; + int local_port = -1; + + // for server + std::string version; + std::string target; + MultipartFormData form; + Ranges ranges; + Match matches; + std::unordered_map path_params; + std::function is_connection_closed = []() { return true; }; + + // for client + std::vector accept_content_types; + ResponseHandler response_handler; + ContentReceiverWithProgress content_receiver; + DownloadProgress download_progress; + UploadProgress upload_progress; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + const SSL *ssl = nullptr; +#endif + + bool has_header(const std::string &key) const; + std::string get_header_value(const std::string &key, const char *def = "", + size_t id = 0) const; + size_t get_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; + size_t get_header_value_count(const std::string &key) const; + void set_header(const std::string &key, const std::string &val); + + bool has_trailer(const std::string &key) const; + std::string get_trailer_value(const std::string &key, size_t id = 0) const; + size_t get_trailer_value_count(const std::string &key) const; + + bool has_param(const std::string &key) const; + std::string get_param_value(const std::string &key, size_t id = 0) const; + size_t get_param_value_count(const std::string &key) const; + + bool is_multipart_form_data() const; + + // private members... + size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT; + size_t content_length_ = 0; + ContentProvider content_provider_; + bool is_chunked_content_provider_ = false; + size_t authorization_count_ = 0; + std::chrono::time_point start_time_ = + (std::chrono::steady_clock::time_point::min)(); +}; + +struct Response { + std::string version; + int status = -1; + std::string reason; + Headers headers; + Headers trailers; + std::string body; + std::string location; // Redirect location + + bool has_header(const std::string &key) const; + std::string get_header_value(const std::string &key, const char *def = "", + size_t id = 0) const; + size_t get_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; + size_t get_header_value_count(const std::string &key) const; + void set_header(const std::string &key, const std::string &val); + + bool has_trailer(const std::string &key) const; + std::string get_trailer_value(const std::string &key, size_t id = 0) const; + size_t get_trailer_value_count(const std::string &key) const; + + void set_redirect(const std::string &url, int status = StatusCode::Found_302); + void set_content(const char *s, size_t n, const std::string &content_type); + void set_content(const std::string &s, const std::string &content_type); + void set_content(std::string &&s, const std::string &content_type); + + void set_content_provider( + size_t length, const std::string &content_type, ContentProvider provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_chunked_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_file_content(const std::string &path, + const std::string &content_type); + void set_file_content(const std::string &path); + + Response() = default; + Response(const Response &) = default; + Response &operator=(const Response &) = default; + Response(Response &&) = default; + Response &operator=(Response &&) = default; + ~Response() { + if (content_provider_resource_releaser_) { + content_provider_resource_releaser_(content_provider_success_); + } + } + + // private members... + size_t content_length_ = 0; + ContentProvider content_provider_; + ContentProviderResourceReleaser content_provider_resource_releaser_; + bool is_chunked_content_provider_ = false; + bool content_provider_success_ = false; + std::string file_content_path_; + std::string file_content_content_type_; +}; + +class Stream { +public: + virtual ~Stream() = default; + + virtual bool is_readable() const = 0; + virtual bool wait_readable() const = 0; + virtual bool wait_writable() const = 0; + + virtual ssize_t read(char *ptr, size_t size) = 0; + virtual ssize_t write(const char *ptr, size_t size) = 0; + virtual void get_remote_ip_and_port(std::string &ip, int &port) const = 0; + virtual void get_local_ip_and_port(std::string &ip, int &port) const = 0; + virtual socket_t socket() const = 0; + + virtual time_t duration() const = 0; + + ssize_t write(const char *ptr); + ssize_t write(const std::string &s); +}; + +class TaskQueue { +public: + TaskQueue() = default; + virtual ~TaskQueue() = default; + + virtual bool enqueue(std::function fn) = 0; + virtual void shutdown() = 0; + + virtual void on_idle() {} +}; + +class ThreadPool final : public TaskQueue { +public: + explicit ThreadPool(size_t n, size_t mqr = 0) + : shutdown_(false), max_queued_requests_(mqr) { + while (n) { + threads_.emplace_back(worker(*this)); + n--; + } + } + + ThreadPool(const ThreadPool &) = delete; + ~ThreadPool() override = default; + + bool enqueue(std::function fn) override { + { + std::unique_lock lock(mutex_); + if (max_queued_requests_ > 0 && jobs_.size() >= max_queued_requests_) { + return false; + } + jobs_.push_back(std::move(fn)); + } + + cond_.notify_one(); + return true; + } + + void shutdown() override { + // Stop all worker threads... + { + std::unique_lock lock(mutex_); + shutdown_ = true; + } + + cond_.notify_all(); + + // Join... + for (auto &t : threads_) { + t.join(); + } + } + +private: + struct worker { + explicit worker(ThreadPool &pool) : pool_(pool) {} + + void operator()() { + for (;;) { + std::function fn; + { + std::unique_lock lock(pool_.mutex_); + + pool_.cond_.wait( + lock, [&] { return !pool_.jobs_.empty() || pool_.shutdown_; }); + + if (pool_.shutdown_ && pool_.jobs_.empty()) { break; } + + fn = pool_.jobs_.front(); + pool_.jobs_.pop_front(); + } + + assert(true == static_cast(fn)); + fn(); + } + +#if defined(CPPHTTPLIB_OPENSSL_SUPPORT) && !defined(OPENSSL_IS_BORINGSSL) && \ + !defined(LIBRESSL_VERSION_NUMBER) + OPENSSL_thread_stop(); +#endif + } + + ThreadPool &pool_; + }; + friend struct worker; + + std::vector threads_; + std::list> jobs_; + + bool shutdown_; + size_t max_queued_requests_ = 0; + + std::condition_variable cond_; + std::mutex mutex_; +}; + +using Logger = std::function; + +// Forward declaration for Error type +enum class Error; +using ErrorLogger = std::function; + +using SocketOptions = std::function; + +namespace detail { + +bool set_socket_opt_impl(socket_t sock, int level, int optname, + const void *optval, socklen_t optlen); +bool set_socket_opt(socket_t sock, int level, int optname, int opt); +bool set_socket_opt_time(socket_t sock, int level, int optname, time_t sec, + time_t usec); + +} // namespace detail + +void default_socket_options(socket_t sock); + +const char *status_message(int status); + +std::string get_bearer_token_auth(const Request &req); + +namespace detail { + +class MatcherBase { +public: + MatcherBase(std::string pattern) : pattern_(pattern) {} + virtual ~MatcherBase() = default; + + const std::string &pattern() const { return pattern_; } + + // Match request path and populate its matches and + virtual bool match(Request &request) const = 0; + +private: + std::string pattern_; +}; + +/** + * Captures parameters in request path and stores them in Request::path_params + * + * Capture name is a substring of a pattern from : to /. + * The rest of the pattern is matched against the request path directly + * Parameters are captured starting from the next character after + * the end of the last matched static pattern fragment until the next /. + * + * Example pattern: + * "/path/fragments/:capture/more/fragments/:second_capture" + * Static fragments: + * "/path/fragments/", "more/fragments/" + * + * Given the following request path: + * "/path/fragments/:1/more/fragments/:2" + * the resulting capture will be + * {{"capture", "1"}, {"second_capture", "2"}} + */ +class PathParamsMatcher final : public MatcherBase { +public: + PathParamsMatcher(const std::string &pattern); + + bool match(Request &request) const override; + +private: + // Treat segment separators as the end of path parameter capture + // Does not need to handle query parameters as they are parsed before path + // matching + static constexpr char separator = '/'; + + // Contains static path fragments to match against, excluding the '/' after + // path params + // Fragments are separated by path params + std::vector static_fragments_; + // Stores the names of the path parameters to be used as keys in the + // Request::path_params map + std::vector param_names_; +}; + +/** + * Performs std::regex_match on request path + * and stores the result in Request::matches + * + * Note that regex match is performed directly on the whole request. + * This means that wildcard patterns may match multiple path segments with /: + * "/begin/(.*)/end" will match both "/begin/middle/end" and "/begin/1/2/end". + */ +class RegexMatcher final : public MatcherBase { +public: + RegexMatcher(const std::string &pattern) + : MatcherBase(pattern), regex_(pattern) {} + + bool match(Request &request) const override; + +private: + std::regex regex_; +}; + +ssize_t write_headers(Stream &strm, const Headers &headers); + +std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl); + +} // namespace detail + +class Server { +public: + using Handler = std::function; + + using ExceptionHandler = + std::function; + + enum class HandlerResponse { + Handled, + Unhandled, + }; + using HandlerWithResponse = + std::function; + + using HandlerWithContentReader = std::function; + + using Expect100ContinueHandler = + std::function; + + Server(); + + virtual ~Server(); + + virtual bool is_valid() const; + + Server &Get(const std::string &pattern, Handler handler); + Server &Post(const std::string &pattern, Handler handler); + Server &Post(const std::string &pattern, HandlerWithContentReader handler); + Server &Put(const std::string &pattern, Handler handler); + Server &Put(const std::string &pattern, HandlerWithContentReader handler); + Server &Patch(const std::string &pattern, Handler handler); + Server &Patch(const std::string &pattern, HandlerWithContentReader handler); + Server &Delete(const std::string &pattern, Handler handler); + Server &Delete(const std::string &pattern, HandlerWithContentReader handler); + Server &Options(const std::string &pattern, Handler handler); + + bool set_base_dir(const std::string &dir, + const std::string &mount_point = std::string()); + bool set_mount_point(const std::string &mount_point, const std::string &dir, + Headers headers = Headers()); + bool remove_mount_point(const std::string &mount_point); + Server &set_file_extension_and_mimetype_mapping(const std::string &ext, + const std::string &mime); + Server &set_default_file_mimetype(const std::string &mime); + Server &set_file_request_handler(Handler handler); + + template + Server &set_error_handler(ErrorHandlerFunc &&handler) { + return set_error_handler_core( + std::forward(handler), + std::is_convertible{}); + } + + Server &set_exception_handler(ExceptionHandler handler); + + Server &set_pre_routing_handler(HandlerWithResponse handler); + Server &set_post_routing_handler(Handler handler); + + Server &set_pre_request_handler(HandlerWithResponse handler); + + Server &set_expect_100_continue_handler(Expect100ContinueHandler handler); + Server &set_logger(Logger logger); + Server &set_pre_compression_logger(Logger logger); + Server &set_error_logger(ErrorLogger error_logger); + + Server &set_address_family(int family); + Server &set_tcp_nodelay(bool on); + Server &set_ipv6_v6only(bool on); + Server &set_socket_options(SocketOptions socket_options); + + Server &set_default_headers(Headers headers); + Server & + set_header_writer(std::function const &writer); + + Server &set_trusted_proxies(const std::vector &proxies); + + Server &set_keep_alive_max_count(size_t count); + Server &set_keep_alive_timeout(time_t sec); + + Server &set_read_timeout(time_t sec, time_t usec = 0); + template + Server &set_read_timeout(const std::chrono::duration &duration); + + Server &set_write_timeout(time_t sec, time_t usec = 0); + template + Server &set_write_timeout(const std::chrono::duration &duration); + + Server &set_idle_interval(time_t sec, time_t usec = 0); + template + Server &set_idle_interval(const std::chrono::duration &duration); + + Server &set_payload_max_length(size_t length); + + bool bind_to_port(const std::string &host, int port, int socket_flags = 0); + int bind_to_any_port(const std::string &host, int socket_flags = 0); + bool listen_after_bind(); + + bool listen(const std::string &host, int port, int socket_flags = 0); + + bool is_running() const; + void wait_until_ready() const; + void stop(); + void decommission(); + + std::function new_task_queue; + +protected: + bool process_request(Stream &strm, const std::string &remote_addr, + int remote_port, const std::string &local_addr, + int local_port, bool close_connection, + bool &connection_closed, + const std::function &setup_request); + + std::atomic svr_sock_{INVALID_SOCKET}; + + std::vector trusted_proxies_; + + size_t keep_alive_max_count_ = CPPHTTPLIB_KEEPALIVE_MAX_COUNT; + time_t keep_alive_timeout_sec_ = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND; + time_t read_timeout_sec_ = CPPHTTPLIB_SERVER_READ_TIMEOUT_SECOND; + time_t read_timeout_usec_ = CPPHTTPLIB_SERVER_READ_TIMEOUT_USECOND; + time_t write_timeout_sec_ = CPPHTTPLIB_SERVER_WRITE_TIMEOUT_SECOND; + time_t write_timeout_usec_ = CPPHTTPLIB_SERVER_WRITE_TIMEOUT_USECOND; + time_t idle_interval_sec_ = CPPHTTPLIB_IDLE_INTERVAL_SECOND; + time_t idle_interval_usec_ = CPPHTTPLIB_IDLE_INTERVAL_USECOND; + size_t payload_max_length_ = CPPHTTPLIB_PAYLOAD_MAX_LENGTH; + +private: + using Handlers = + std::vector, Handler>>; + using HandlersForContentReader = + std::vector, + HandlerWithContentReader>>; + + static std::unique_ptr + make_matcher(const std::string &pattern); + + Server &set_error_handler_core(HandlerWithResponse handler, std::true_type); + Server &set_error_handler_core(Handler handler, std::false_type); + + socket_t create_server_socket(const std::string &host, int port, + int socket_flags, + SocketOptions socket_options) const; + int bind_internal(const std::string &host, int port, int socket_flags); + bool listen_internal(); + + bool routing(Request &req, Response &res, Stream &strm); + bool handle_file_request(const Request &req, Response &res); + bool dispatch_request(Request &req, Response &res, + const Handlers &handlers) const; + bool dispatch_request_for_content_reader( + Request &req, Response &res, ContentReader content_reader, + const HandlersForContentReader &handlers) const; + + bool parse_request_line(const char *s, Request &req) const; + void apply_ranges(const Request &req, Response &res, + std::string &content_type, std::string &boundary) const; + bool write_response(Stream &strm, bool close_connection, Request &req, + Response &res); + bool write_response_with_content(Stream &strm, bool close_connection, + const Request &req, Response &res); + bool write_response_core(Stream &strm, bool close_connection, + const Request &req, Response &res, + bool need_apply_ranges); + bool write_content_with_provider(Stream &strm, const Request &req, + Response &res, const std::string &boundary, + const std::string &content_type); + bool read_content(Stream &strm, Request &req, Response &res); + bool read_content_with_content_receiver(Stream &strm, Request &req, + Response &res, + ContentReceiver receiver, + FormDataHeader multipart_header, + ContentReceiver multipart_receiver); + bool read_content_core(Stream &strm, Request &req, Response &res, + ContentReceiver receiver, + FormDataHeader multipart_header, + ContentReceiver multipart_receiver) const; + + virtual bool process_and_close_socket(socket_t sock); + + void output_log(const Request &req, const Response &res) const; + void output_pre_compression_log(const Request &req, + const Response &res) const; + void output_error_log(const Error &err, const Request *req) const; + + std::atomic is_running_{false}; + std::atomic is_decommissioned{false}; + + struct MountPointEntry { + std::string mount_point; + std::string base_dir; + Headers headers; + }; + std::vector base_dirs_; + std::map file_extension_and_mimetype_map_; + std::string default_file_mimetype_ = "application/octet-stream"; + Handler file_request_handler_; + + Handlers get_handlers_; + Handlers post_handlers_; + HandlersForContentReader post_handlers_for_content_reader_; + Handlers put_handlers_; + HandlersForContentReader put_handlers_for_content_reader_; + Handlers patch_handlers_; + HandlersForContentReader patch_handlers_for_content_reader_; + Handlers delete_handlers_; + HandlersForContentReader delete_handlers_for_content_reader_; + Handlers options_handlers_; + + HandlerWithResponse error_handler_; + ExceptionHandler exception_handler_; + HandlerWithResponse pre_routing_handler_; + Handler post_routing_handler_; + HandlerWithResponse pre_request_handler_; + Expect100ContinueHandler expect_100_continue_handler_; + + mutable std::mutex logger_mutex_; + Logger logger_; + Logger pre_compression_logger_; + ErrorLogger error_logger_; + + int address_family_ = AF_UNSPEC; + bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; + bool ipv6_v6only_ = CPPHTTPLIB_IPV6_V6ONLY; + SocketOptions socket_options_ = default_socket_options; + + Headers default_headers_; + std::function header_writer_ = + detail::write_headers; +}; + +enum class Error { + Success = 0, + Unknown, + Connection, + BindIPAddress, + Read, + Write, + ExceedRedirectCount, + Canceled, + SSLConnection, + SSLLoadingCerts, + SSLServerVerification, + SSLServerHostnameVerification, + UnsupportedMultipartBoundaryChars, + Compression, + ConnectionTimeout, + ProxyConnection, + ResourceExhaustion, + TooManyFormDataFiles, + ExceedMaxPayloadSize, + ExceedUriMaxLength, + ExceedMaxSocketDescriptorCount, + InvalidRequestLine, + InvalidHTTPMethod, + InvalidHTTPVersion, + InvalidHeaders, + MultipartParsing, + OpenFile, + Listen, + GetSockName, + UnsupportedAddressFamily, + HTTPParsing, + InvalidRangeHeader, + + // For internal use only + SSLPeerCouldBeClosed_, +}; + +std::string to_string(Error error); + +std::ostream &operator<<(std::ostream &os, const Error &obj); + +class Result { +public: + Result() = default; + Result(std::unique_ptr &&res, Error err, + Headers &&request_headers = Headers{}) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)) {} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + Result(std::unique_ptr &&res, Error err, Headers &&request_headers, + int ssl_error) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)), ssl_error_(ssl_error) {} + Result(std::unique_ptr &&res, Error err, Headers &&request_headers, + int ssl_error, unsigned long ssl_openssl_error) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)), ssl_error_(ssl_error), + ssl_openssl_error_(ssl_openssl_error) {} +#endif + // Response + operator bool() const { return res_ != nullptr; } + bool operator==(std::nullptr_t) const { return res_ == nullptr; } + bool operator!=(std::nullptr_t) const { return res_ != nullptr; } + const Response &value() const { return *res_; } + Response &value() { return *res_; } + const Response &operator*() const { return *res_; } + Response &operator*() { return *res_; } + const Response *operator->() const { return res_.get(); } + Response *operator->() { return res_.get(); } + + // Error + Error error() const { return err_; } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // SSL Error + int ssl_error() const { return ssl_error_; } + // OpenSSL Error + unsigned long ssl_openssl_error() const { return ssl_openssl_error_; } +#endif + + // Request Headers + bool has_request_header(const std::string &key) const; + std::string get_request_header_value(const std::string &key, + const char *def = "", + size_t id = 0) const; + size_t get_request_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; + size_t get_request_header_value_count(const std::string &key) const; + +private: + std::unique_ptr res_; + Error err_ = Error::Unknown; + Headers request_headers_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + int ssl_error_ = 0; + unsigned long ssl_openssl_error_ = 0; +#endif +}; + +class ClientImpl { +public: + explicit ClientImpl(const std::string &host); + + explicit ClientImpl(const std::string &host, int port); + + explicit ClientImpl(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path); + + virtual ~ClientImpl(); + + virtual bool is_valid() const; + + // clang-format off + Result Get(const std::string &path, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Head(const std::string &path); + Result Head(const std::string &path, const Headers &headers); + + Result Post(const std::string &path); + Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers); + Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Put(const std::string &path); + Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Params ¶ms); + Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers); + Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Patch(const std::string &path); + Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Params ¶ms); + Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Delete(const std::string &path, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); + + Result Options(const std::string &path); + Result Options(const std::string &path, const Headers &headers); + // clang-format on + + bool send(Request &req, Response &res, Error &error); + Result send(const Request &req); + + void stop(); + + std::string host() const; + int port() const; + + size_t is_socket_open() const; + socket_t socket() const; + + void set_hostname_addr_map(std::map addr_map); + + void set_default_headers(Headers headers); + + void + set_header_writer(std::function const &writer); + + void set_address_family(int family); + void set_tcp_nodelay(bool on); + void set_ipv6_v6only(bool on); + void set_socket_options(SocketOptions socket_options); + + void set_connection_timeout(time_t sec, time_t usec = 0); + template + void + set_connection_timeout(const std::chrono::duration &duration); + + void set_read_timeout(time_t sec, time_t usec = 0); + template + void set_read_timeout(const std::chrono::duration &duration); + + void set_write_timeout(time_t sec, time_t usec = 0); + template + void set_write_timeout(const std::chrono::duration &duration); + + void set_max_timeout(time_t msec); + template + void set_max_timeout(const std::chrono::duration &duration); + + void set_basic_auth(const std::string &username, const std::string &password); + void set_bearer_token_auth(const std::string &token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_digest_auth(const std::string &username, + const std::string &password); +#endif + + void set_keep_alive(bool on); + void set_follow_location(bool on); + + void set_path_encode(bool on); + + void set_compress(bool on); + + void set_decompress(bool on); + + void set_interface(const std::string &intf); + + void set_proxy(const std::string &host, int port); + void set_proxy_basic_auth(const std::string &username, + const std::string &password); + void set_proxy_bearer_token_auth(const std::string &token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_proxy_digest_auth(const std::string &username, + const std::string &password); +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path = std::string()); + void set_ca_cert_store(X509_STORE *ca_cert_store); + X509_STORE *create_ca_cert_store(const char *ca_cert, std::size_t size) const; +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void enable_server_certificate_verification(bool enabled); + void enable_server_hostname_verification(bool enabled); + void set_server_certificate_verifier( + std::function verifier); +#endif + + void set_logger(Logger logger); + void set_error_logger(ErrorLogger error_logger); + +protected: + struct Socket { + socket_t sock = INVALID_SOCKET; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + SSL *ssl = nullptr; +#endif + + bool is_open() const { return sock != INVALID_SOCKET; } + }; + + virtual bool create_and_connect_socket(Socket &socket, Error &error); + + // All of: + // shutdown_ssl + // shutdown_socket + // close_socket + // should ONLY be called when socket_mutex_ is locked. + // Also, shutdown_ssl and close_socket should also NOT be called concurrently + // with a DIFFERENT thread sending requests using that socket. + virtual void shutdown_ssl(Socket &socket, bool shutdown_gracefully); + void shutdown_socket(Socket &socket) const; + void close_socket(Socket &socket); + + bool process_request(Stream &strm, Request &req, Response &res, + bool close_connection, Error &error); + + bool write_content_with_provider(Stream &strm, const Request &req, + Error &error) const; + + void copy_settings(const ClientImpl &rhs); + + void output_log(const Request &req, const Response &res) const; + void output_error_log(const Error &err, const Request *req) const; + + // Socket endpoint information + const std::string host_; + const int port_; + const std::string host_and_port_; + + // Current open socket + Socket socket_; + mutable std::mutex socket_mutex_; + std::recursive_mutex request_mutex_; + + // These are all protected under socket_mutex + size_t socket_requests_in_flight_ = 0; + std::thread::id socket_requests_are_from_thread_ = std::thread::id(); + bool socket_should_be_closed_when_request_is_done_ = false; + + // Hostname-IP map + std::map addr_map_; + + // Default headers + Headers default_headers_; + + // Header writer + std::function header_writer_ = + detail::write_headers; + + // Settings + std::string client_cert_path_; + std::string client_key_path_; + + time_t connection_timeout_sec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND; + time_t connection_timeout_usec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND; + time_t read_timeout_sec_ = CPPHTTPLIB_CLIENT_READ_TIMEOUT_SECOND; + time_t read_timeout_usec_ = CPPHTTPLIB_CLIENT_READ_TIMEOUT_USECOND; + time_t write_timeout_sec_ = CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_SECOND; + time_t write_timeout_usec_ = CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_USECOND; + time_t max_timeout_msec_ = CPPHTTPLIB_CLIENT_MAX_TIMEOUT_MSECOND; + + std::string basic_auth_username_; + std::string basic_auth_password_; + std::string bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + std::string digest_auth_username_; + std::string digest_auth_password_; +#endif + + bool keep_alive_ = false; + bool follow_location_ = false; + + bool path_encode_ = true; + + int address_family_ = AF_UNSPEC; + bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; + bool ipv6_v6only_ = CPPHTTPLIB_IPV6_V6ONLY; + SocketOptions socket_options_ = nullptr; + + bool compress_ = false; + bool decompress_ = true; + + std::string interface_; + + std::string proxy_host_; + int proxy_port_ = -1; + + std::string proxy_basic_auth_username_; + std::string proxy_basic_auth_password_; + std::string proxy_bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + std::string proxy_digest_auth_username_; + std::string proxy_digest_auth_password_; +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + std::string ca_cert_file_path_; + std::string ca_cert_dir_path_; + + X509_STORE *ca_cert_store_ = nullptr; +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + bool server_certificate_verification_ = true; + bool server_hostname_verification_ = true; + std::function server_certificate_verifier_; +#endif + + mutable std::mutex logger_mutex_; + Logger logger_; + ErrorLogger error_logger_; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + int last_ssl_error_ = 0; + unsigned long last_openssl_error_ = 0; +#endif + +private: + bool send_(Request &req, Response &res, Error &error); + Result send_(Request &&req); + + socket_t create_client_socket(Error &error) const; + bool read_response_line(Stream &strm, const Request &req, + Response &res) const; + bool write_request(Stream &strm, Request &req, bool close_connection, + Error &error); + bool redirect(Request &req, Response &res, Error &error); + bool create_redirect_client(const std::string &scheme, + const std::string &host, int port, Request &req, + Response &res, const std::string &path, + const std::string &location, Error &error); + template void setup_redirect_client(ClientType &client); + bool handle_request(Stream &strm, Request &req, Response &res, + bool close_connection, Error &error); + std::unique_ptr send_with_content_provider_and_receiver( + Request &req, const char *body, size_t content_length, + ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + Error &error); + Result send_with_content_provider_and_receiver( + const std::string &method, const std::string &path, + const Headers &headers, const char *body, size_t content_length, + ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + UploadProgress progress); + ContentProviderWithoutLength get_multipart_content_provider( + const std::string &boundary, const UploadFormDataItems &items, + const FormDataProviderItems &provider_items) const; + + virtual bool + process_socket(const Socket &socket, + std::chrono::time_point start_time, + std::function callback); + virtual bool is_ssl() const; +}; + +class Client { +public: + // Universal interface + explicit Client(const std::string &scheme_host_port); + + explicit Client(const std::string &scheme_host_port, + const std::string &client_cert_path, + const std::string &client_key_path); + + // HTTP only interface + explicit Client(const std::string &host, int port); + + explicit Client(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path); + + Client(Client &&) = default; + Client &operator=(Client &&) = default; + + ~Client(); + + bool is_valid() const; + + // clang-format off + Result Get(const std::string &path, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Head(const std::string &path); + Result Head(const std::string &path, const Headers &headers); + + Result Post(const std::string &path); + Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers); + Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Put(const std::string &path); + Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Params ¶ms); + Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers); + Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Patch(const std::string &path); + Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Params ¶ms); + Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers); + Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Delete(const std::string &path, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); + + Result Options(const std::string &path); + Result Options(const std::string &path, const Headers &headers); + // clang-format on + + bool send(Request &req, Response &res, Error &error); + Result send(const Request &req); + + void stop(); + + std::string host() const; + int port() const; + + size_t is_socket_open() const; + socket_t socket() const; + + void set_hostname_addr_map(std::map addr_map); + + void set_default_headers(Headers headers); + + void + set_header_writer(std::function const &writer); + + void set_address_family(int family); + void set_tcp_nodelay(bool on); + void set_socket_options(SocketOptions socket_options); + + void set_connection_timeout(time_t sec, time_t usec = 0); + template + void + set_connection_timeout(const std::chrono::duration &duration); + + void set_read_timeout(time_t sec, time_t usec = 0); + template + void set_read_timeout(const std::chrono::duration &duration); + + void set_write_timeout(time_t sec, time_t usec = 0); + template + void set_write_timeout(const std::chrono::duration &duration); + + void set_max_timeout(time_t msec); + template + void set_max_timeout(const std::chrono::duration &duration); + + void set_basic_auth(const std::string &username, const std::string &password); + void set_bearer_token_auth(const std::string &token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_digest_auth(const std::string &username, + const std::string &password); +#endif + + void set_keep_alive(bool on); + void set_follow_location(bool on); + + void set_path_encode(bool on); + void set_url_encode(bool on); + + void set_compress(bool on); + + void set_decompress(bool on); + + void set_interface(const std::string &intf); + + void set_proxy(const std::string &host, int port); + void set_proxy_basic_auth(const std::string &username, + const std::string &password); + void set_proxy_bearer_token_auth(const std::string &token); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_proxy_digest_auth(const std::string &username, + const std::string &password); +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void enable_server_certificate_verification(bool enabled); + void enable_server_hostname_verification(bool enabled); + void set_server_certificate_verifier( + std::function verifier); +#endif + + void set_logger(Logger logger); + void set_error_logger(ErrorLogger error_logger); + + // SSL +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + void set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path = std::string()); + + void set_ca_cert_store(X509_STORE *ca_cert_store); + void load_ca_cert_store(const char *ca_cert, std::size_t size); + + long get_openssl_verify_result() const; + + SSL_CTX *ssl_context() const; +#endif + +private: + std::unique_ptr cli_; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + bool is_ssl_ = false; +#endif +}; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +class SSLServer : public Server { +public: + SSLServer(const char *cert_path, const char *private_key_path, + const char *client_ca_cert_file_path = nullptr, + const char *client_ca_cert_dir_path = nullptr, + const char *private_key_password = nullptr); + + SSLServer(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store = nullptr); + + SSLServer( + const std::function &setup_ssl_ctx_callback); + + ~SSLServer() override; + + bool is_valid() const override; + + SSL_CTX *ssl_context() const; + + void update_certs(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store = nullptr); + + int ssl_last_error() const { return last_ssl_error_; } + +private: + bool process_and_close_socket(socket_t sock) override; + + STACK_OF(X509_NAME) * extract_ca_names_from_x509_store(X509_STORE *store); + + SSL_CTX *ctx_; + std::mutex ctx_mutex_; + + int last_ssl_error_ = 0; +}; + +class SSLClient final : public ClientImpl { +public: + explicit SSLClient(const std::string &host); + + explicit SSLClient(const std::string &host, int port); + + explicit SSLClient(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path, + const std::string &private_key_password = std::string()); + + explicit SSLClient(const std::string &host, int port, X509 *client_cert, + EVP_PKEY *client_key, + const std::string &private_key_password = std::string()); + + ~SSLClient() override; + + bool is_valid() const override; + + void set_ca_cert_store(X509_STORE *ca_cert_store); + void load_ca_cert_store(const char *ca_cert, std::size_t size); + + long get_openssl_verify_result() const; + + SSL_CTX *ssl_context() const; + +private: + bool create_and_connect_socket(Socket &socket, Error &error) override; + void shutdown_ssl(Socket &socket, bool shutdown_gracefully) override; + void shutdown_ssl_impl(Socket &socket, bool shutdown_gracefully); + + bool + process_socket(const Socket &socket, + std::chrono::time_point start_time, + std::function callback) override; + bool is_ssl() const override; + + bool connect_with_proxy( + Socket &sock, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error); + bool initialize_ssl(Socket &socket, Error &error); + + bool load_certs(); + + bool verify_host(X509 *server_cert) const; + bool verify_host_with_subject_alt_name(X509 *server_cert) const; + bool verify_host_with_common_name(X509 *server_cert) const; + bool check_host_name(const char *pattern, size_t pattern_len) const; + + SSL_CTX *ctx_; + std::mutex ctx_mutex_; + std::once_flag initialize_cert_; + + std::vector host_components_; + + long verify_result_ = 0; + + friend class ClientImpl; +}; +#endif + +/* + * Implementation of template methods. + */ + +namespace detail { + +template +inline void duration_to_sec_and_usec(const T &duration, U callback) { + auto sec = std::chrono::duration_cast(duration).count(); + auto usec = std::chrono::duration_cast( + duration - std::chrono::seconds(sec)) + .count(); + callback(static_cast(sec), static_cast(usec)); +} + +template inline constexpr size_t str_len(const char (&)[N]) { + return N - 1; +} + +inline bool is_numeric(const std::string &str) { + return !str.empty() && + std::all_of(str.cbegin(), str.cend(), + [](unsigned char c) { return std::isdigit(c); }); +} + +inline size_t get_header_value_u64(const Headers &headers, + const std::string &key, size_t def, + size_t id, bool &is_invalid_value) { + is_invalid_value = false; + auto rng = headers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { + if (is_numeric(it->second)) { + return std::strtoull(it->second.data(), nullptr, 10); + } else { + is_invalid_value = true; + } + } + return def; +} + +inline size_t get_header_value_u64(const Headers &headers, + const std::string &key, size_t def, + size_t id) { + auto dummy = false; + return get_header_value_u64(headers, key, def, id, dummy); +} + +} // namespace detail + +inline size_t Request::get_header_value_u64(const std::string &key, size_t def, + size_t id) const { + return detail::get_header_value_u64(headers, key, def, id); +} + +inline size_t Response::get_header_value_u64(const std::string &key, size_t def, + size_t id) const { + return detail::get_header_value_u64(headers, key, def, id); +} + +namespace detail { + +inline bool set_socket_opt_impl(socket_t sock, int level, int optname, + const void *optval, socklen_t optlen) { + return setsockopt(sock, level, optname, +#ifdef _WIN32 + reinterpret_cast(optval), +#else + optval, +#endif + optlen) == 0; +} + +inline bool set_socket_opt(socket_t sock, int level, int optname, int optval) { + return set_socket_opt_impl(sock, level, optname, &optval, sizeof(optval)); +} + +inline bool set_socket_opt_time(socket_t sock, int level, int optname, + time_t sec, time_t usec) { +#ifdef _WIN32 + auto timeout = static_cast(sec * 1000 + usec / 1000); +#else + timeval timeout; + timeout.tv_sec = static_cast(sec); + timeout.tv_usec = static_cast(usec); +#endif + return set_socket_opt_impl(sock, level, optname, &timeout, sizeof(timeout)); +} + +} // namespace detail + +inline void default_socket_options(socket_t sock) { + detail::set_socket_opt(sock, SOL_SOCKET, +#ifdef SO_REUSEPORT + SO_REUSEPORT, +#else + SO_REUSEADDR, +#endif + 1); +} + +inline const char *status_message(int status) { + switch (status) { + case StatusCode::Continue_100: return "Continue"; + case StatusCode::SwitchingProtocol_101: return "Switching Protocol"; + case StatusCode::Processing_102: return "Processing"; + case StatusCode::EarlyHints_103: return "Early Hints"; + case StatusCode::OK_200: return "OK"; + case StatusCode::Created_201: return "Created"; + case StatusCode::Accepted_202: return "Accepted"; + case StatusCode::NonAuthoritativeInformation_203: + return "Non-Authoritative Information"; + case StatusCode::NoContent_204: return "No Content"; + case StatusCode::ResetContent_205: return "Reset Content"; + case StatusCode::PartialContent_206: return "Partial Content"; + case StatusCode::MultiStatus_207: return "Multi-Status"; + case StatusCode::AlreadyReported_208: return "Already Reported"; + case StatusCode::IMUsed_226: return "IM Used"; + case StatusCode::MultipleChoices_300: return "Multiple Choices"; + case StatusCode::MovedPermanently_301: return "Moved Permanently"; + case StatusCode::Found_302: return "Found"; + case StatusCode::SeeOther_303: return "See Other"; + case StatusCode::NotModified_304: return "Not Modified"; + case StatusCode::UseProxy_305: return "Use Proxy"; + case StatusCode::unused_306: return "unused"; + case StatusCode::TemporaryRedirect_307: return "Temporary Redirect"; + case StatusCode::PermanentRedirect_308: return "Permanent Redirect"; + case StatusCode::BadRequest_400: return "Bad Request"; + case StatusCode::Unauthorized_401: return "Unauthorized"; + case StatusCode::PaymentRequired_402: return "Payment Required"; + case StatusCode::Forbidden_403: return "Forbidden"; + case StatusCode::NotFound_404: return "Not Found"; + case StatusCode::MethodNotAllowed_405: return "Method Not Allowed"; + case StatusCode::NotAcceptable_406: return "Not Acceptable"; + case StatusCode::ProxyAuthenticationRequired_407: + return "Proxy Authentication Required"; + case StatusCode::RequestTimeout_408: return "Request Timeout"; + case StatusCode::Conflict_409: return "Conflict"; + case StatusCode::Gone_410: return "Gone"; + case StatusCode::LengthRequired_411: return "Length Required"; + case StatusCode::PreconditionFailed_412: return "Precondition Failed"; + case StatusCode::PayloadTooLarge_413: return "Payload Too Large"; + case StatusCode::UriTooLong_414: return "URI Too Long"; + case StatusCode::UnsupportedMediaType_415: return "Unsupported Media Type"; + case StatusCode::RangeNotSatisfiable_416: return "Range Not Satisfiable"; + case StatusCode::ExpectationFailed_417: return "Expectation Failed"; + case StatusCode::ImATeapot_418: return "I'm a teapot"; + case StatusCode::MisdirectedRequest_421: return "Misdirected Request"; + case StatusCode::UnprocessableContent_422: return "Unprocessable Content"; + case StatusCode::Locked_423: return "Locked"; + case StatusCode::FailedDependency_424: return "Failed Dependency"; + case StatusCode::TooEarly_425: return "Too Early"; + case StatusCode::UpgradeRequired_426: return "Upgrade Required"; + case StatusCode::PreconditionRequired_428: return "Precondition Required"; + case StatusCode::TooManyRequests_429: return "Too Many Requests"; + case StatusCode::RequestHeaderFieldsTooLarge_431: + return "Request Header Fields Too Large"; + case StatusCode::UnavailableForLegalReasons_451: + return "Unavailable For Legal Reasons"; + case StatusCode::NotImplemented_501: return "Not Implemented"; + case StatusCode::BadGateway_502: return "Bad Gateway"; + case StatusCode::ServiceUnavailable_503: return "Service Unavailable"; + case StatusCode::GatewayTimeout_504: return "Gateway Timeout"; + case StatusCode::HttpVersionNotSupported_505: + return "HTTP Version Not Supported"; + case StatusCode::VariantAlsoNegotiates_506: return "Variant Also Negotiates"; + case StatusCode::InsufficientStorage_507: return "Insufficient Storage"; + case StatusCode::LoopDetected_508: return "Loop Detected"; + case StatusCode::NotExtended_510: return "Not Extended"; + case StatusCode::NetworkAuthenticationRequired_511: + return "Network Authentication Required"; + + default: + case StatusCode::InternalServerError_500: return "Internal Server Error"; + } +} + +inline std::string get_bearer_token_auth(const Request &req) { + if (req.has_header("Authorization")) { + constexpr auto bearer_header_prefix_len = detail::str_len("Bearer "); + return req.get_header_value("Authorization") + .substr(bearer_header_prefix_len); + } + return ""; +} + +template +inline Server & +Server::set_read_timeout(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_read_timeout(sec, usec); }); + return *this; +} + +template +inline Server & +Server::set_write_timeout(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_write_timeout(sec, usec); }); + return *this; +} + +template +inline Server & +Server::set_idle_interval(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_idle_interval(sec, usec); }); + return *this; +} + +inline std::string to_string(const Error error) { + switch (error) { + case Error::Success: return "Success (no error)"; + case Error::Unknown: return "Unknown"; + case Error::Connection: return "Could not establish connection"; + case Error::BindIPAddress: return "Failed to bind IP address"; + case Error::Read: return "Failed to read connection"; + case Error::Write: return "Failed to write connection"; + case Error::ExceedRedirectCount: return "Maximum redirect count exceeded"; + case Error::Canceled: return "Connection handling canceled"; + case Error::SSLConnection: return "SSL connection failed"; + case Error::SSLLoadingCerts: return "SSL certificate loading failed"; + case Error::SSLServerVerification: return "SSL server verification failed"; + case Error::SSLServerHostnameVerification: + return "SSL server hostname verification failed"; + case Error::UnsupportedMultipartBoundaryChars: + return "Unsupported HTTP multipart boundary characters"; + case Error::Compression: return "Compression failed"; + case Error::ConnectionTimeout: return "Connection timed out"; + case Error::ProxyConnection: return "Proxy connection failed"; + case Error::ResourceExhaustion: return "Resource exhaustion"; + case Error::TooManyFormDataFiles: return "Too many form data files"; + case Error::ExceedMaxPayloadSize: return "Exceeded maximum payload size"; + case Error::ExceedUriMaxLength: return "Exceeded maximum URI length"; + case Error::ExceedMaxSocketDescriptorCount: + return "Exceeded maximum socket descriptor count"; + case Error::InvalidRequestLine: return "Invalid request line"; + case Error::InvalidHTTPMethod: return "Invalid HTTP method"; + case Error::InvalidHTTPVersion: return "Invalid HTTP version"; + case Error::InvalidHeaders: return "Invalid headers"; + case Error::MultipartParsing: return "Multipart parsing failed"; + case Error::OpenFile: return "Failed to open file"; + case Error::Listen: return "Failed to listen on socket"; + case Error::GetSockName: return "Failed to get socket name"; + case Error::UnsupportedAddressFamily: return "Unsupported address family"; + case Error::HTTPParsing: return "HTTP parsing failed"; + case Error::InvalidRangeHeader: return "Invalid Range header"; + default: break; + } + + return "Invalid"; +} + +inline std::ostream &operator<<(std::ostream &os, const Error &obj) { + os << to_string(obj); + os << " (" << static_cast::type>(obj) << ')'; + return os; +} + +inline size_t Result::get_request_header_value_u64(const std::string &key, + size_t def, + size_t id) const { + return detail::get_header_value_u64(request_headers_, key, def, id); +} + +template +inline void ClientImpl::set_connection_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec(duration, [&](time_t sec, time_t usec) { + set_connection_timeout(sec, usec); + }); +} + +template +inline void ClientImpl::set_read_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_read_timeout(sec, usec); }); +} + +template +inline void ClientImpl::set_write_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_write_timeout(sec, usec); }); +} + +template +inline void ClientImpl::set_max_timeout( + const std::chrono::duration &duration) { + auto msec = + std::chrono::duration_cast(duration).count(); + set_max_timeout(msec); +} + +template +inline void Client::set_connection_timeout( + const std::chrono::duration &duration) { + cli_->set_connection_timeout(duration); +} + +template +inline void +Client::set_read_timeout(const std::chrono::duration &duration) { + cli_->set_read_timeout(duration); +} + +template +inline void +Client::set_write_timeout(const std::chrono::duration &duration) { + cli_->set_write_timeout(duration); +} + +inline void Client::set_max_timeout(time_t msec) { + cli_->set_max_timeout(msec); +} + +template +inline void +Client::set_max_timeout(const std::chrono::duration &duration) { + cli_->set_max_timeout(duration); +} + +/* + * Forward declarations and types that will be part of the .h file if split into + * .h + .cc. + */ + +std::string hosted_at(const std::string &hostname); + +void hosted_at(const std::string &hostname, std::vector &addrs); + +// JavaScript-style URL encoding/decoding functions +std::string encode_uri_component(const std::string &value); +std::string encode_uri(const std::string &value); +std::string decode_uri_component(const std::string &value); +std::string decode_uri(const std::string &value); + +// RFC 3986 compliant URL component encoding/decoding functions +std::string encode_path_component(const std::string &component); +std::string decode_path_component(const std::string &component); +std::string encode_query_component(const std::string &component, + bool space_as_plus = true); +std::string decode_query_component(const std::string &component, + bool plus_as_space = true); + +std::string append_query_params(const std::string &path, const Params ¶ms); + +std::pair make_range_header(const Ranges &ranges); + +std::pair +make_basic_authentication_header(const std::string &username, + const std::string &password, + bool is_proxy = false); + +namespace detail { + +#if defined(_WIN32) +inline std::wstring u8string_to_wstring(const char *s) { + std::wstring ws; + auto len = static_cast(strlen(s)); + auto wlen = ::MultiByteToWideChar(CP_UTF8, 0, s, len, nullptr, 0); + if (wlen > 0) { + ws.resize(wlen); + wlen = ::MultiByteToWideChar( + CP_UTF8, 0, s, len, + const_cast(reinterpret_cast(ws.data())), wlen); + if (wlen != static_cast(ws.size())) { ws.clear(); } + } + return ws; +} +#endif + +struct FileStat { + FileStat(const std::string &path); + bool is_file() const; + bool is_dir() const; + +private: +#if defined(_WIN32) + struct _stat st_; +#else + struct stat st_; +#endif + int ret_ = -1; +}; + +std::string trim_copy(const std::string &s); + +void divide( + const char *data, std::size_t size, char d, + std::function + fn); + +void divide( + const std::string &str, char d, + std::function + fn); + +void split(const char *b, const char *e, char d, + std::function fn); + +void split(const char *b, const char *e, char d, size_t m, + std::function fn); + +bool process_client_socket( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time, + std::function callback); + +socket_t create_client_socket(const std::string &host, const std::string &ip, + int port, int address_family, bool tcp_nodelay, + bool ipv6_v6only, SocketOptions socket_options, + time_t connection_timeout_sec, + time_t connection_timeout_usec, + time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, + time_t write_timeout_usec, + const std::string &intf, Error &error); + +const char *get_header_value(const Headers &headers, const std::string &key, + const char *def, size_t id); + +std::string params_to_query_str(const Params ¶ms); + +void parse_query_text(const char *data, std::size_t size, Params ¶ms); + +void parse_query_text(const std::string &s, Params ¶ms); + +bool parse_multipart_boundary(const std::string &content_type, + std::string &boundary); + +bool parse_range_header(const std::string &s, Ranges &ranges); + +bool parse_accept_header(const std::string &s, + std::vector &content_types); + +int close_socket(socket_t sock); + +ssize_t send_socket(socket_t sock, const void *ptr, size_t size, int flags); + +ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags); + +enum class EncodingType { None = 0, Gzip, Brotli, Zstd }; + +EncodingType encoding_type(const Request &req, const Response &res); + +class BufferStream final : public Stream { +public: + BufferStream() = default; + ~BufferStream() override = default; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + + const std::string &get_buffer() const; + +private: + std::string buffer; + size_t position = 0; +}; + +class compressor { +public: + virtual ~compressor() = default; + + typedef std::function Callback; + virtual bool compress(const char *data, size_t data_length, bool last, + Callback callback) = 0; +}; + +class decompressor { +public: + virtual ~decompressor() = default; + + virtual bool is_valid() const = 0; + + typedef std::function Callback; + virtual bool decompress(const char *data, size_t data_length, + Callback callback) = 0; +}; + +class nocompressor final : public compressor { +public: + ~nocompressor() override = default; + + bool compress(const char *data, size_t data_length, bool /*last*/, + Callback callback) override; +}; + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +class gzip_compressor final : public compressor { +public: + gzip_compressor(); + ~gzip_compressor() override; + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + bool is_valid_ = false; + z_stream strm_; +}; + +class gzip_decompressor final : public decompressor { +public: + gzip_decompressor(); + ~gzip_decompressor() override; + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + bool is_valid_ = false; + z_stream strm_; +}; +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +class brotli_compressor final : public compressor { +public: + brotli_compressor(); + ~brotli_compressor(); + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + BrotliEncoderState *state_ = nullptr; +}; + +class brotli_decompressor final : public decompressor { +public: + brotli_decompressor(); + ~brotli_decompressor(); + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + BrotliDecoderResult decoder_r; + BrotliDecoderState *decoder_s = nullptr; +}; +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT +class zstd_compressor : public compressor { +public: + zstd_compressor(); + ~zstd_compressor(); + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + ZSTD_CCtx *ctx_ = nullptr; +}; + +class zstd_decompressor : public decompressor { +public: + zstd_decompressor(); + ~zstd_decompressor(); + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + ZSTD_DCtx *ctx_ = nullptr; +}; +#endif + +// NOTE: until the read size reaches `fixed_buffer_size`, use `fixed_buffer` +// to store data. The call can set memory on stack for performance. +class stream_line_reader { +public: + stream_line_reader(Stream &strm, char *fixed_buffer, + size_t fixed_buffer_size); + const char *ptr() const; + size_t size() const; + bool end_with_crlf() const; + bool getline(); + +private: + void append(char c); + + Stream &strm_; + char *fixed_buffer_; + const size_t fixed_buffer_size_; + size_t fixed_buffer_used_size_ = 0; + std::string growable_buffer_; +}; + +class mmap { +public: + mmap(const char *path); + ~mmap(); + + bool open(const char *path); + void close(); + + bool is_open() const; + size_t size() const; + const char *data() const; + +private: +#if defined(_WIN32) + HANDLE hFile_ = NULL; + HANDLE hMapping_ = NULL; +#else + int fd_ = -1; +#endif + size_t size_ = 0; + void *addr_ = nullptr; + bool is_open_empty_file = false; +}; + +// NOTE: https://www.rfc-editor.org/rfc/rfc9110#section-5 +namespace fields { + +inline bool is_token_char(char c) { + return std::isalnum(c) || c == '!' || c == '#' || c == '$' || c == '%' || + c == '&' || c == '\'' || c == '*' || c == '+' || c == '-' || + c == '.' || c == '^' || c == '_' || c == '`' || c == '|' || c == '~'; +} + +inline bool is_token(const std::string &s) { + if (s.empty()) { return false; } + for (auto c : s) { + if (!is_token_char(c)) { return false; } + } + return true; +} + +inline bool is_field_name(const std::string &s) { return is_token(s); } + +inline bool is_vchar(char c) { return c >= 33 && c <= 126; } + +inline bool is_obs_text(char c) { return 128 <= static_cast(c); } + +inline bool is_field_vchar(char c) { return is_vchar(c) || is_obs_text(c); } + +inline bool is_field_content(const std::string &s) { + if (s.empty()) { return true; } + + if (s.size() == 1) { + return is_field_vchar(s[0]); + } else if (s.size() == 2) { + return is_field_vchar(s[0]) && is_field_vchar(s[1]); + } else { + size_t i = 0; + + if (!is_field_vchar(s[i])) { return false; } + i++; + + while (i < s.size() - 1) { + auto c = s[i++]; + if (c == ' ' || c == '\t' || is_field_vchar(c)) { + } else { + return false; + } + } + + return is_field_vchar(s[i]); + } +} + +inline bool is_field_value(const std::string &s) { return is_field_content(s); } + +} // namespace fields + +} // namespace detail + +// ---------------------------------------------------------------------------- + +/* + * Implementation that will be part of the .cc file if split into .h + .cc. + */ + +namespace detail { + +inline bool is_hex(char c, int &v) { + if (0x20 <= c && isdigit(c)) { + v = c - '0'; + return true; + } else if ('A' <= c && c <= 'F') { + v = c - 'A' + 10; + return true; + } else if ('a' <= c && c <= 'f') { + v = c - 'a' + 10; + return true; + } + return false; +} + +inline bool from_hex_to_i(const std::string &s, size_t i, size_t cnt, + int &val) { + if (i >= s.size()) { return false; } + + val = 0; + for (; cnt; i++, cnt--) { + if (!s[i]) { return false; } + auto v = 0; + if (is_hex(s[i], v)) { + val = val * 16 + v; + } else { + return false; + } + } + return true; +} + +inline std::string from_i_to_hex(size_t n) { + static const auto charset = "0123456789abcdef"; + std::string ret; + do { + ret = charset[n & 15] + ret; + n >>= 4; + } while (n > 0); + return ret; +} + +inline size_t to_utf8(int code, char *buff) { + if (code < 0x0080) { + buff[0] = static_cast(code & 0x7F); + return 1; + } else if (code < 0x0800) { + buff[0] = static_cast(0xC0 | ((code >> 6) & 0x1F)); + buff[1] = static_cast(0x80 | (code & 0x3F)); + return 2; + } else if (code < 0xD800) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0xE000) { // D800 - DFFF is invalid... + return 0; + } else if (code < 0x10000) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0x110000) { + buff[0] = static_cast(0xF0 | ((code >> 18) & 0x7)); + buff[1] = static_cast(0x80 | ((code >> 12) & 0x3F)); + buff[2] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[3] = static_cast(0x80 | (code & 0x3F)); + return 4; + } + + // NOTREACHED + return 0; +} + +// NOTE: This code came up with the following stackoverflow post: +// https://stackoverflow.com/questions/180947/base64-decode-snippet-in-c +inline std::string base64_encode(const std::string &in) { + static const auto lookup = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + std::string out; + out.reserve(in.size()); + + auto val = 0; + auto valb = -6; + + for (auto c : in) { + val = (val << 8) + static_cast(c); + valb += 8; + while (valb >= 0) { + out.push_back(lookup[(val >> valb) & 0x3F]); + valb -= 6; + } + } + + if (valb > -6) { out.push_back(lookup[((val << 8) >> (valb + 8)) & 0x3F]); } + + while (out.size() % 4) { + out.push_back('='); + } + + return out; +} + +inline bool is_valid_path(const std::string &path) { + size_t level = 0; + size_t i = 0; + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + + while (i < path.size()) { + // Read component + auto beg = i; + while (i < path.size() && path[i] != '/') { + if (path[i] == '\0') { + return false; + } else if (path[i] == '\\') { + return false; + } + i++; + } + + auto len = i - beg; + assert(len > 0); + + if (!path.compare(beg, len, ".")) { + ; + } else if (!path.compare(beg, len, "..")) { + if (level == 0) { return false; } + level--; + } else { + level++; + } + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + } + + return true; +} + +inline FileStat::FileStat(const std::string &path) { +#if defined(_WIN32) + auto wpath = u8string_to_wstring(path.c_str()); + ret_ = _wstat(wpath.c_str(), &st_); +#else + ret_ = stat(path.c_str(), &st_); +#endif +} +inline bool FileStat::is_file() const { + return ret_ >= 0 && S_ISREG(st_.st_mode); +} +inline bool FileStat::is_dir() const { + return ret_ >= 0 && S_ISDIR(st_.st_mode); +} + +inline std::string encode_path(const std::string &s) { + std::string result; + result.reserve(s.size()); + + for (size_t i = 0; s[i]; i++) { + switch (s[i]) { + case ' ': result += "%20"; break; + case '+': result += "%2B"; break; + case '\r': result += "%0D"; break; + case '\n': result += "%0A"; break; + case '\'': result += "%27"; break; + case ',': result += "%2C"; break; + // case ':': result += "%3A"; break; // ok? probably... + case ';': result += "%3B"; break; + default: + auto c = static_cast(s[i]); + if (c >= 0x80) { + result += '%'; + char hex[4]; + auto len = snprintf(hex, sizeof(hex) - 1, "%02X", c); + assert(len == 2); + result.append(hex, static_cast(len)); + } else { + result += s[i]; + } + break; + } + } + + return result; +} + +inline std::string file_extension(const std::string &path) { + std::smatch m; + thread_local auto re = std::regex("\\.([a-zA-Z0-9]+)$"); + if (std::regex_search(path, m, re)) { return m[1].str(); } + return std::string(); +} + +inline bool is_space_or_tab(char c) { return c == ' ' || c == '\t'; } + +inline std::pair trim(const char *b, const char *e, size_t left, + size_t right) { + while (b + left < e && is_space_or_tab(b[left])) { + left++; + } + while (right > 0 && is_space_or_tab(b[right - 1])) { + right--; + } + return std::make_pair(left, right); +} + +inline std::string trim_copy(const std::string &s) { + auto r = trim(s.data(), s.data() + s.size(), 0, s.size()); + return s.substr(r.first, r.second - r.first); +} + +inline std::string trim_double_quotes_copy(const std::string &s) { + if (s.length() >= 2 && s.front() == '"' && s.back() == '"') { + return s.substr(1, s.size() - 2); + } + return s; +} + +inline void +divide(const char *data, std::size_t size, char d, + std::function + fn) { + const auto it = std::find(data, data + size, d); + const auto found = static_cast(it != data + size); + const auto lhs_data = data; + const auto lhs_size = static_cast(it - data); + const auto rhs_data = it + found; + const auto rhs_size = size - lhs_size - found; + + fn(lhs_data, lhs_size, rhs_data, rhs_size); +} + +inline void +divide(const std::string &str, char d, + std::function + fn) { + divide(str.data(), str.size(), d, std::move(fn)); +} + +inline void split(const char *b, const char *e, char d, + std::function fn) { + return split(b, e, d, (std::numeric_limits::max)(), std::move(fn)); +} + +inline void split(const char *b, const char *e, char d, size_t m, + std::function fn) { + size_t i = 0; + size_t beg = 0; + size_t count = 1; + + while (e ? (b + i < e) : (b[i] != '\0')) { + if (b[i] == d && count < m) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + beg = i + 1; + count++; + } + i++; + } + + if (i) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + } +} + +inline stream_line_reader::stream_line_reader(Stream &strm, char *fixed_buffer, + size_t fixed_buffer_size) + : strm_(strm), fixed_buffer_(fixed_buffer), + fixed_buffer_size_(fixed_buffer_size) {} + +inline const char *stream_line_reader::ptr() const { + if (growable_buffer_.empty()) { + return fixed_buffer_; + } else { + return growable_buffer_.data(); + } +} + +inline size_t stream_line_reader::size() const { + if (growable_buffer_.empty()) { + return fixed_buffer_used_size_; + } else { + return growable_buffer_.size(); + } +} + +inline bool stream_line_reader::end_with_crlf() const { + auto end = ptr() + size(); + return size() >= 2 && end[-2] == '\r' && end[-1] == '\n'; +} + +inline bool stream_line_reader::getline() { + fixed_buffer_used_size_ = 0; + growable_buffer_.clear(); + +#ifndef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + char prev_byte = 0; +#endif + + for (size_t i = 0;; i++) { + if (size() >= CPPHTTPLIB_MAX_LINE_LENGTH) { + // Treat exceptionally long lines as an error to + // prevent infinite loops/memory exhaustion + return false; + } + char byte; + auto n = strm_.read(&byte, 1); + + if (n < 0) { + return false; + } else if (n == 0) { + if (i == 0) { + return false; + } else { + break; + } + } + + append(byte); + +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + if (byte == '\n') { break; } +#else + if (prev_byte == '\r' && byte == '\n') { break; } + prev_byte = byte; +#endif + } + + return true; +} + +inline void stream_line_reader::append(char c) { + if (fixed_buffer_used_size_ < fixed_buffer_size_ - 1) { + fixed_buffer_[fixed_buffer_used_size_++] = c; + fixed_buffer_[fixed_buffer_used_size_] = '\0'; + } else { + if (growable_buffer_.empty()) { + assert(fixed_buffer_[fixed_buffer_used_size_] == '\0'); + growable_buffer_.assign(fixed_buffer_, fixed_buffer_used_size_); + } + growable_buffer_ += c; + } +} + +inline mmap::mmap(const char *path) { open(path); } + +inline mmap::~mmap() { close(); } + +inline bool mmap::open(const char *path) { + close(); + +#if defined(_WIN32) + auto wpath = u8string_to_wstring(path); + if (wpath.empty()) { return false; } + + hFile_ = ::CreateFile2(wpath.c_str(), GENERIC_READ, FILE_SHARE_READ, + OPEN_EXISTING, NULL); + + if (hFile_ == INVALID_HANDLE_VALUE) { return false; } + + LARGE_INTEGER size{}; + if (!::GetFileSizeEx(hFile_, &size)) { return false; } + // If the following line doesn't compile due to QuadPart, update Windows SDK. + // See: + // https://github.com/yhirose/cpp-httplib/issues/1903#issuecomment-2316520721 + if (static_cast(size.QuadPart) > + (std::numeric_limits::max)()) { + // `size_t` might be 32-bits, on 32-bits Windows. + return false; + } + size_ = static_cast(size.QuadPart); + + hMapping_ = + ::CreateFileMappingFromApp(hFile_, NULL, PAGE_READONLY, size_, NULL); + + // Special treatment for an empty file... + if (hMapping_ == NULL && size_ == 0) { + close(); + is_open_empty_file = true; + return true; + } + + if (hMapping_ == NULL) { + close(); + return false; + } + + addr_ = ::MapViewOfFileFromApp(hMapping_, FILE_MAP_READ, 0, 0); + + if (addr_ == nullptr) { + close(); + return false; + } +#else + fd_ = ::open(path, O_RDONLY); + if (fd_ == -1) { return false; } + + struct stat sb; + if (fstat(fd_, &sb) == -1) { + close(); + return false; + } + size_ = static_cast(sb.st_size); + + addr_ = ::mmap(NULL, size_, PROT_READ, MAP_PRIVATE, fd_, 0); + + // Special treatment for an empty file... + if (addr_ == MAP_FAILED && size_ == 0) { + close(); + is_open_empty_file = true; + return false; + } +#endif + + return true; +} + +inline bool mmap::is_open() const { + return is_open_empty_file ? true : addr_ != nullptr; +} + +inline size_t mmap::size() const { return size_; } + +inline const char *mmap::data() const { + return is_open_empty_file ? "" : static_cast(addr_); +} + +inline void mmap::close() { +#if defined(_WIN32) + if (addr_) { + ::UnmapViewOfFile(addr_); + addr_ = nullptr; + } + + if (hMapping_) { + ::CloseHandle(hMapping_); + hMapping_ = NULL; + } + + if (hFile_ != INVALID_HANDLE_VALUE) { + ::CloseHandle(hFile_); + hFile_ = INVALID_HANDLE_VALUE; + } + + is_open_empty_file = false; +#else + if (addr_ != nullptr) { + munmap(addr_, size_); + addr_ = nullptr; + } + + if (fd_ != -1) { + ::close(fd_); + fd_ = -1; + } +#endif + size_ = 0; +} +inline int close_socket(socket_t sock) { +#ifdef _WIN32 + return closesocket(sock); +#else + return close(sock); +#endif +} + +template inline ssize_t handle_EINTR(T fn) { + ssize_t res = 0; + while (true) { + res = fn(); + if (res < 0 && errno == EINTR) { + std::this_thread::sleep_for(std::chrono::microseconds{1}); + continue; + } + break; + } + return res; +} + +inline ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags) { + return handle_EINTR([&]() { + return recv(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +inline ssize_t send_socket(socket_t sock, const void *ptr, size_t size, + int flags) { + return handle_EINTR([&]() { + return send(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +inline int poll_wrapper(struct pollfd *fds, nfds_t nfds, int timeout) { +#ifdef _WIN32 + return ::WSAPoll(fds, nfds, timeout); +#else + return ::poll(fds, nfds, timeout); +#endif +} + +template +inline ssize_t select_impl(socket_t sock, time_t sec, time_t usec) { +#ifdef __APPLE__ + if (sock >= FD_SETSIZE) { return -1; } + + fd_set fds, *rfds, *wfds; + FD_ZERO(&fds); + FD_SET(sock, &fds); + rfds = (Read ? &fds : nullptr); + wfds = (Read ? nullptr : &fds); + + timeval tv; + tv.tv_sec = static_cast(sec); + tv.tv_usec = static_cast(usec); + + return handle_EINTR([&]() { + return select(static_cast(sock + 1), rfds, wfds, nullptr, &tv); + }); +#else + struct pollfd pfd; + pfd.fd = sock; + pfd.events = (Read ? POLLIN : POLLOUT); + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + return handle_EINTR([&]() { return poll_wrapper(&pfd, 1, timeout); }); +#endif +} + +inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) { + return select_impl(sock, sec, usec); +} + +inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) { + return select_impl(sock, sec, usec); +} + +inline Error wait_until_socket_is_ready(socket_t sock, time_t sec, + time_t usec) { +#ifdef __APPLE__ + if (sock >= FD_SETSIZE) { return Error::Connection; } + + fd_set fdsr, fdsw; + FD_ZERO(&fdsr); + FD_ZERO(&fdsw); + FD_SET(sock, &fdsr); + FD_SET(sock, &fdsw); + + timeval tv; + tv.tv_sec = static_cast(sec); + tv.tv_usec = static_cast(usec); + + auto ret = handle_EINTR([&]() { + return select(static_cast(sock + 1), &fdsr, &fdsw, nullptr, &tv); + }); + + if (ret == 0) { return Error::ConnectionTimeout; } + + if (ret > 0 && (FD_ISSET(sock, &fdsr) || FD_ISSET(sock, &fdsw))) { + auto error = 0; + socklen_t len = sizeof(error); + auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, + reinterpret_cast(&error), &len); + auto successful = res >= 0 && !error; + return successful ? Error::Success : Error::Connection; + } + + return Error::Connection; +#else + struct pollfd pfd_read; + pfd_read.fd = sock; + pfd_read.events = POLLIN | POLLOUT; + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + auto poll_res = + handle_EINTR([&]() { return poll_wrapper(&pfd_read, 1, timeout); }); + + if (poll_res == 0) { return Error::ConnectionTimeout; } + + if (poll_res > 0 && pfd_read.revents & (POLLIN | POLLOUT)) { + auto error = 0; + socklen_t len = sizeof(error); + auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, + reinterpret_cast(&error), &len); + auto successful = res >= 0 && !error; + return successful ? Error::Success : Error::Connection; + } + + return Error::Connection; +#endif +} + +inline bool is_socket_alive(socket_t sock) { + const auto val = detail::select_read(sock, 0, 0); + if (val == 0) { + return true; + } else if (val < 0 && errno == EBADF) { + return false; + } + char buf[1]; + return detail::read_socket(sock, &buf[0], sizeof(buf), MSG_PEEK) > 0; +} + +class SocketStream final : public Stream { +public: + SocketStream(socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec = 0, + std::chrono::time_point start_time = + (std::chrono::steady_clock::time_point::min)()); + ~SocketStream() override; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + +private: + socket_t sock_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; + time_t max_timeout_msec_; + const std::chrono::time_point start_time_; + + std::vector read_buff_; + size_t read_buff_off_ = 0; + size_t read_buff_content_size_ = 0; + + static const size_t read_buff_size_ = 1024l * 4; +}; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +class SSLSocketStream final : public Stream { +public: + SSLSocketStream( + socket_t sock, SSL *ssl, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, time_t max_timeout_msec = 0, + std::chrono::time_point start_time = + (std::chrono::steady_clock::time_point::min)()); + ~SSLSocketStream() override; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + +private: + socket_t sock_; + SSL *ssl_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; + time_t max_timeout_msec_; + const std::chrono::time_point start_time_; +}; +#endif + +inline bool keep_alive(const std::atomic &svr_sock, socket_t sock, + time_t keep_alive_timeout_sec) { + using namespace std::chrono; + + const auto interval_usec = + CPPHTTPLIB_KEEPALIVE_TIMEOUT_CHECK_INTERVAL_USECOND; + + // Avoid expensive `steady_clock::now()` call for the first time + if (select_read(sock, 0, interval_usec) > 0) { return true; } + + const auto start = steady_clock::now() - microseconds{interval_usec}; + const auto timeout = seconds{keep_alive_timeout_sec}; + + while (true) { + if (svr_sock == INVALID_SOCKET) { + break; // Server socket is closed + } + + auto val = select_read(sock, 0, interval_usec); + if (val < 0) { + break; // Ssocket error + } else if (val == 0) { + if (steady_clock::now() - start > timeout) { + break; // Timeout + } + } else { + return true; // Ready for read + } + } + + return false; +} + +template +inline bool +process_server_socket_core(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, T callback) { + assert(keep_alive_max_count > 0); + auto ret = false; + auto count = keep_alive_max_count; + while (count > 0 && keep_alive(svr_sock, sock, keep_alive_timeout_sec)) { + auto close_connection = count == 1; + auto connection_closed = false; + ret = callback(close_connection, connection_closed); + if (!ret || connection_closed) { break; } + count--; + } + return ret; +} + +template +inline bool +process_server_socket(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +inline bool process_client_socket( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time, + std::function callback) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec, max_timeout_msec, + start_time); + return callback(strm); +} + +inline int shutdown_socket(socket_t sock) { +#ifdef _WIN32 + return shutdown(sock, SD_BOTH); +#else + return shutdown(sock, SHUT_RDWR); +#endif +} + +inline std::string escape_abstract_namespace_unix_domain(const std::string &s) { + if (s.size() > 1 && s[0] == '\0') { + auto ret = s; + ret[0] = '@'; + return ret; + } + return s; +} + +inline std::string +unescape_abstract_namespace_unix_domain(const std::string &s) { + if (s.size() > 1 && s[0] == '@') { + auto ret = s; + ret[0] = '\0'; + return ret; + } + return s; +} + +inline int getaddrinfo_with_timeout(const char *node, const char *service, + const struct addrinfo *hints, + struct addrinfo **res, time_t timeout_sec) { +#ifdef CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO + if (timeout_sec <= 0) { + // No timeout specified, use standard getaddrinfo + return getaddrinfo(node, service, hints, res); + } + +#ifdef _WIN32 + // Windows-specific implementation using GetAddrInfoEx with overlapped I/O + OVERLAPPED overlapped = {0}; + HANDLE event = CreateEventW(nullptr, TRUE, FALSE, nullptr); + if (!event) { return EAI_FAIL; } + + overlapped.hEvent = event; + + PADDRINFOEXW result_addrinfo = nullptr; + HANDLE cancel_handle = nullptr; + + ADDRINFOEXW hints_ex = {0}; + if (hints) { + hints_ex.ai_flags = hints->ai_flags; + hints_ex.ai_family = hints->ai_family; + hints_ex.ai_socktype = hints->ai_socktype; + hints_ex.ai_protocol = hints->ai_protocol; + } + + auto wnode = u8string_to_wstring(node); + auto wservice = u8string_to_wstring(service); + + auto ret = ::GetAddrInfoExW(wnode.data(), wservice.data(), NS_DNS, nullptr, + hints ? &hints_ex : nullptr, &result_addrinfo, + nullptr, &overlapped, nullptr, &cancel_handle); + + if (ret == WSA_IO_PENDING) { + auto wait_result = + ::WaitForSingleObject(event, static_cast(timeout_sec * 1000)); + if (wait_result == WAIT_TIMEOUT) { + if (cancel_handle) { ::GetAddrInfoExCancel(&cancel_handle); } + ::CloseHandle(event); + return EAI_AGAIN; + } + + DWORD bytes_returned; + if (!::GetOverlappedResult((HANDLE)INVALID_SOCKET, &overlapped, + &bytes_returned, FALSE)) { + ::CloseHandle(event); + return ::WSAGetLastError(); + } + } + + ::CloseHandle(event); + + if (ret == NO_ERROR || ret == WSA_IO_PENDING) { + *res = reinterpret_cast(result_addrinfo); + return 0; + } + + return ret; +#elif TARGET_OS_MAC + // macOS implementation using CFHost API for asynchronous DNS resolution + CFStringRef hostname_ref = CFStringCreateWithCString( + kCFAllocatorDefault, node, kCFStringEncodingUTF8); + if (!hostname_ref) { return EAI_MEMORY; } + + CFHostRef host_ref = CFHostCreateWithName(kCFAllocatorDefault, hostname_ref); + CFRelease(hostname_ref); + if (!host_ref) { return EAI_MEMORY; } + + // Set up context for callback + struct CFHostContext { + bool completed = false; + bool success = false; + CFArrayRef addresses = nullptr; + std::mutex mutex; + std::condition_variable cv; + } context; + + CFHostClientContext client_context; + memset(&client_context, 0, sizeof(client_context)); + client_context.info = &context; + + // Set callback + auto callback = [](CFHostRef theHost, CFHostInfoType /*typeInfo*/, + const CFStreamError *error, void *info) { + auto ctx = static_cast(info); + std::lock_guard lock(ctx->mutex); + + if (error && error->error != 0) { + ctx->success = false; + } else { + Boolean hasBeenResolved; + ctx->addresses = CFHostGetAddressing(theHost, &hasBeenResolved); + if (ctx->addresses && hasBeenResolved) { + CFRetain(ctx->addresses); + ctx->success = true; + } else { + ctx->success = false; + } + } + ctx->completed = true; + ctx->cv.notify_one(); + }; + + if (!CFHostSetClient(host_ref, callback, &client_context)) { + CFRelease(host_ref); + return EAI_SYSTEM; + } + + // Schedule on run loop + CFRunLoopRef run_loop = CFRunLoopGetCurrent(); + CFHostScheduleWithRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + + // Start resolution + CFStreamError stream_error; + if (!CFHostStartInfoResolution(host_ref, kCFHostAddresses, &stream_error)) { + CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + CFRelease(host_ref); + return EAI_FAIL; + } + + // Wait for completion with timeout + auto timeout_time = + std::chrono::steady_clock::now() + std::chrono::seconds(timeout_sec); + bool timed_out = false; + + { + std::unique_lock lock(context.mutex); + + while (!context.completed) { + auto now = std::chrono::steady_clock::now(); + if (now >= timeout_time) { + timed_out = true; + break; + } + + // Run the runloop for a short time + lock.unlock(); + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, true); + lock.lock(); + } + } + + // Clean up + CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + CFHostSetClient(host_ref, nullptr, nullptr); + + if (timed_out || !context.completed) { + CFHostCancelInfoResolution(host_ref, kCFHostAddresses); + CFRelease(host_ref); + return EAI_AGAIN; + } + + if (!context.success || !context.addresses) { + CFRelease(host_ref); + return EAI_NODATA; + } + + // Convert CFArray to addrinfo + CFIndex count = CFArrayGetCount(context.addresses); + if (count == 0) { + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_NODATA; + } + + struct addrinfo *result_addrinfo = nullptr; + struct addrinfo **current = &result_addrinfo; + + for (CFIndex i = 0; i < count; i++) { + CFDataRef addr_data = + static_cast(CFArrayGetValueAtIndex(context.addresses, i)); + if (!addr_data) continue; + + const struct sockaddr *sockaddr_ptr = + reinterpret_cast(CFDataGetBytePtr(addr_data)); + socklen_t sockaddr_len = static_cast(CFDataGetLength(addr_data)); + + // Allocate addrinfo structure + *current = static_cast(malloc(sizeof(struct addrinfo))); + if (!*current) { + freeaddrinfo(result_addrinfo); + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_MEMORY; + } + + memset(*current, 0, sizeof(struct addrinfo)); + + // Set up addrinfo fields + (*current)->ai_family = sockaddr_ptr->sa_family; + (*current)->ai_socktype = hints ? hints->ai_socktype : SOCK_STREAM; + (*current)->ai_protocol = hints ? hints->ai_protocol : IPPROTO_TCP; + (*current)->ai_addrlen = sockaddr_len; + + // Copy sockaddr + (*current)->ai_addr = static_cast(malloc(sockaddr_len)); + if (!(*current)->ai_addr) { + freeaddrinfo(result_addrinfo); + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_MEMORY; + } + memcpy((*current)->ai_addr, sockaddr_ptr, sockaddr_len); + + // Set port if service is specified + if (service && strlen(service) > 0) { + int port = atoi(service); + if (port > 0) { + if (sockaddr_ptr->sa_family == AF_INET) { + reinterpret_cast((*current)->ai_addr) + ->sin_port = htons(static_cast(port)); + } else if (sockaddr_ptr->sa_family == AF_INET6) { + reinterpret_cast((*current)->ai_addr) + ->sin6_port = htons(static_cast(port)); + } + } + } + + current = &((*current)->ai_next); + } + + CFRelease(context.addresses); + CFRelease(host_ref); + + *res = result_addrinfo; + return 0; +#elif defined(_GNU_SOURCE) && defined(__GLIBC__) && \ + (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) + // Linux implementation using getaddrinfo_a for asynchronous DNS resolution + struct gaicb request; + struct gaicb *requests[1] = {&request}; + struct sigevent sevp; + struct timespec timeout; + + // Initialize the request structure + memset(&request, 0, sizeof(request)); + request.ar_name = node; + request.ar_service = service; + request.ar_request = hints; + + // Set up timeout + timeout.tv_sec = timeout_sec; + timeout.tv_nsec = 0; + + // Initialize sigevent structure (not used, but required) + memset(&sevp, 0, sizeof(sevp)); + sevp.sigev_notify = SIGEV_NONE; + + // Start asynchronous resolution + int start_result = getaddrinfo_a(GAI_NOWAIT, requests, 1, &sevp); + if (start_result != 0) { return start_result; } + + // Wait for completion with timeout + int wait_result = + gai_suspend((const struct gaicb *const *)requests, 1, &timeout); + + if (wait_result == 0 || wait_result == EAI_ALLDONE) { + // Completed successfully, get the result + int gai_result = gai_error(&request); + if (gai_result == 0) { + *res = request.ar_result; + return 0; + } else { + // Clean up on error + if (request.ar_result) { freeaddrinfo(request.ar_result); } + return gai_result; + } + } else if (wait_result == EAI_AGAIN) { + // Timeout occurred, cancel the request + gai_cancel(&request); + return EAI_AGAIN; + } else { + // Other error occurred + gai_cancel(&request); + return wait_result; + } +#else + // Fallback implementation using thread-based timeout for other Unix systems + + struct GetAddrInfoState { + ~GetAddrInfoState() { + if (info) { freeaddrinfo(info); } + } + + std::mutex mutex; + std::condition_variable result_cv; + bool completed = false; + int result = EAI_SYSTEM; + std::string node; + std::string service; + struct addrinfo hints; + struct addrinfo *info = nullptr; + }; + + // Allocate on the heap, so the resolver thread can keep using the data. + auto state = std::make_shared(); + state->node = node; + state->service = service; + state->hints = *hints; + + std::thread resolve_thread([state]() { + auto thread_result = + getaddrinfo(state->node.c_str(), state->service.c_str(), &state->hints, + &state->info); + + std::lock_guard lock(state->mutex); + state->result = thread_result; + state->completed = true; + state->result_cv.notify_one(); + }); + + // Wait for completion or timeout + std::unique_lock lock(state->mutex); + auto finished = + state->result_cv.wait_for(lock, std::chrono::seconds(timeout_sec), + [&] { return state->completed; }); + + if (finished) { + // Operation completed within timeout + resolve_thread.join(); + *res = state->info; + state->info = nullptr; // Pass ownership to caller + return state->result; + } else { + // Timeout occurred + resolve_thread.detach(); // Let the thread finish in background + return EAI_AGAIN; // Return timeout error + } +#endif +#else + (void)(timeout_sec); // Unused parameter for non-blocking getaddrinfo + return getaddrinfo(node, service, hints, res); +#endif +} + +template +socket_t create_socket(const std::string &host, const std::string &ip, int port, + int address_family, int socket_flags, bool tcp_nodelay, + bool ipv6_v6only, SocketOptions socket_options, + BindOrConnect bind_or_connect, time_t timeout_sec = 0) { + // Get address info + const char *node = nullptr; + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_IP; + + if (!ip.empty()) { + node = ip.c_str(); + // Ask getaddrinfo to convert IP in c-string to address + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_NUMERICHOST; + } else { + if (!host.empty()) { node = host.c_str(); } + hints.ai_family = address_family; + hints.ai_flags = socket_flags; + } + +#if !defined(_WIN32) || defined(CPPHTTPLIB_HAVE_AFUNIX_H) + if (hints.ai_family == AF_UNIX) { + const auto addrlen = host.length(); + if (addrlen > sizeof(sockaddr_un::sun_path)) { return INVALID_SOCKET; } + +#ifdef SOCK_CLOEXEC + auto sock = socket(hints.ai_family, hints.ai_socktype | SOCK_CLOEXEC, + hints.ai_protocol); +#else + auto sock = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol); +#endif + + if (sock != INVALID_SOCKET) { + sockaddr_un addr{}; + addr.sun_family = AF_UNIX; + + auto unescaped_host = unescape_abstract_namespace_unix_domain(host); + std::copy(unescaped_host.begin(), unescaped_host.end(), addr.sun_path); + + hints.ai_addr = reinterpret_cast(&addr); + hints.ai_addrlen = static_cast( + sizeof(addr) - sizeof(addr.sun_path) + addrlen); + +#ifndef SOCK_CLOEXEC +#ifndef _WIN32 + fcntl(sock, F_SETFD, FD_CLOEXEC); +#endif +#endif + + if (socket_options) { socket_options(sock); } + +#ifdef _WIN32 + // Setting SO_REUSEADDR seems not to work well with AF_UNIX on windows, so + // remove the option. + detail::set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 0); +#endif + + bool dummy; + if (!bind_or_connect(sock, hints, dummy)) { + close_socket(sock); + sock = INVALID_SOCKET; + } + } + return sock; + } +#endif + + auto service = std::to_string(port); + + if (getaddrinfo_with_timeout(node, service.c_str(), &hints, &result, + timeout_sec)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return INVALID_SOCKET; + } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + for (auto rp = result; rp; rp = rp->ai_next) { + // Create a socket +#ifdef _WIN32 + auto sock = + WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, nullptr, 0, + WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); + /** + * Since the WSA_FLAG_NO_HANDLE_INHERIT is only supported on Windows 7 SP1 + * and above the socket creation fails on older Windows Systems. + * + * Let's try to create a socket the old way in this case. + * + * Reference: + * https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa + * + * WSA_FLAG_NO_HANDLE_INHERIT: + * This flag is supported on Windows 7 with SP1, Windows Server 2008 R2 with + * SP1, and later + * + */ + if (sock == INVALID_SOCKET) { + sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + } +#else + +#ifdef SOCK_CLOEXEC + auto sock = + socket(rp->ai_family, rp->ai_socktype | SOCK_CLOEXEC, rp->ai_protocol); +#else + auto sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); +#endif + +#endif + if (sock == INVALID_SOCKET) { continue; } + +#if !defined _WIN32 && !defined SOCK_CLOEXEC + if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) { + close_socket(sock); + continue; + } +#endif + + if (tcp_nodelay) { set_socket_opt(sock, IPPROTO_TCP, TCP_NODELAY, 1); } + + if (rp->ai_family == AF_INET6) { + set_socket_opt(sock, IPPROTO_IPV6, IPV6_V6ONLY, ipv6_v6only ? 1 : 0); + } + + if (socket_options) { socket_options(sock); } + + // bind or connect + auto quit = false; + if (bind_or_connect(sock, *rp, quit)) { return sock; } + + close_socket(sock); + + if (quit) { break; } + } + + return INVALID_SOCKET; +} + +inline void set_nonblocking(socket_t sock, bool nonblocking) { +#ifdef _WIN32 + auto flags = nonblocking ? 1UL : 0UL; + ioctlsocket(sock, FIONBIO, &flags); +#else + auto flags = fcntl(sock, F_GETFL, 0); + fcntl(sock, F_SETFL, + nonblocking ? (flags | O_NONBLOCK) : (flags & (~O_NONBLOCK))); +#endif +} + +inline bool is_connection_error() { +#ifdef _WIN32 + return WSAGetLastError() != WSAEWOULDBLOCK; +#else + return errno != EINPROGRESS; +#endif +} + +inline bool bind_ip_address(socket_t sock, const std::string &host) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (getaddrinfo_with_timeout(host.c_str(), "0", &hints, &result, 0)) { + return false; + } + + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + auto ret = false; + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &ai = *rp; + if (!::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + ret = true; + break; + } + } + + return ret; +} + +#if !defined _WIN32 && !defined ANDROID && !defined _AIX && !defined __MVS__ +#define USE_IF2IP +#endif + +#ifdef USE_IF2IP +inline std::string if2ip(int address_family, const std::string &ifn) { + struct ifaddrs *ifap; + getifaddrs(&ifap); + auto se = detail::scope_exit([&] { freeifaddrs(ifap); }); + + std::string addr_candidate; + for (auto ifa = ifap; ifa; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && ifn == ifa->ifa_name && + (AF_UNSPEC == address_family || + ifa->ifa_addr->sa_family == address_family)) { + if (ifa->ifa_addr->sa_family == AF_INET) { + auto sa = reinterpret_cast(ifa->ifa_addr); + char buf[INET_ADDRSTRLEN]; + if (inet_ntop(AF_INET, &sa->sin_addr, buf, INET_ADDRSTRLEN)) { + return std::string(buf, INET_ADDRSTRLEN); + } + } else if (ifa->ifa_addr->sa_family == AF_INET6) { + auto sa = reinterpret_cast(ifa->ifa_addr); + if (!IN6_IS_ADDR_LINKLOCAL(&sa->sin6_addr)) { + char buf[INET6_ADDRSTRLEN] = {}; + if (inet_ntop(AF_INET6, &sa->sin6_addr, buf, INET6_ADDRSTRLEN)) { + // equivalent to mac's IN6_IS_ADDR_UNIQUE_LOCAL + auto s6_addr_head = sa->sin6_addr.s6_addr[0]; + if (s6_addr_head == 0xfc || s6_addr_head == 0xfd) { + addr_candidate = std::string(buf, INET6_ADDRSTRLEN); + } else { + return std::string(buf, INET6_ADDRSTRLEN); + } + } + } + } + } + } + return addr_candidate; +} +#endif + +inline socket_t create_client_socket( + const std::string &host, const std::string &ip, int port, + int address_family, bool tcp_nodelay, bool ipv6_v6only, + SocketOptions socket_options, time_t connection_timeout_sec, + time_t connection_timeout_usec, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, const std::string &intf, Error &error) { + auto sock = create_socket( + host, ip, port, address_family, 0, tcp_nodelay, ipv6_v6only, + std::move(socket_options), + [&](socket_t sock2, struct addrinfo &ai, bool &quit) -> bool { + if (!intf.empty()) { +#ifdef USE_IF2IP + auto ip_from_if = if2ip(address_family, intf); + if (ip_from_if.empty()) { ip_from_if = intf; } + if (!bind_ip_address(sock2, ip_from_if)) { + error = Error::BindIPAddress; + return false; + } +#endif + } + + set_nonblocking(sock2, true); + + auto ret = + ::connect(sock2, ai.ai_addr, static_cast(ai.ai_addrlen)); + + if (ret < 0) { + if (is_connection_error()) { + error = Error::Connection; + return false; + } + error = wait_until_socket_is_ready(sock2, connection_timeout_sec, + connection_timeout_usec); + if (error != Error::Success) { + if (error == Error::ConnectionTimeout) { quit = true; } + return false; + } + } + + set_nonblocking(sock2, false); + set_socket_opt_time(sock2, SOL_SOCKET, SO_RCVTIMEO, read_timeout_sec, + read_timeout_usec); + set_socket_opt_time(sock2, SOL_SOCKET, SO_SNDTIMEO, write_timeout_sec, + write_timeout_usec); + + error = Error::Success; + return true; + }, + connection_timeout_sec); // Pass DNS timeout + + if (sock != INVALID_SOCKET) { + error = Error::Success; + } else { + if (error == Error::Success) { error = Error::Connection; } + } + + return sock; +} + +inline bool get_ip_and_port(const struct sockaddr_storage &addr, + socklen_t addr_len, std::string &ip, int &port) { + if (addr.ss_family == AF_INET) { + port = ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + port = + ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + return false; + } + + std::array ipstr{}; + if (getnameinfo(reinterpret_cast(&addr), addr_len, + ipstr.data(), static_cast(ipstr.size()), nullptr, + 0, NI_NUMERICHOST)) { + return false; + } + + ip = ipstr.data(); + return true; +} + +inline void get_local_ip_and_port(socket_t sock, std::string &ip, int &port) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + if (!getsockname(sock, reinterpret_cast(&addr), + &addr_len)) { + get_ip_and_port(addr, addr_len, ip, port); + } +} + +inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + + if (!getpeername(sock, reinterpret_cast(&addr), + &addr_len)) { +#ifndef _WIN32 + if (addr.ss_family == AF_UNIX) { +#if defined(__linux__) + struct ucred ucred; + socklen_t len = sizeof(ucred); + if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) { + port = ucred.pid; + } +#elif defined(SOL_LOCAL) && defined(SO_PEERPID) + pid_t pid; + socklen_t len = sizeof(pid); + if (getsockopt(sock, SOL_LOCAL, SO_PEERPID, &pid, &len) == 0) { + port = pid; + } +#endif + return; + } +#endif + get_ip_and_port(addr, addr_len, ip, port); + } +} + +inline constexpr unsigned int str2tag_core(const char *s, size_t l, + unsigned int h) { + return (l == 0) + ? h + : str2tag_core( + s + 1, l - 1, + // Unsets the 6 high bits of h, therefore no overflow happens + (((std::numeric_limits::max)() >> 6) & + h * 33) ^ + static_cast(*s)); +} + +inline unsigned int str2tag(const std::string &s) { + return str2tag_core(s.data(), s.size(), 0); +} + +namespace udl { + +inline constexpr unsigned int operator""_t(const char *s, size_t l) { + return str2tag_core(s, l, 0); +} + +} // namespace udl + +inline std::string +find_content_type(const std::string &path, + const std::map &user_data, + const std::string &default_content_type) { + auto ext = file_extension(path); + + auto it = user_data.find(ext); + if (it != user_data.end()) { return it->second; } + + using udl::operator""_t; + + switch (str2tag(ext)) { + default: return default_content_type; + + case "css"_t: return "text/css"; + case "csv"_t: return "text/csv"; + case "htm"_t: + case "html"_t: return "text/html"; + case "js"_t: + case "mjs"_t: return "text/javascript"; + case "txt"_t: return "text/plain"; + case "vtt"_t: return "text/vtt"; + + case "apng"_t: return "image/apng"; + case "avif"_t: return "image/avif"; + case "bmp"_t: return "image/bmp"; + case "gif"_t: return "image/gif"; + case "png"_t: return "image/png"; + case "svg"_t: return "image/svg+xml"; + case "webp"_t: return "image/webp"; + case "ico"_t: return "image/x-icon"; + case "tif"_t: return "image/tiff"; + case "tiff"_t: return "image/tiff"; + case "jpg"_t: + case "jpeg"_t: return "image/jpeg"; + + case "mp4"_t: return "video/mp4"; + case "mpeg"_t: return "video/mpeg"; + case "webm"_t: return "video/webm"; + + case "mp3"_t: return "audio/mp3"; + case "mpga"_t: return "audio/mpeg"; + case "weba"_t: return "audio/webm"; + case "wav"_t: return "audio/wave"; + + case "otf"_t: return "font/otf"; + case "ttf"_t: return "font/ttf"; + case "woff"_t: return "font/woff"; + case "woff2"_t: return "font/woff2"; + + case "7z"_t: return "application/x-7z-compressed"; + case "atom"_t: return "application/atom+xml"; + case "pdf"_t: return "application/pdf"; + case "json"_t: return "application/json"; + case "rss"_t: return "application/rss+xml"; + case "tar"_t: return "application/x-tar"; + case "xht"_t: + case "xhtml"_t: return "application/xhtml+xml"; + case "xslt"_t: return "application/xslt+xml"; + case "xml"_t: return "application/xml"; + case "gz"_t: return "application/gzip"; + case "zip"_t: return "application/zip"; + case "wasm"_t: return "application/wasm"; + } +} + +inline bool can_compress_content_type(const std::string &content_type) { + using udl::operator""_t; + + auto tag = str2tag(content_type); + + switch (tag) { + case "image/svg+xml"_t: + case "application/javascript"_t: + case "application/json"_t: + case "application/xml"_t: + case "application/protobuf"_t: + case "application/xhtml+xml"_t: return true; + + case "text/event-stream"_t: return false; + + default: return !content_type.rfind("text/", 0); + } +} + +inline EncodingType encoding_type(const Request &req, const Response &res) { + auto ret = + detail::can_compress_content_type(res.get_header_value("Content-Type")); + if (!ret) { return EncodingType::None; } + + const auto &s = req.get_header_value("Accept-Encoding"); + (void)(s); + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + // TODO: 'Accept-Encoding' has br, not br;q=0 + ret = s.find("br") != std::string::npos; + if (ret) { return EncodingType::Brotli; } +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + // TODO: 'Accept-Encoding' has gzip, not gzip;q=0 + ret = s.find("gzip") != std::string::npos; + if (ret) { return EncodingType::Gzip; } +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + // TODO: 'Accept-Encoding' has zstd, not zstd;q=0 + ret = s.find("zstd") != std::string::npos; + if (ret) { return EncodingType::Zstd; } +#endif + + return EncodingType::None; +} + +inline bool nocompressor::compress(const char *data, size_t data_length, + bool /*last*/, Callback callback) { + if (!data_length) { return true; } + return callback(data, data_length); +} + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +inline gzip_compressor::gzip_compressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + is_valid_ = deflateInit2(&strm_, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, + Z_DEFAULT_STRATEGY) == Z_OK; +} + +inline gzip_compressor::~gzip_compressor() { deflateEnd(&strm_); } + +inline bool gzip_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + assert(is_valid_); + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + auto flush = (last && data_length == 0) ? Z_FINISH : Z_NO_FLUSH; + auto ret = Z_OK; + + std::array buff{}; + do { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + ret = deflate(&strm_, flush); + if (ret == Z_STREAM_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } while (strm_.avail_out == 0); + + assert((flush == Z_FINISH && ret == Z_STREAM_END) || + (flush == Z_NO_FLUSH && ret == Z_OK)); + assert(strm_.avail_in == 0); + } while (data_length > 0); + + return true; +} + +inline gzip_decompressor::gzip_decompressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + // 15 is the value of wbits, which should be at the maximum possible value + // to ensure that any gzip stream can be decoded. The offset of 32 specifies + // that the stream type should be automatically detected either gzip or + // deflate. + is_valid_ = inflateInit2(&strm_, 32 + 15) == Z_OK; +} + +inline gzip_decompressor::~gzip_decompressor() { inflateEnd(&strm_); } + +inline bool gzip_decompressor::is_valid() const { return is_valid_; } + +inline bool gzip_decompressor::decompress(const char *data, size_t data_length, + Callback callback) { + assert(is_valid_); + + auto ret = Z_OK; + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + std::array buff{}; + while (strm_.avail_in > 0 && ret == Z_OK) { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + ret = inflate(&strm_, Z_NO_FLUSH); + + assert(ret != Z_STREAM_ERROR); + switch (ret) { + case Z_NEED_DICT: + case Z_DATA_ERROR: + case Z_MEM_ERROR: inflateEnd(&strm_); return false; + } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } + + if (ret != Z_OK && ret != Z_STREAM_END) { return false; } + + } while (data_length > 0); + + return true; +} +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +inline brotli_compressor::brotli_compressor() { + state_ = BrotliEncoderCreateInstance(nullptr, nullptr, nullptr); +} + +inline brotli_compressor::~brotli_compressor() { + BrotliEncoderDestroyInstance(state_); +} + +inline bool brotli_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + std::array buff{}; + + auto operation = last ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS; + auto available_in = data_length; + auto next_in = reinterpret_cast(data); + + for (;;) { + if (last) { + if (BrotliEncoderIsFinished(state_)) { break; } + } else { + if (!available_in) { break; } + } + + auto available_out = buff.size(); + auto next_out = buff.data(); + + if (!BrotliEncoderCompressStream(state_, operation, &available_in, &next_in, + &available_out, &next_out, nullptr)) { + return false; + } + + auto output_bytes = buff.size() - available_out; + if (output_bytes) { + callback(reinterpret_cast(buff.data()), output_bytes); + } + } + + return true; +} + +inline brotli_decompressor::brotli_decompressor() { + decoder_s = BrotliDecoderCreateInstance(0, 0, 0); + decoder_r = decoder_s ? BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT + : BROTLI_DECODER_RESULT_ERROR; +} + +inline brotli_decompressor::~brotli_decompressor() { + if (decoder_s) { BrotliDecoderDestroyInstance(decoder_s); } +} + +inline bool brotli_decompressor::is_valid() const { return decoder_s; } + +inline bool brotli_decompressor::decompress(const char *data, + size_t data_length, + Callback callback) { + if (decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_ERROR) { + return 0; + } + + auto next_in = reinterpret_cast(data); + size_t avail_in = data_length; + size_t total_out; + + decoder_r = BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT; + + std::array buff{}; + while (decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) { + char *next_out = buff.data(); + size_t avail_out = buff.size(); + + decoder_r = BrotliDecoderDecompressStream( + decoder_s, &avail_in, &next_in, &avail_out, + reinterpret_cast(&next_out), &total_out); + + if (decoder_r == BROTLI_DECODER_RESULT_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - avail_out)) { return false; } + } + + return decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; +} +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT +inline zstd_compressor::zstd_compressor() { + ctx_ = ZSTD_createCCtx(); + ZSTD_CCtx_setParameter(ctx_, ZSTD_c_compressionLevel, ZSTD_fast); +} + +inline zstd_compressor::~zstd_compressor() { ZSTD_freeCCtx(ctx_); } + +inline bool zstd_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + std::array buff{}; + + ZSTD_EndDirective mode = last ? ZSTD_e_end : ZSTD_e_continue; + ZSTD_inBuffer input = {data, data_length, 0}; + + bool finished; + do { + ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; + size_t const remaining = ZSTD_compressStream2(ctx_, &output, &input, mode); + + if (ZSTD_isError(remaining)) { return false; } + + if (!callback(buff.data(), output.pos)) { return false; } + + finished = last ? (remaining == 0) : (input.pos == input.size); + + } while (!finished); + + return true; +} + +inline zstd_decompressor::zstd_decompressor() { ctx_ = ZSTD_createDCtx(); } + +inline zstd_decompressor::~zstd_decompressor() { ZSTD_freeDCtx(ctx_); } + +inline bool zstd_decompressor::is_valid() const { return ctx_ != nullptr; } + +inline bool zstd_decompressor::decompress(const char *data, size_t data_length, + Callback callback) { + std::array buff{}; + ZSTD_inBuffer input = {data, data_length, 0}; + + while (input.pos < input.size) { + ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; + size_t const remaining = ZSTD_decompressStream(ctx_, &output, &input); + + if (ZSTD_isError(remaining)) { return false; } + + if (!callback(buff.data(), output.pos)) { return false; } + } + + return true; +} +#endif + +inline bool is_prohibited_header_name(const std::string &name) { + using udl::operator""_t; + + switch (str2tag(name)) { + case "REMOTE_ADDR"_t: + case "REMOTE_PORT"_t: + case "LOCAL_ADDR"_t: + case "LOCAL_PORT"_t: return true; + default: return false; + } +} + +inline bool has_header(const Headers &headers, const std::string &key) { + if (is_prohibited_header_name(key)) { return false; } + return headers.find(key) != headers.end(); +} + +inline const char *get_header_value(const Headers &headers, + const std::string &key, const char *def, + size_t id) { + if (is_prohibited_header_name(key)) { +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "Prohibited header name '" + key + "' is specified."; + throw std::invalid_argument(msg); +#else + return ""; +#endif + } + + auto rng = headers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second.c_str(); } + return def; +} + +template +inline bool parse_header(const char *beg, const char *end, T fn) { + // Skip trailing spaces and tabs. + while (beg < end && is_space_or_tab(end[-1])) { + end--; + } + + auto p = beg; + while (p < end && *p != ':') { + p++; + } + + auto name = std::string(beg, p); + if (!detail::fields::is_field_name(name)) { return false; } + + if (p == end) { return false; } + + auto key_end = p; + + if (*p++ != ':') { return false; } + + while (p < end && is_space_or_tab(*p)) { + p++; + } + + if (p <= end) { + auto key_len = key_end - beg; + if (!key_len) { return false; } + + auto key = std::string(beg, key_end); + auto val = std::string(p, end); + + if (!detail::fields::is_field_value(val)) { return false; } + + if (case_ignore::equal(key, "Location") || + case_ignore::equal(key, "Referer")) { + fn(key, val); + } else { + fn(key, decode_path_component(val)); + } + + return true; + } + + return false; +} + +inline bool read_headers(Stream &strm, Headers &headers) { + const auto bufsiz = 2048; + char buf[bufsiz]; + stream_line_reader line_reader(strm, buf, bufsiz); + + size_t header_count = 0; + + for (;;) { + if (!line_reader.getline()) { return false; } + + // Check if the line ends with CRLF. + auto line_terminator_len = 2; + if (line_reader.end_with_crlf()) { + // Blank line indicates end of headers. + if (line_reader.size() == 2) { break; } + } else { +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + // Blank line indicates end of headers. + if (line_reader.size() == 1) { break; } + line_terminator_len = 1; +#else + continue; // Skip invalid line. +#endif + } + + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + + // Check header count limit + if (header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { return false; } + + // Exclude line terminator + auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; + + if (!parse_header(line_reader.ptr(), end, + [&](const std::string &key, const std::string &val) { + headers.emplace(key, val); + })) { + return false; + } + + header_count++; + } + + return true; +} + +inline bool read_content_with_length(Stream &strm, size_t len, + DownloadProgress progress, + ContentReceiverWithProgress out) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + + size_t r = 0; + while (r < len) { + auto read_len = static_cast(len - r); + auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); + if (n <= 0) { return false; } + + if (!out(buf, static_cast(n), r, len)) { return false; } + r += static_cast(n); + + if (progress) { + if (!progress(r, len)) { return false; } + } + } + + return true; +} + +inline void skip_content_with_length(Stream &strm, size_t len) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + size_t r = 0; + while (r < len) { + auto read_len = static_cast(len - r); + auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); + if (n <= 0) { return; } + r += static_cast(n); + } +} + +enum class ReadContentResult { + Success, // Successfully read the content + PayloadTooLarge, // The content exceeds the specified payload limit + Error // An error occurred while reading the content +}; + +inline ReadContentResult +read_content_without_length(Stream &strm, size_t payload_max_length, + ContentReceiverWithProgress out) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + size_t r = 0; + for (;;) { + auto n = strm.read(buf, CPPHTTPLIB_RECV_BUFSIZ); + if (n == 0) { return ReadContentResult::Success; } + if (n < 0) { return ReadContentResult::Error; } + + // Check if adding this data would exceed the payload limit + if (r > payload_max_length || + payload_max_length - r < static_cast(n)) { + return ReadContentResult::PayloadTooLarge; + } + + if (!out(buf, static_cast(n), r, 0)) { + return ReadContentResult::Error; + } + r += static_cast(n); + } + + return ReadContentResult::Success; +} + +template +inline ReadContentResult read_content_chunked(Stream &strm, T &x, + size_t payload_max_length, + ContentReceiverWithProgress out) { + const auto bufsiz = 16; + char buf[bufsiz]; + + stream_line_reader line_reader(strm, buf, bufsiz); + + if (!line_reader.getline()) { return ReadContentResult::Error; } + + unsigned long chunk_len; + size_t total_len = 0; + while (true) { + char *end_ptr; + + chunk_len = std::strtoul(line_reader.ptr(), &end_ptr, 16); + + if (end_ptr == line_reader.ptr()) { return ReadContentResult::Error; } + if (chunk_len == ULONG_MAX) { return ReadContentResult::Error; } + + if (chunk_len == 0) { break; } + + // Check if adding this chunk would exceed the payload limit + if (total_len > payload_max_length || + payload_max_length - total_len < chunk_len) { + return ReadContentResult::PayloadTooLarge; + } + + total_len += chunk_len; + + if (!read_content_with_length(strm, chunk_len, nullptr, out)) { + return ReadContentResult::Error; + } + + if (!line_reader.getline()) { return ReadContentResult::Error; } + + if (strcmp(line_reader.ptr(), "\r\n") != 0) { + return ReadContentResult::Error; + } + + if (!line_reader.getline()) { return ReadContentResult::Error; } + } + + assert(chunk_len == 0); + + // NOTE: In RFC 9112, '7.1 Chunked Transfer Coding' mentions "The chunked + // transfer coding is complete when a chunk with a chunk-size of zero is + // received, possibly followed by a trailer section, and finally terminated by + // an empty line". https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1 + // + // In '7.1.3. Decoding Chunked', however, the pseudo-code in the section + // does't care for the existence of the final CRLF. In other words, it seems + // to be ok whether the final CRLF exists or not in the chunked data. + // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1.3 + // + // According to the reference code in RFC 9112, cpp-httplib now allows + // chunked transfer coding data without the final CRLF. + if (!line_reader.getline()) { return ReadContentResult::Success; } + + // RFC 7230 Section 4.1.2 - Headers prohibited in trailers + thread_local case_ignore::unordered_set prohibited_trailers = { + // Message framing + "transfer-encoding", "content-length", + + // Routing + "host", + + // Authentication + "authorization", "www-authenticate", "proxy-authenticate", + "proxy-authorization", "cookie", "set-cookie", + + // Request modifiers + "cache-control", "expect", "max-forwards", "pragma", "range", "te", + + // Response control + "age", "expires", "date", "location", "retry-after", "vary", "warning", + + // Payload processing + "content-encoding", "content-type", "content-range", "trailer"}; + + // Parse declared trailer headers once for performance + case_ignore::unordered_set declared_trailers; + if (has_header(x.headers, "Trailer")) { + auto trailer_header = get_header_value(x.headers, "Trailer", "", 0); + auto len = std::strlen(trailer_header); + + split(trailer_header, trailer_header + len, ',', + [&](const char *b, const char *e) { + std::string key(b, e); + if (prohibited_trailers.find(key) == prohibited_trailers.end()) { + declared_trailers.insert(key); + } + }); + } + + size_t trailer_header_count = 0; + while (strcmp(line_reader.ptr(), "\r\n") != 0) { + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { + return ReadContentResult::Error; + } + + // Check trailer header count limit + if (trailer_header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { + return ReadContentResult::Error; + } + + // Exclude line terminator + constexpr auto line_terminator_len = 2; + auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; + + parse_header(line_reader.ptr(), end, + [&](const std::string &key, const std::string &val) { + if (declared_trailers.find(key) != declared_trailers.end()) { + x.trailers.emplace(key, val); + trailer_header_count++; + } + }); + + if (!line_reader.getline()) { return ReadContentResult::Error; } + } + + return ReadContentResult::Success; +} + +inline bool is_chunked_transfer_encoding(const Headers &headers) { + return case_ignore::equal( + get_header_value(headers, "Transfer-Encoding", "", 0), "chunked"); +} + +template +bool prepare_content_receiver(T &x, int &status, + ContentReceiverWithProgress receiver, + bool decompress, U callback) { + if (decompress) { + std::string encoding = x.get_header_value("Content-Encoding"); + std::unique_ptr decompressor; + + if (encoding == "gzip" || encoding == "deflate") { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } else if (encoding.find("br") != std::string::npos) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } else if (encoding == "zstd") { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } + + if (decompressor) { + if (decompressor->is_valid()) { + ContentReceiverWithProgress out = [&](const char *buf, size_t n, + size_t off, size_t len) { + return decompressor->decompress(buf, n, + [&](const char *buf2, size_t n2) { + return receiver(buf2, n2, off, len); + }); + }; + return callback(std::move(out)); + } else { + status = StatusCode::InternalServerError_500; + return false; + } + } + } + + ContentReceiverWithProgress out = [&](const char *buf, size_t n, size_t off, + size_t len) { + return receiver(buf, n, off, len); + }; + return callback(std::move(out)); +} + +template +bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, + DownloadProgress progress, + ContentReceiverWithProgress receiver, bool decompress) { + return prepare_content_receiver( + x, status, std::move(receiver), decompress, + [&](const ContentReceiverWithProgress &out) { + auto ret = true; + auto exceed_payload_max_length = false; + + if (is_chunked_transfer_encoding(x.headers)) { + auto result = read_content_chunked(strm, x, payload_max_length, out); + if (result == ReadContentResult::Success) { + ret = true; + } else if (result == ReadContentResult::PayloadTooLarge) { + exceed_payload_max_length = true; + ret = false; + } else { + ret = false; + } + } else if (!has_header(x.headers, "Content-Length")) { + auto result = + read_content_without_length(strm, payload_max_length, out); + if (result == ReadContentResult::Success) { + ret = true; + } else if (result == ReadContentResult::PayloadTooLarge) { + exceed_payload_max_length = true; + ret = false; + } else { + ret = false; + } + } else { + auto is_invalid_value = false; + auto len = get_header_value_u64(x.headers, "Content-Length", + (std::numeric_limits::max)(), + 0, is_invalid_value); + + if (is_invalid_value) { + ret = false; + } else if (len > payload_max_length) { + exceed_payload_max_length = true; + skip_content_with_length(strm, len); + ret = false; + } else if (len > 0) { + ret = read_content_with_length(strm, len, std::move(progress), out); + } + } + + if (!ret) { + status = exceed_payload_max_length ? StatusCode::PayloadTooLarge_413 + : StatusCode::BadRequest_400; + } + return ret; + }); +} + +inline ssize_t write_request_line(Stream &strm, const std::string &method, + const std::string &path) { + std::string s = method; + s += " "; + s += path; + s += " HTTP/1.1\r\n"; + return strm.write(s.data(), s.size()); +} + +inline ssize_t write_response_line(Stream &strm, int status) { + std::string s = "HTTP/1.1 "; + s += std::to_string(status); + s += " "; + s += httplib::status_message(status); + s += "\r\n"; + return strm.write(s.data(), s.size()); +} + +inline ssize_t write_headers(Stream &strm, const Headers &headers) { + ssize_t write_len = 0; + for (const auto &x : headers) { + std::string s; + s = x.first; + s += ": "; + s += x.second; + s += "\r\n"; + + auto len = strm.write(s.data(), s.size()); + if (len < 0) { return len; } + write_len += len; + } + auto len = strm.write("\r\n"); + if (len < 0) { return len; } + write_len += len; + return write_len; +} + +inline bool write_data(Stream &strm, const char *d, size_t l) { + size_t offset = 0; + while (offset < l) { + auto length = strm.write(d + offset, l - offset); + if (length < 0) { return false; } + offset += static_cast(length); + } + return true; +} + +template +inline bool write_content_with_progress(Stream &strm, + const ContentProvider &content_provider, + size_t offset, size_t length, + T is_shutting_down, + const UploadProgress &upload_progress, + Error &error) { + size_t end_offset = offset + length; + size_t start_offset = offset; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + if (write_data(strm, d, l)) { + offset += l; + + if (upload_progress && length > 0) { + size_t current_written = offset - start_offset; + if (!upload_progress(current_written, length)) { + ok = false; + return false; + } + } + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; + + while (offset < end_offset && !is_shutting_down()) { + if (!strm.wait_writable()) { + error = Error::Write; + return false; + } else if (!content_provider(offset, end_offset - offset, data_sink)) { + error = Error::Canceled; + return false; + } else if (!ok) { + error = Error::Write; + return false; + } + } + + error = Error::Success; + return true; +} + +template +inline bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, T is_shutting_down, + Error &error) { + return write_content_with_progress(strm, content_provider, offset, length, + is_shutting_down, nullptr, error); +} + +template +inline bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, + const T &is_shutting_down) { + auto error = Error::Success; + return write_content(strm, content_provider, offset, length, is_shutting_down, + error); +} + +template +inline bool +write_content_without_length(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + offset += l; + if (!write_data(strm, d, l)) { ok = false; } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; + + data_sink.done = [&](void) { data_available = false; }; + + while (data_available && !is_shutting_down()) { + if (!strm.wait_writable()) { + return false; + } else if (!content_provider(offset, 0, data_sink)) { + return false; + } else if (!ok) { + return false; + } + } + return true; +} + +template +inline bool +write_content_chunked(Stream &strm, const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor, Error &error) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + data_available = l > 0; + offset += l; + + std::string payload; + if (compressor.compress(d, l, false, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = + from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; } + } + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; + + auto done_with_trailer = [&](const Headers *trailer) { + if (!ok) { return; } + + data_available = false; + + std::string payload; + if (!compressor.compress(nullptr, 0, true, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + ok = false; + return; + } + + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { + ok = false; + return; + } + } + + constexpr const char done_marker[] = "0\r\n"; + if (!write_data(strm, done_marker, str_len(done_marker))) { ok = false; } + + // Trailer + if (trailer) { + for (const auto &kv : *trailer) { + std::string field_line = kv.first + ": " + kv.second + "\r\n"; + if (!write_data(strm, field_line.data(), field_line.size())) { + ok = false; + } + } + } + + constexpr const char crlf[] = "\r\n"; + if (!write_data(strm, crlf, str_len(crlf))) { ok = false; } + }; + + data_sink.done = [&](void) { done_with_trailer(nullptr); }; + + data_sink.done_with_trailer = [&](const Headers &trailer) { + done_with_trailer(&trailer); + }; + + while (data_available && !is_shutting_down()) { + if (!strm.wait_writable()) { + error = Error::Write; + return false; + } else if (!content_provider(offset, 0, data_sink)) { + error = Error::Canceled; + return false; + } else if (!ok) { + error = Error::Write; + return false; + } + } + + error = Error::Success; + return true; +} + +template +inline bool write_content_chunked(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor) { + auto error = Error::Success; + return write_content_chunked(strm, content_provider, is_shutting_down, + compressor, error); +} + +template +inline bool redirect(T &cli, Request &req, Response &res, + const std::string &path, const std::string &location, + Error &error) { + Request new_req = req; + new_req.path = path; + new_req.redirect_count_ -= 1; + + if (res.status == StatusCode::SeeOther_303 && + (req.method != "GET" && req.method != "HEAD")) { + new_req.method = "GET"; + new_req.body.clear(); + new_req.headers.clear(); + } + + Response new_res; + + auto ret = cli.send(new_req, new_res, error); + if (ret) { + req = new_req; + res = new_res; + + if (res.location.empty()) { res.location = location; } + } + return ret; +} + +inline std::string params_to_query_str(const Params ¶ms) { + std::string query; + + for (auto it = params.begin(); it != params.end(); ++it) { + if (it != params.begin()) { query += "&"; } + query += encode_query_component(it->first); + query += "="; + query += encode_query_component(it->second); + } + return query; +} + +inline void parse_query_text(const char *data, std::size_t size, + Params ¶ms) { + std::set cache; + split(data, data + size, '&', [&](const char *b, const char *e) { + std::string kv(b, e); + if (cache.find(kv) != cache.end()) { return; } + cache.insert(std::move(kv)); + + std::string key; + std::string val; + divide(b, static_cast(e - b), '=', + [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data, + std::size_t rhs_size) { + key.assign(lhs_data, lhs_size); + val.assign(rhs_data, rhs_size); + }); + + if (!key.empty()) { + params.emplace(decode_query_component(key), decode_query_component(val)); + } + }); +} + +inline void parse_query_text(const std::string &s, Params ¶ms) { + parse_query_text(s.data(), s.size(), params); +} + +inline bool parse_multipart_boundary(const std::string &content_type, + std::string &boundary) { + auto boundary_keyword = "boundary="; + auto pos = content_type.find(boundary_keyword); + if (pos == std::string::npos) { return false; } + auto end = content_type.find(';', pos); + auto beg = pos + strlen(boundary_keyword); + boundary = trim_double_quotes_copy(content_type.substr(beg, end - beg)); + return !boundary.empty(); +} + +inline void parse_disposition_params(const std::string &s, Params ¶ms) { + std::set cache; + split(s.data(), s.data() + s.size(), ';', [&](const char *b, const char *e) { + std::string kv(b, e); + if (cache.find(kv) != cache.end()) { return; } + cache.insert(kv); + + std::string key; + std::string val; + split(b, e, '=', [&](const char *b2, const char *e2) { + if (key.empty()) { + key.assign(b2, e2); + } else { + val.assign(b2, e2); + } + }); + + if (!key.empty()) { + params.emplace(trim_double_quotes_copy((key)), + trim_double_quotes_copy((val))); + } + }); +} + +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +inline bool parse_range_header(const std::string &s, Ranges &ranges) { +#else +inline bool parse_range_header(const std::string &s, Ranges &ranges) try { +#endif + auto is_valid = [](const std::string &str) { + return std::all_of(str.cbegin(), str.cend(), + [](unsigned char c) { return std::isdigit(c); }); + }; + + if (s.size() > 7 && s.compare(0, 6, "bytes=") == 0) { + const auto pos = static_cast(6); + const auto len = static_cast(s.size() - 6); + auto all_valid_ranges = true; + split(&s[pos], &s[pos + len], ',', [&](const char *b, const char *e) { + if (!all_valid_ranges) { return; } + + const auto it = std::find(b, e, '-'); + if (it == e) { + all_valid_ranges = false; + return; + } + + const auto lhs = std::string(b, it); + const auto rhs = std::string(it + 1, e); + if (!is_valid(lhs) || !is_valid(rhs)) { + all_valid_ranges = false; + return; + } + + const auto first = + static_cast(lhs.empty() ? -1 : std::stoll(lhs)); + const auto last = + static_cast(rhs.empty() ? -1 : std::stoll(rhs)); + if ((first == -1 && last == -1) || + (first != -1 && last != -1 && first > last)) { + all_valid_ranges = false; + return; + } + + ranges.emplace_back(first, last); + }); + return all_valid_ranges && !ranges.empty(); + } + return false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +} +#else +} catch (...) { return false; } +#endif + +inline bool parse_accept_header(const std::string &s, + std::vector &content_types) { + content_types.clear(); + + // Empty string is considered valid (no preference) + if (s.empty()) { return true; } + + // Check for invalid patterns: leading/trailing commas or consecutive commas + if (s.front() == ',' || s.back() == ',' || + s.find(",,") != std::string::npos) { + return false; + } + + struct AcceptEntry { + std::string media_type; + double quality; + int order; // Original order in header + }; + + std::vector entries; + int order = 0; + bool has_invalid_entry = false; + + // Split by comma and parse each entry + split(s.data(), s.data() + s.size(), ',', [&](const char *b, const char *e) { + std::string entry(b, e); + entry = trim_copy(entry); + + if (entry.empty()) { + has_invalid_entry = true; + return; + } + + AcceptEntry accept_entry; + accept_entry.quality = 1.0; // Default quality + accept_entry.order = order++; + + // Find q= parameter + auto q_pos = entry.find(";q="); + if (q_pos == std::string::npos) { q_pos = entry.find("; q="); } + + if (q_pos != std::string::npos) { + // Extract media type (before q parameter) + accept_entry.media_type = trim_copy(entry.substr(0, q_pos)); + + // Extract quality value + auto q_start = entry.find('=', q_pos) + 1; + auto q_end = entry.find(';', q_start); + if (q_end == std::string::npos) { q_end = entry.length(); } + + std::string quality_str = + trim_copy(entry.substr(q_start, q_end - q_start)); + if (quality_str.empty()) { + has_invalid_entry = true; + return; + } + +#ifdef CPPHTTPLIB_NO_EXCEPTIONS + { + std::istringstream iss(quality_str); + iss >> accept_entry.quality; + + // Check if conversion was successful and entire string was consumed + if (iss.fail() || !iss.eof()) { + has_invalid_entry = true; + return; + } + } +#else + try { + accept_entry.quality = std::stod(quality_str); + } catch (...) { + has_invalid_entry = true; + return; + } +#endif + // Check if quality is in valid range [0.0, 1.0] + if (accept_entry.quality < 0.0 || accept_entry.quality > 1.0) { + has_invalid_entry = true; + return; + } + } else { + // No quality parameter, use entire entry as media type + accept_entry.media_type = entry; + } + + // Remove additional parameters from media type + auto param_pos = accept_entry.media_type.find(';'); + if (param_pos != std::string::npos) { + accept_entry.media_type = + trim_copy(accept_entry.media_type.substr(0, param_pos)); + } + + // Basic validation of media type format + if (accept_entry.media_type.empty()) { + has_invalid_entry = true; + return; + } + + // Check for basic media type format (should contain '/' or be '*') + if (accept_entry.media_type != "*" && + accept_entry.media_type.find('/') == std::string::npos) { + has_invalid_entry = true; + return; + } + + entries.push_back(accept_entry); + }); + + // Return false if any invalid entry was found + if (has_invalid_entry) { return false; } + + // Sort by quality (descending), then by original order (ascending) + std::sort(entries.begin(), entries.end(), + [](const AcceptEntry &a, const AcceptEntry &b) { + if (a.quality != b.quality) { + return a.quality > b.quality; // Higher quality first + } + return a.order < b.order; // Earlier order first for same quality + }); + + // Extract sorted media types + content_types.reserve(entries.size()); + for (const auto &entry : entries) { + content_types.push_back(entry.media_type); + } + + return true; +} + +class FormDataParser { +public: + FormDataParser() = default; + + void set_boundary(std::string &&boundary) { + boundary_ = boundary; + dash_boundary_crlf_ = dash_ + boundary_ + crlf_; + crlf_dash_boundary_ = crlf_ + dash_ + boundary_; + } + + bool is_valid() const { return is_valid_; } + + bool parse(const char *buf, size_t n, const FormDataHeader &header_callback, + const ContentReceiver &content_callback) { + + buf_append(buf, n); + + while (buf_size() > 0) { + switch (state_) { + case 0: { // Initial boundary + auto pos = buf_find(dash_boundary_crlf_); + if (pos == buf_size()) { return true; } + buf_erase(pos + dash_boundary_crlf_.size()); + state_ = 1; + break; + } + case 1: { // New entry + clear_file_info(); + state_ = 2; + break; + } + case 2: { // Headers + auto pos = buf_find(crlf_); + if (pos > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + while (pos < buf_size()) { + // Empty line + if (pos == 0) { + if (!header_callback(file_)) { + is_valid_ = false; + return false; + } + buf_erase(crlf_.size()); + state_ = 3; + break; + } + + const auto header = buf_head(pos); + + if (!parse_header(header.data(), header.data() + header.size(), + [&](const std::string &, const std::string &) {})) { + is_valid_ = false; + return false; + } + + // Parse and emplace space trimmed headers into a map + if (!parse_header( + header.data(), header.data() + header.size(), + [&](const std::string &key, const std::string &val) { + file_.headers.emplace(key, val); + })) { + is_valid_ = false; + return false; + } + + constexpr const char header_content_type[] = "Content-Type:"; + + if (start_with_case_ignore(header, header_content_type)) { + file_.content_type = + trim_copy(header.substr(str_len(header_content_type))); + } else { + thread_local const std::regex re_content_disposition( + R"~(^Content-Disposition:\s*form-data;\s*(.*)$)~", + std::regex_constants::icase); + + std::smatch m; + if (std::regex_match(header, m, re_content_disposition)) { + Params params; + parse_disposition_params(m[1], params); + + auto it = params.find("name"); + if (it != params.end()) { + file_.name = it->second; + } else { + is_valid_ = false; + return false; + } + + it = params.find("filename"); + if (it != params.end()) { file_.filename = it->second; } + + it = params.find("filename*"); + if (it != params.end()) { + // Only allow UTF-8 encoding... + thread_local const std::regex re_rfc5987_encoding( + R"~(^UTF-8''(.+?)$)~", std::regex_constants::icase); + + std::smatch m2; + if (std::regex_match(it->second, m2, re_rfc5987_encoding)) { + file_.filename = decode_path_component(m2[1]); // override... + } else { + is_valid_ = false; + return false; + } + } + } + } + buf_erase(pos + crlf_.size()); + pos = buf_find(crlf_); + } + if (state_ != 3) { return true; } + break; + } + case 3: { // Body + if (crlf_dash_boundary_.size() > buf_size()) { return true; } + auto pos = buf_find(crlf_dash_boundary_); + if (pos < buf_size()) { + if (!content_callback(buf_data(), pos)) { + is_valid_ = false; + return false; + } + buf_erase(pos + crlf_dash_boundary_.size()); + state_ = 4; + } else { + auto len = buf_size() - crlf_dash_boundary_.size(); + if (len > 0) { + if (!content_callback(buf_data(), len)) { + is_valid_ = false; + return false; + } + buf_erase(len); + } + return true; + } + break; + } + case 4: { // Boundary + if (crlf_.size() > buf_size()) { return true; } + if (buf_start_with(crlf_)) { + buf_erase(crlf_.size()); + state_ = 1; + } else { + if (dash_.size() > buf_size()) { return true; } + if (buf_start_with(dash_)) { + buf_erase(dash_.size()); + is_valid_ = true; + buf_erase(buf_size()); // Remove epilogue + } else { + return true; + } + } + break; + } + } + } + + return true; + } + +private: + void clear_file_info() { + file_.name.clear(); + file_.filename.clear(); + file_.content_type.clear(); + file_.headers.clear(); + } + + bool start_with_case_ignore(const std::string &a, const char *b) const { + const auto b_len = strlen(b); + if (a.size() < b_len) { return false; } + for (size_t i = 0; i < b_len; i++) { + if (case_ignore::to_lower(a[i]) != case_ignore::to_lower(b[i])) { + return false; + } + } + return true; + } + + const std::string dash_ = "--"; + const std::string crlf_ = "\r\n"; + std::string boundary_; + std::string dash_boundary_crlf_; + std::string crlf_dash_boundary_; + + size_t state_ = 0; + bool is_valid_ = false; + FormData file_; + + // Buffer + bool start_with(const std::string &a, size_t spos, size_t epos, + const std::string &b) const { + if (epos - spos < b.size()) { return false; } + for (size_t i = 0; i < b.size(); i++) { + if (a[i + spos] != b[i]) { return false; } + } + return true; + } + + size_t buf_size() const { return buf_epos_ - buf_spos_; } + + const char *buf_data() const { return &buf_[buf_spos_]; } + + std::string buf_head(size_t l) const { return buf_.substr(buf_spos_, l); } + + bool buf_start_with(const std::string &s) const { + return start_with(buf_, buf_spos_, buf_epos_, s); + } + + size_t buf_find(const std::string &s) const { + auto c = s.front(); + + size_t off = buf_spos_; + while (off < buf_epos_) { + auto pos = off; + while (true) { + if (pos == buf_epos_) { return buf_size(); } + if (buf_[pos] == c) { break; } + pos++; + } + + auto remaining_size = buf_epos_ - pos; + if (s.size() > remaining_size) { return buf_size(); } + + if (start_with(buf_, pos, buf_epos_, s)) { return pos - buf_spos_; } + + off = pos + 1; + } + + return buf_size(); + } + + void buf_append(const char *data, size_t n) { + auto remaining_size = buf_size(); + if (remaining_size > 0 && buf_spos_ > 0) { + for (size_t i = 0; i < remaining_size; i++) { + buf_[i] = buf_[buf_spos_ + i]; + } + } + buf_spos_ = 0; + buf_epos_ = remaining_size; + + if (remaining_size + n > buf_.size()) { buf_.resize(remaining_size + n); } + + for (size_t i = 0; i < n; i++) { + buf_[buf_epos_ + i] = data[i]; + } + buf_epos_ += n; + } + + void buf_erase(size_t size) { buf_spos_ += size; } + + std::string buf_; + size_t buf_spos_ = 0; + size_t buf_epos_ = 0; +}; + +inline std::string random_string(size_t length) { + constexpr const char data[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + thread_local auto engine([]() { + // std::random_device might actually be deterministic on some + // platforms, but due to lack of support in the c++ standard library, + // doing better requires either some ugly hacks or breaking portability. + std::random_device seed_gen; + // Request 128 bits of entropy for initialization + std::seed_seq seed_sequence{seed_gen(), seed_gen(), seed_gen(), seed_gen()}; + return std::mt19937(seed_sequence); + }()); + + std::string result; + for (size_t i = 0; i < length; i++) { + result += data[engine() % (sizeof(data) - 1)]; + } + return result; +} + +inline std::string make_multipart_data_boundary() { + return "--cpp-httplib-multipart-data-" + detail::random_string(16); +} + +inline bool is_multipart_boundary_chars_valid(const std::string &boundary) { + auto valid = true; + for (size_t i = 0; i < boundary.size(); i++) { + auto c = boundary[i]; + if (!std::isalnum(c) && c != '-' && c != '_') { + valid = false; + break; + } + } + return valid; +} + +template +inline std::string +serialize_multipart_formdata_item_begin(const T &item, + const std::string &boundary) { + std::string body = "--" + boundary + "\r\n"; + body += "Content-Disposition: form-data; name=\"" + item.name + "\""; + if (!item.filename.empty()) { + body += "; filename=\"" + item.filename + "\""; + } + body += "\r\n"; + if (!item.content_type.empty()) { + body += "Content-Type: " + item.content_type + "\r\n"; + } + body += "\r\n"; + + return body; +} + +inline std::string serialize_multipart_formdata_item_end() { return "\r\n"; } + +inline std::string +serialize_multipart_formdata_finish(const std::string &boundary) { + return "--" + boundary + "--\r\n"; +} + +inline std::string +serialize_multipart_formdata_get_content_type(const std::string &boundary) { + return "multipart/form-data; boundary=" + boundary; +} + +inline std::string +serialize_multipart_formdata(const UploadFormDataItems &items, + const std::string &boundary, bool finish = true) { + std::string body; + + for (const auto &item : items) { + body += serialize_multipart_formdata_item_begin(item, boundary); + body += item.content + serialize_multipart_formdata_item_end(); + } + + if (finish) { body += serialize_multipart_formdata_finish(boundary); } + + return body; +} + +inline void coalesce_ranges(Ranges &ranges, size_t content_length) { + if (ranges.size() <= 1) return; + + // Sort ranges by start position + std::sort(ranges.begin(), ranges.end(), + [](const Range &a, const Range &b) { return a.first < b.first; }); + + Ranges coalesced; + coalesced.reserve(ranges.size()); + + for (auto &r : ranges) { + auto first_pos = r.first; + auto last_pos = r.second; + + // Handle special cases like in range_error + if (first_pos == -1 && last_pos == -1) { + first_pos = 0; + last_pos = static_cast(content_length); + } + + if (first_pos == -1) { + first_pos = static_cast(content_length) - last_pos; + last_pos = static_cast(content_length) - 1; + } + + if (last_pos == -1 || last_pos >= static_cast(content_length)) { + last_pos = static_cast(content_length) - 1; + } + + // Skip invalid ranges + if (!(0 <= first_pos && first_pos <= last_pos && + last_pos < static_cast(content_length))) { + continue; + } + + // Coalesce with previous range if overlapping or adjacent (but not + // identical) + if (!coalesced.empty()) { + auto &prev = coalesced.back(); + // Check if current range overlaps or is adjacent to previous range + // but don't coalesce identical ranges (allow duplicates) + if (first_pos <= prev.second + 1 && + !(first_pos == prev.first && last_pos == prev.second)) { + // Extend the previous range + prev.second = (std::max)(prev.second, last_pos); + continue; + } + } + + // Add new range + coalesced.emplace_back(first_pos, last_pos); + } + + ranges = std::move(coalesced); +} + +inline bool range_error(Request &req, Response &res) { + if (!req.ranges.empty() && 200 <= res.status && res.status < 300) { + ssize_t content_len = static_cast( + res.content_length_ ? res.content_length_ : res.body.size()); + + std::vector> processed_ranges; + size_t overwrapping_count = 0; + + // NOTE: The following Range check is based on '14.2. Range' in RFC 9110 + // 'HTTP Semantics' to avoid potential denial-of-service attacks. + // https://www.rfc-editor.org/rfc/rfc9110#section-14.2 + + // Too many ranges + if (req.ranges.size() > CPPHTTPLIB_RANGE_MAX_COUNT) { return true; } + + for (auto &r : req.ranges) { + auto &first_pos = r.first; + auto &last_pos = r.second; + + if (first_pos == -1 && last_pos == -1) { + first_pos = 0; + last_pos = content_len; + } + + if (first_pos == -1) { + first_pos = content_len - last_pos; + last_pos = content_len - 1; + } + + // NOTE: RFC-9110 '14.1.2. Byte Ranges': + // A client can limit the number of bytes requested without knowing the + // size of the selected representation. If the last-pos value is absent, + // or if the value is greater than or equal to the current length of the + // representation data, the byte range is interpreted as the remainder of + // the representation (i.e., the server replaces the value of last-pos + // with a value that is one less than the current length of the selected + // representation). + // https://www.rfc-editor.org/rfc/rfc9110.html#section-14.1.2-6 + if (last_pos == -1 || last_pos >= content_len) { + last_pos = content_len - 1; + } + + // Range must be within content length + if (!(0 <= first_pos && first_pos <= last_pos && + last_pos <= content_len - 1)) { + return true; + } + + // Request must not have more than two overlapping ranges + for (const auto &processed_range : processed_ranges) { + if (!(last_pos < processed_range.first || + first_pos > processed_range.second)) { + overwrapping_count++; + if (overwrapping_count > 2) { return true; } + break; // Only count once per range + } + } + + processed_ranges.emplace_back(first_pos, last_pos); + } + + // After validation, coalesce overlapping ranges as per RFC 9110 + coalesce_ranges(req.ranges, static_cast(content_len)); + } + + return false; +} + +inline std::pair +get_range_offset_and_length(Range r, size_t content_length) { + assert(r.first != -1 && r.second != -1); + assert(0 <= r.first && r.first < static_cast(content_length)); + assert(r.first <= r.second && + r.second < static_cast(content_length)); + (void)(content_length); + return std::make_pair(r.first, static_cast(r.second - r.first) + 1); +} + +inline std::string make_content_range_header_field( + const std::pair &offset_and_length, size_t content_length) { + auto st = offset_and_length.first; + auto ed = st + offset_and_length.second - 1; + + std::string field = "bytes "; + field += std::to_string(st); + field += "-"; + field += std::to_string(ed); + field += "/"; + field += std::to_string(content_length); + return field; +} + +template +bool process_multipart_ranges_data(const Request &req, + const std::string &boundary, + const std::string &content_type, + size_t content_length, SToken stoken, + CToken ctoken, Content content) { + for (size_t i = 0; i < req.ranges.size(); i++) { + ctoken("--"); + stoken(boundary); + ctoken("\r\n"); + if (!content_type.empty()) { + ctoken("Content-Type: "); + stoken(content_type); + ctoken("\r\n"); + } + + auto offset_and_length = + get_range_offset_and_length(req.ranges[i], content_length); + + ctoken("Content-Range: "); + stoken(make_content_range_header_field(offset_and_length, content_length)); + ctoken("\r\n"); + ctoken("\r\n"); + + if (!content(offset_and_length.first, offset_and_length.second)) { + return false; + } + ctoken("\r\n"); + } + + ctoken("--"); + stoken(boundary); + ctoken("--"); + + return true; +} + +inline void make_multipart_ranges_data(const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + size_t content_length, + std::string &data) { + process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { data += token; }, + [&](const std::string &token) { data += token; }, + [&](size_t offset, size_t length) { + assert(offset + length <= content_length); + data += res.body.substr(offset, length); + return true; + }); +} + +inline size_t get_multipart_ranges_data_length(const Request &req, + const std::string &boundary, + const std::string &content_type, + size_t content_length) { + size_t data_length = 0; + + process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { data_length += token.size(); }, + [&](const std::string &token) { data_length += token.size(); }, + [&](size_t /*offset*/, size_t length) { + data_length += length; + return true; + }); + + return data_length; +} + +template +inline bool +write_multipart_ranges_data(Stream &strm, const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + size_t content_length, const T &is_shutting_down) { + return process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { strm.write(token); }, + [&](const std::string &token) { strm.write(token); }, + [&](size_t offset, size_t length) { + return write_content(strm, res.content_provider_, offset, length, + is_shutting_down); + }); +} + +inline bool expect_content(const Request &req) { + if (req.method == "POST" || req.method == "PUT" || req.method == "PATCH" || + req.method == "DELETE") { + return true; + } + if (req.has_header("Content-Length") && + req.get_header_value_u64("Content-Length") > 0) { + return true; + } + if (is_chunked_transfer_encoding(req.headers)) { return true; } + return false; +} + +inline bool has_crlf(const std::string &s) { + auto p = s.c_str(); + while (*p) { + if (*p == '\r' || *p == '\n') { return true; } + p++; + } + return false; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline std::string message_digest(const std::string &s, const EVP_MD *algo) { + auto context = std::unique_ptr( + EVP_MD_CTX_new(), EVP_MD_CTX_free); + + unsigned int hash_length = 0; + unsigned char hash[EVP_MAX_MD_SIZE]; + + EVP_DigestInit_ex(context.get(), algo, nullptr); + EVP_DigestUpdate(context.get(), s.c_str(), s.size()); + EVP_DigestFinal_ex(context.get(), hash, &hash_length); + + std::stringstream ss; + for (auto i = 0u; i < hash_length; ++i) { + ss << std::hex << std::setw(2) << std::setfill('0') + << static_cast(hash[i]); + } + + return ss.str(); +} + +inline std::string MD5(const std::string &s) { + return message_digest(s, EVP_md5()); +} + +inline std::string SHA_256(const std::string &s) { + return message_digest(s, EVP_sha256()); +} + +inline std::string SHA_512(const std::string &s) { + return message_digest(s, EVP_sha512()); +} + +inline std::pair make_digest_authentication_header( + const Request &req, const std::map &auth, + size_t cnonce_count, const std::string &cnonce, const std::string &username, + const std::string &password, bool is_proxy = false) { + std::string nc; + { + std::stringstream ss; + ss << std::setfill('0') << std::setw(8) << std::hex << cnonce_count; + nc = ss.str(); + } + + std::string qop; + if (auth.find("qop") != auth.end()) { + qop = auth.at("qop"); + if (qop.find("auth-int") != std::string::npos) { + qop = "auth-int"; + } else if (qop.find("auth") != std::string::npos) { + qop = "auth"; + } else { + qop.clear(); + } + } + + std::string algo = "MD5"; + if (auth.find("algorithm") != auth.end()) { algo = auth.at("algorithm"); } + + std::string response; + { + auto H = algo == "SHA-256" ? detail::SHA_256 + : algo == "SHA-512" ? detail::SHA_512 + : detail::MD5; + + auto A1 = username + ":" + auth.at("realm") + ":" + password; + + auto A2 = req.method + ":" + req.path; + if (qop == "auth-int") { A2 += ":" + H(req.body); } + + if (qop.empty()) { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + H(A2)); + } else { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + nc + ":" + cnonce + + ":" + qop + ":" + H(A2)); + } + } + + auto opaque = (auth.find("opaque") != auth.end()) ? auth.at("opaque") : ""; + + auto field = "Digest username=\"" + username + "\", realm=\"" + + auth.at("realm") + "\", nonce=\"" + auth.at("nonce") + + "\", uri=\"" + req.path + "\", algorithm=" + algo + + (qop.empty() ? ", response=\"" + : ", qop=" + qop + ", nc=" + nc + ", cnonce=\"" + + cnonce + "\", response=\"") + + response + "\"" + + (opaque.empty() ? "" : ", opaque=\"" + opaque + "\""); + + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, field); +} + +inline bool is_ssl_peer_could_be_closed(SSL *ssl, socket_t sock) { + detail::set_nonblocking(sock, true); + auto se = detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + char buf[1]; + return !SSL_peek(ssl, buf, 1) && + SSL_get_error(ssl, 0) == SSL_ERROR_ZERO_RETURN; +} + +#ifdef _WIN32 +// NOTE: This code came up with the following stackoverflow post: +// https://stackoverflow.com/questions/9507184/can-openssl-on-windows-use-the-system-certificate-store +inline bool load_system_certs_on_windows(X509_STORE *store) { + auto hStore = CertOpenSystemStoreW((HCRYPTPROV_LEGACY)NULL, L"ROOT"); + if (!hStore) { return false; } + + auto result = false; + PCCERT_CONTEXT pContext = NULL; + while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != + nullptr) { + auto encoded_cert = + static_cast(pContext->pbCertEncoded); + + auto x509 = d2i_X509(NULL, &encoded_cert, pContext->cbCertEncoded); + if (x509) { + X509_STORE_add_cert(store, x509); + X509_free(x509); + result = true; + } + } + + CertFreeCertificateContext(pContext); + CertCloseStore(hStore, 0); + + return result; +} +#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && TARGET_OS_MAC +template +using CFObjectPtr = + std::unique_ptr::type, void (*)(CFTypeRef)>; + +inline void cf_object_ptr_deleter(CFTypeRef obj) { + if (obj) { CFRelease(obj); } +} + +inline bool retrieve_certs_from_keychain(CFObjectPtr &certs) { + CFStringRef keys[] = {kSecClass, kSecMatchLimit, kSecReturnRef}; + CFTypeRef values[] = {kSecClassCertificate, kSecMatchLimitAll, + kCFBooleanTrue}; + + CFObjectPtr query( + CFDictionaryCreate(nullptr, reinterpret_cast(keys), values, + sizeof(keys) / sizeof(keys[0]), + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks), + cf_object_ptr_deleter); + + if (!query) { return false; } + + CFTypeRef security_items = nullptr; + if (SecItemCopyMatching(query.get(), &security_items) != errSecSuccess || + CFArrayGetTypeID() != CFGetTypeID(security_items)) { + return false; + } + + certs.reset(reinterpret_cast(security_items)); + return true; +} + +inline bool retrieve_root_certs_from_keychain(CFObjectPtr &certs) { + CFArrayRef root_security_items = nullptr; + if (SecTrustCopyAnchorCertificates(&root_security_items) != errSecSuccess) { + return false; + } + + certs.reset(root_security_items); + return true; +} + +inline bool add_certs_to_x509_store(CFArrayRef certs, X509_STORE *store) { + auto result = false; + for (auto i = 0; i < CFArrayGetCount(certs); ++i) { + const auto cert = reinterpret_cast( + CFArrayGetValueAtIndex(certs, i)); + + if (SecCertificateGetTypeID() != CFGetTypeID(cert)) { continue; } + + CFDataRef cert_data = nullptr; + if (SecItemExport(cert, kSecFormatX509Cert, 0, nullptr, &cert_data) != + errSecSuccess) { + continue; + } + + CFObjectPtr cert_data_ptr(cert_data, cf_object_ptr_deleter); + + auto encoded_cert = static_cast( + CFDataGetBytePtr(cert_data_ptr.get())); + + auto x509 = + d2i_X509(NULL, &encoded_cert, CFDataGetLength(cert_data_ptr.get())); + + if (x509) { + X509_STORE_add_cert(store, x509); + X509_free(x509); + result = true; + } + } + + return result; +} + +inline bool load_system_certs_on_macos(X509_STORE *store) { + auto result = false; + CFObjectPtr certs(nullptr, cf_object_ptr_deleter); + if (retrieve_certs_from_keychain(certs) && certs) { + result = add_certs_to_x509_store(certs.get(), store); + } + + if (retrieve_root_certs_from_keychain(certs) && certs) { + result = add_certs_to_x509_store(certs.get(), store) || result; + } + + return result; +} +#endif // _WIN32 +#endif // CPPHTTPLIB_OPENSSL_SUPPORT + +#ifdef _WIN32 +class WSInit { +public: + WSInit() { + WSADATA wsaData; + if (WSAStartup(0x0002, &wsaData) == 0) is_valid_ = true; + } + + ~WSInit() { + if (is_valid_) WSACleanup(); + } + + bool is_valid_ = false; +}; + +static WSInit wsinit_; +#endif + +inline bool parse_www_authenticate(const Response &res, + std::map &auth, + bool is_proxy) { + auto auth_key = is_proxy ? "Proxy-Authenticate" : "WWW-Authenticate"; + if (res.has_header(auth_key)) { + thread_local auto re = + std::regex(R"~((?:(?:,\s*)?(.+?)=(?:"(.*?)"|([^,]*))))~"); + auto s = res.get_header_value(auth_key); + auto pos = s.find(' '); + if (pos != std::string::npos) { + auto type = s.substr(0, pos); + if (type == "Basic") { + return false; + } else if (type == "Digest") { + s = s.substr(pos + 1); + auto beg = std::sregex_iterator(s.begin(), s.end(), re); + for (auto i = beg; i != std::sregex_iterator(); ++i) { + const auto &m = *i; + auto key = s.substr(static_cast(m.position(1)), + static_cast(m.length(1))); + auto val = m.length(2) > 0 + ? s.substr(static_cast(m.position(2)), + static_cast(m.length(2))) + : s.substr(static_cast(m.position(3)), + static_cast(m.length(3))); + auth[key] = val; + } + return true; + } + } + } + return false; +} + +class ContentProviderAdapter { +public: + explicit ContentProviderAdapter( + ContentProviderWithoutLength &&content_provider) + : content_provider_(content_provider) {} + + bool operator()(size_t offset, size_t, DataSink &sink) { + return content_provider_(offset, sink); + } + +private: + ContentProviderWithoutLength content_provider_; +}; + +} // namespace detail + +inline std::string hosted_at(const std::string &hostname) { + std::vector addrs; + hosted_at(hostname, addrs); + if (addrs.empty()) { return std::string(); } + return addrs[0]; +} + +inline void hosted_at(const std::string &hostname, + std::vector &addrs) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (detail::getaddrinfo_with_timeout(hostname.c_str(), nullptr, &hints, + &result, 0)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return; + } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &addr = + *reinterpret_cast(rp->ai_addr); + std::string ip; + auto dummy = -1; + if (detail::get_ip_and_port(addr, sizeof(struct sockaddr_storage), ip, + dummy)) { + addrs.push_back(ip); + } + } +} + +inline std::string encode_uri_component(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +inline std::string encode_uri(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || + c == '&' || c == '=' || c == '+' || c == '$' || c == ',' || c == '#') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +inline std::string decode_uri_component(const std::string &value) { + std::string result; + + for (size_t i = 0; i < value.size(); i++) { + if (value[i] == '%' && i + 2 < value.size()) { + auto val = 0; + if (detail::from_hex_to_i(value, i + 1, 2, val)) { + result += static_cast(val); + i += 2; + } else { + result += value[i]; + } + } else { + result += value[i]; + } + } + + return result; +} + +inline std::string decode_uri(const std::string &value) { + std::string result; + + for (size_t i = 0; i < value.size(); i++) { + if (value[i] == '%' && i + 2 < value.size()) { + auto val = 0; + if (detail::from_hex_to_i(value, i + 1, 2, val)) { + result += static_cast(val); + i += 2; + } else { + result += value[i]; + } + } else { + result += value[i]; + } + } + + return result; +} + +inline std::string encode_path_component(const std::string &component) { + std::string result; + result.reserve(component.size() * 3); + + for (size_t i = 0; i < component.size(); i++) { + auto c = static_cast(component[i]); + + // Unreserved characters per RFC 3986: ALPHA / DIGIT / "-" / "." / "_" / "~" + if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { + result += static_cast(c); + } + // Path-safe sub-delimiters: "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / + // "," / ";" / "=" + else if (c == '!' || c == '$' || c == '&' || c == '\'' || c == '(' || + c == ')' || c == '*' || c == '+' || c == ',' || c == ';' || + c == '=') { + result += static_cast(c); + } + // Colon is allowed in path segments except first segment + else if (c == ':') { + result += static_cast(c); + } + // @ is allowed in path + else if (c == '@') { + result += static_cast(c); + } else { + result += '%'; + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", c); + result.append(hex, 2); + } + } + return result; +} + +inline std::string decode_path_component(const std::string &component) { + std::string result; + result.reserve(component.size()); + + for (size_t i = 0; i < component.size(); i++) { + if (component[i] == '%' && i + 1 < component.size()) { + if (component[i + 1] == 'u') { + // Unicode %uXXXX encoding + auto val = 0; + if (detail::from_hex_to_i(component, i + 2, 4, val)) { + // 4 digits Unicode codes + char buff[4]; + size_t len = detail::to_utf8(val, buff); + if (len > 0) { result.append(buff, len); } + i += 5; // 'u0000' + } else { + result += component[i]; + } + } else { + // Standard %XX encoding + auto val = 0; + if (detail::from_hex_to_i(component, i + 1, 2, val)) { + // 2 digits hex codes + result += static_cast(val); + i += 2; // 'XX' + } else { + result += component[i]; + } + } + } else { + result += component[i]; + } + } + return result; +} + +inline std::string encode_query_component(const std::string &component, + bool space_as_plus) { + std::string result; + result.reserve(component.size() * 3); + + for (size_t i = 0; i < component.size(); i++) { + auto c = static_cast(component[i]); + + // Unreserved characters per RFC 3986 + if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { + result += static_cast(c); + } + // Space handling + else if (c == ' ') { + if (space_as_plus) { + result += '+'; + } else { + result += "%20"; + } + } + // Plus sign handling + else if (c == '+') { + if (space_as_plus) { + result += "%2B"; + } else { + result += static_cast(c); + } + } + // Query-safe sub-delimiters (excluding & and = which are query delimiters) + else if (c == '!' || c == '$' || c == '\'' || c == '(' || c == ')' || + c == '*' || c == ',' || c == ';') { + result += static_cast(c); + } + // Colon and @ are allowed in query + else if (c == ':' || c == '@') { + result += static_cast(c); + } + // Forward slash is allowed in query values + else if (c == '/') { + result += static_cast(c); + } + // Question mark is allowed in query values (after first ?) + else if (c == '?') { + result += static_cast(c); + } else { + result += '%'; + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", c); + result.append(hex, 2); + } + } + return result; +} + +inline std::string decode_query_component(const std::string &component, + bool plus_as_space) { + std::string result; + result.reserve(component.size()); + + for (size_t i = 0; i < component.size(); i++) { + if (component[i] == '%' && i + 2 < component.size()) { + std::string hex = component.substr(i + 1, 2); + char *end; + unsigned long value = std::strtoul(hex.c_str(), &end, 16); + if (end == hex.c_str() + 2) { + result += static_cast(value); + i += 2; + } else { + result += component[i]; + } + } else if (component[i] == '+' && plus_as_space) { + result += ' '; // + becomes space in form-urlencoded + } else { + result += component[i]; + } + } + return result; +} + +inline std::string append_query_params(const std::string &path, + const Params ¶ms) { + std::string path_with_query = path; + thread_local const std::regex re("[^?]+\\?.*"); + auto delm = std::regex_match(path, re) ? '&' : '?'; + path_with_query += delm + detail::params_to_query_str(params); + return path_with_query; +} + +// Header utilities +inline std::pair +make_range_header(const Ranges &ranges) { + std::string field = "bytes="; + auto i = 0; + for (const auto &r : ranges) { + if (i != 0) { field += ", "; } + if (r.first != -1) { field += std::to_string(r.first); } + field += '-'; + if (r.second != -1) { field += std::to_string(r.second); } + i++; + } + return std::make_pair("Range", std::move(field)); +} + +inline std::pair +make_basic_authentication_header(const std::string &username, + const std::string &password, bool is_proxy) { + auto field = "Basic " + detail::base64_encode(username + ":" + password); + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +inline std::pair +make_bearer_token_authentication_header(const std::string &token, + bool is_proxy = false) { + auto field = "Bearer " + token; + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +// Request implementation +inline bool Request::has_header(const std::string &key) const { + return detail::has_header(headers, key); +} + +inline std::string Request::get_header_value(const std::string &key, + const char *def, size_t id) const { + return detail::get_header_value(headers, key, def, id); +} + +inline size_t Request::get_header_value_count(const std::string &key) const { + auto r = headers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline void Request::set_header(const std::string &key, + const std::string &val) { + if (detail::fields::is_field_name(key) && + detail::fields::is_field_value(val)) { + headers.emplace(key, val); + } +} + +inline bool Request::has_trailer(const std::string &key) const { + return trailers.find(key) != trailers.end(); +} + +inline std::string Request::get_trailer_value(const std::string &key, + size_t id) const { + auto rng = trailers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return std::string(); +} + +inline size_t Request::get_trailer_value_count(const std::string &key) const { + auto r = trailers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline bool Request::has_param(const std::string &key) const { + return params.find(key) != params.end(); +} + +inline std::string Request::get_param_value(const std::string &key, + size_t id) const { + auto rng = params.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return std::string(); +} + +inline size_t Request::get_param_value_count(const std::string &key) const { + auto r = params.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline bool Request::is_multipart_form_data() const { + const auto &content_type = get_header_value("Content-Type"); + return !content_type.rfind("multipart/form-data", 0); +} + +// Multipart FormData implementation +inline std::string MultipartFormData::get_field(const std::string &key, + size_t id) const { + auto rng = fields.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second.content; } + return std::string(); +} + +inline std::vector +MultipartFormData::get_fields(const std::string &key) const { + std::vector values; + auto rng = fields.equal_range(key); + for (auto it = rng.first; it != rng.second; it++) { + values.push_back(it->second.content); + } + return values; +} + +inline bool MultipartFormData::has_field(const std::string &key) const { + return fields.find(key) != fields.end(); +} + +inline size_t MultipartFormData::get_field_count(const std::string &key) const { + auto r = fields.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline FormData MultipartFormData::get_file(const std::string &key, + size_t id) const { + auto rng = files.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return FormData(); +} + +inline std::vector +MultipartFormData::get_files(const std::string &key) const { + std::vector values; + auto rng = files.equal_range(key); + for (auto it = rng.first; it != rng.second; it++) { + values.push_back(it->second); + } + return values; +} + +inline bool MultipartFormData::has_file(const std::string &key) const { + return files.find(key) != files.end(); +} + +inline size_t MultipartFormData::get_file_count(const std::string &key) const { + auto r = files.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +// Response implementation +inline bool Response::has_header(const std::string &key) const { + return headers.find(key) != headers.end(); +} + +inline std::string Response::get_header_value(const std::string &key, + const char *def, + size_t id) const { + return detail::get_header_value(headers, key, def, id); +} + +inline size_t Response::get_header_value_count(const std::string &key) const { + auto r = headers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline void Response::set_header(const std::string &key, + const std::string &val) { + if (detail::fields::is_field_name(key) && + detail::fields::is_field_value(val)) { + headers.emplace(key, val); + } +} +inline bool Response::has_trailer(const std::string &key) const { + return trailers.find(key) != trailers.end(); +} + +inline std::string Response::get_trailer_value(const std::string &key, + size_t id) const { + auto rng = trailers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return std::string(); +} + +inline size_t Response::get_trailer_value_count(const std::string &key) const { + auto r = trailers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline void Response::set_redirect(const std::string &url, int stat) { + if (detail::fields::is_field_value(url)) { + set_header("Location", url); + if (300 <= stat && stat < 400) { + this->status = stat; + } else { + this->status = StatusCode::Found_302; + } + } +} + +inline void Response::set_content(const char *s, size_t n, + const std::string &content_type) { + body.assign(s, n); + + auto rng = headers.equal_range("Content-Type"); + headers.erase(rng.first, rng.second); + set_header("Content-Type", content_type); +} + +inline void Response::set_content(const std::string &s, + const std::string &content_type) { + set_content(s.data(), s.size(), content_type); +} + +inline void Response::set_content(std::string &&s, + const std::string &content_type) { + body = std::move(s); + + auto rng = headers.equal_range("Content-Type"); + headers.erase(rng.first, rng.second); + set_header("Content-Type", content_type); +} + +inline void Response::set_content_provider( + size_t in_length, const std::string &content_type, ContentProvider provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = in_length; + if (in_length > 0) { content_provider_ = std::move(provider); } + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = false; +} + +inline void Response::set_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = false; +} + +inline void Response::set_chunked_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = true; +} + +inline void Response::set_file_content(const std::string &path, + const std::string &content_type) { + file_content_path_ = path; + file_content_content_type_ = content_type; +} + +inline void Response::set_file_content(const std::string &path) { + file_content_path_ = path; +} + +// Result implementation +inline bool Result::has_request_header(const std::string &key) const { + return request_headers_.find(key) != request_headers_.end(); +} + +inline std::string Result::get_request_header_value(const std::string &key, + const char *def, + size_t id) const { + return detail::get_header_value(request_headers_, key, def, id); +} + +inline size_t +Result::get_request_header_value_count(const std::string &key) const { + auto r = request_headers_.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +// Stream implementation +inline ssize_t Stream::write(const char *ptr) { + return write(ptr, strlen(ptr)); +} + +inline ssize_t Stream::write(const std::string &s) { + return write(s.data(), s.size()); +} + +namespace detail { + +inline void calc_actual_timeout(time_t max_timeout_msec, time_t duration_msec, + time_t timeout_sec, time_t timeout_usec, + time_t &actual_timeout_sec, + time_t &actual_timeout_usec) { + auto timeout_msec = (timeout_sec * 1000) + (timeout_usec / 1000); + + auto actual_timeout_msec = + (std::min)(max_timeout_msec - duration_msec, timeout_msec); + + if (actual_timeout_msec < 0) { actual_timeout_msec = 0; } + + actual_timeout_sec = actual_timeout_msec / 1000; + actual_timeout_usec = (actual_timeout_msec % 1000) * 1000; +} + +// Socket stream implementation +inline SocketStream::SocketStream( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time) + : sock_(sock), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec), + max_timeout_msec_(max_timeout_msec), start_time_(start_time), + read_buff_(read_buff_size_, 0) {} + +inline SocketStream::~SocketStream() = default; + +inline bool SocketStream::is_readable() const { + return read_buff_off_ < read_buff_content_size_; +} + +inline bool SocketStream::wait_readable() const { + if (max_timeout_msec_ <= 0) { + return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; + } + + time_t read_timeout_sec; + time_t read_timeout_usec; + calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, + read_timeout_usec_, read_timeout_sec, read_timeout_usec); + + return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; +} + +inline bool SocketStream::wait_writable() const { + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && + is_socket_alive(sock_); +} + +inline ssize_t SocketStream::read(char *ptr, size_t size) { +#ifdef _WIN32 + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#else + size = (std::min)(size, + static_cast((std::numeric_limits::max)())); +#endif + + if (read_buff_off_ < read_buff_content_size_) { + auto remaining_size = read_buff_content_size_ - read_buff_off_; + if (size <= remaining_size) { + memcpy(ptr, read_buff_.data() + read_buff_off_, size); + read_buff_off_ += size; + return static_cast(size); + } else { + memcpy(ptr, read_buff_.data() + read_buff_off_, remaining_size); + read_buff_off_ += remaining_size; + return static_cast(remaining_size); + } + } + + if (!wait_readable()) { return -1; } + + read_buff_off_ = 0; + read_buff_content_size_ = 0; + + if (size < read_buff_size_) { + auto n = read_socket(sock_, read_buff_.data(), read_buff_size_, + CPPHTTPLIB_RECV_FLAGS); + if (n <= 0) { + return n; + } else if (n <= static_cast(size)) { + memcpy(ptr, read_buff_.data(), static_cast(n)); + return n; + } else { + memcpy(ptr, read_buff_.data(), size); + read_buff_off_ = size; + read_buff_content_size_ = static_cast(n); + return static_cast(size); + } + } else { + return read_socket(sock_, ptr, size, CPPHTTPLIB_RECV_FLAGS); + } +} + +inline ssize_t SocketStream::write(const char *ptr, size_t size) { + if (!wait_writable()) { return -1; } + +#if defined(_WIN32) && !defined(_WIN64) + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#endif + + return send_socket(sock_, ptr, size, CPPHTTPLIB_SEND_FLAGS); +} + +inline void SocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + return detail::get_remote_ip_and_port(sock_, ip, port); +} + +inline void SocketStream::get_local_ip_and_port(std::string &ip, + int &port) const { + return detail::get_local_ip_and_port(sock_, ip, port); +} + +inline socket_t SocketStream::socket() const { return sock_; } + +inline time_t SocketStream::duration() const { + return std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time_) + .count(); +} + +// Buffer stream implementation +inline bool BufferStream::is_readable() const { return true; } + +inline bool BufferStream::wait_readable() const { return true; } + +inline bool BufferStream::wait_writable() const { return true; } + +inline ssize_t BufferStream::read(char *ptr, size_t size) { +#if defined(_MSC_VER) && _MSC_VER < 1910 + auto len_read = buffer._Copy_s(ptr, size, size, position); +#else + auto len_read = buffer.copy(ptr, size, position); +#endif + position += static_cast(len_read); + return static_cast(len_read); +} + +inline ssize_t BufferStream::write(const char *ptr, size_t size) { + buffer.append(ptr, size); + return static_cast(size); +} + +inline void BufferStream::get_remote_ip_and_port(std::string & /*ip*/, + int & /*port*/) const {} + +inline void BufferStream::get_local_ip_and_port(std::string & /*ip*/, + int & /*port*/) const {} + +inline socket_t BufferStream::socket() const { return 0; } + +inline time_t BufferStream::duration() const { return 0; } + +inline const std::string &BufferStream::get_buffer() const { return buffer; } + +inline PathParamsMatcher::PathParamsMatcher(const std::string &pattern) + : MatcherBase(pattern) { + constexpr const char marker[] = "/:"; + + // One past the last ending position of a path param substring + std::size_t last_param_end = 0; + +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + // Needed to ensure that parameter names are unique during matcher + // construction + // If exceptions are disabled, only last duplicate path + // parameter will be set + std::unordered_set param_name_set; +#endif + + while (true) { + const auto marker_pos = pattern.find( + marker, last_param_end == 0 ? last_param_end : last_param_end - 1); + if (marker_pos == std::string::npos) { break; } + + static_fragments_.push_back( + pattern.substr(last_param_end, marker_pos - last_param_end + 1)); + + const auto param_name_start = marker_pos + str_len(marker); + + auto sep_pos = pattern.find(separator, param_name_start); + if (sep_pos == std::string::npos) { sep_pos = pattern.length(); } + + auto param_name = + pattern.substr(param_name_start, sep_pos - param_name_start); + +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + if (param_name_set.find(param_name) != param_name_set.cend()) { + std::string msg = "Encountered path parameter '" + param_name + + "' multiple times in route pattern '" + pattern + "'."; + throw std::invalid_argument(msg); + } +#endif + + param_names_.push_back(std::move(param_name)); + + last_param_end = sep_pos + 1; + } + + if (last_param_end < pattern.length()) { + static_fragments_.push_back(pattern.substr(last_param_end)); + } +} + +inline bool PathParamsMatcher::match(Request &request) const { + request.matches = std::smatch(); + request.path_params.clear(); + request.path_params.reserve(param_names_.size()); + + // One past the position at which the path matched the pattern last time + std::size_t starting_pos = 0; + for (size_t i = 0; i < static_fragments_.size(); ++i) { + const auto &fragment = static_fragments_[i]; + + if (starting_pos + fragment.length() > request.path.length()) { + return false; + } + + // Avoid unnecessary allocation by using strncmp instead of substr + + // comparison + if (std::strncmp(request.path.c_str() + starting_pos, fragment.c_str(), + fragment.length()) != 0) { + return false; + } + + starting_pos += fragment.length(); + + // Should only happen when we have a static fragment after a param + // Example: '/users/:id/subscriptions' + // The 'subscriptions' fragment here does not have a corresponding param + if (i >= param_names_.size()) { continue; } + + auto sep_pos = request.path.find(separator, starting_pos); + if (sep_pos == std::string::npos) { sep_pos = request.path.length(); } + + const auto ¶m_name = param_names_[i]; + + request.path_params.emplace( + param_name, request.path.substr(starting_pos, sep_pos - starting_pos)); + + // Mark everything up to '/' as matched + starting_pos = sep_pos + 1; + } + // Returns false if the path is longer than the pattern + return starting_pos >= request.path.length(); +} + +inline bool RegexMatcher::match(Request &request) const { + request.path_params.clear(); + return std::regex_match(request.path, request.matches, regex_); +} + +inline std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl) { + std::string result; + + // Enclose IPv6 address in brackets (but not if already enclosed) + if (host.find(':') == std::string::npos || + (!host.empty() && host[0] == '[')) { + // IPv4, hostname, or already bracketed IPv6 + result = host; + } else { + // IPv6 address without brackets + result = "[" + host + "]"; + } + + // Append port if not default + if ((!is_ssl && port == 80) || (is_ssl && port == 443)) { + ; // do nothing + } else { + result += ":" + std::to_string(port); + } + + return result; +} + +} // namespace detail + +// HTTP server implementation +inline Server::Server() + : new_task_queue( + [] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); }) { +#ifndef _WIN32 + signal(SIGPIPE, SIG_IGN); +#endif +} + +inline Server::~Server() = default; + +inline std::unique_ptr +Server::make_matcher(const std::string &pattern) { + if (pattern.find("/:") != std::string::npos) { + return detail::make_unique(pattern); + } else { + return detail::make_unique(pattern); + } +} + +inline Server &Server::Get(const std::string &pattern, Handler handler) { + get_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +inline Server &Server::Post(const std::string &pattern, Handler handler) { + post_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +inline Server &Server::Post(const std::string &pattern, + HandlerWithContentReader handler) { + post_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +inline Server &Server::Put(const std::string &pattern, Handler handler) { + put_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +inline Server &Server::Put(const std::string &pattern, + HandlerWithContentReader handler) { + put_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +inline Server &Server::Patch(const std::string &pattern, Handler handler) { + patch_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +inline Server &Server::Patch(const std::string &pattern, + HandlerWithContentReader handler) { + patch_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +inline Server &Server::Delete(const std::string &pattern, Handler handler) { + delete_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +inline Server &Server::Delete(const std::string &pattern, + HandlerWithContentReader handler) { + delete_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +inline Server &Server::Options(const std::string &pattern, Handler handler) { + options_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +inline bool Server::set_base_dir(const std::string &dir, + const std::string &mount_point) { + return set_mount_point(mount_point, dir); +} + +inline bool Server::set_mount_point(const std::string &mount_point, + const std::string &dir, Headers headers) { + detail::FileStat stat(dir); + if (stat.is_dir()) { + std::string mnt = !mount_point.empty() ? mount_point : "/"; + if (!mnt.empty() && mnt[0] == '/') { + base_dirs_.push_back({mnt, dir, std::move(headers)}); + return true; + } + } + return false; +} + +inline bool Server::remove_mount_point(const std::string &mount_point) { + for (auto it = base_dirs_.begin(); it != base_dirs_.end(); ++it) { + if (it->mount_point == mount_point) { + base_dirs_.erase(it); + return true; + } + } + return false; +} + +inline Server & +Server::set_file_extension_and_mimetype_mapping(const std::string &ext, + const std::string &mime) { + file_extension_and_mimetype_map_[ext] = mime; + return *this; +} + +inline Server &Server::set_default_file_mimetype(const std::string &mime) { + default_file_mimetype_ = mime; + return *this; +} + +inline Server &Server::set_file_request_handler(Handler handler) { + file_request_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_error_handler_core(HandlerWithResponse handler, + std::true_type) { + error_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_error_handler_core(Handler handler, + std::false_type) { + error_handler_ = [handler](const Request &req, Response &res) { + handler(req, res); + return HandlerResponse::Handled; + }; + return *this; +} + +inline Server &Server::set_exception_handler(ExceptionHandler handler) { + exception_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_pre_routing_handler(HandlerWithResponse handler) { + pre_routing_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_post_routing_handler(Handler handler) { + post_routing_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_pre_request_handler(HandlerWithResponse handler) { + pre_request_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_logger(Logger logger) { + logger_ = std::move(logger); + return *this; +} + +inline Server &Server::set_error_logger(ErrorLogger error_logger) { + error_logger_ = std::move(error_logger); + return *this; +} + +inline Server &Server::set_pre_compression_logger(Logger logger) { + pre_compression_logger_ = std::move(logger); + return *this; +} + +inline Server & +Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) { + expect_100_continue_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_address_family(int family) { + address_family_ = family; + return *this; +} + +inline Server &Server::set_tcp_nodelay(bool on) { + tcp_nodelay_ = on; + return *this; +} + +inline Server &Server::set_ipv6_v6only(bool on) { + ipv6_v6only_ = on; + return *this; +} + +inline Server &Server::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); + return *this; +} + +inline Server &Server::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); + return *this; +} + +inline Server &Server::set_header_writer( + std::function const &writer) { + header_writer_ = writer; + return *this; +} + +inline Server & +Server::set_trusted_proxies(const std::vector &proxies) { + trusted_proxies_ = proxies; + return *this; +} + +inline Server &Server::set_keep_alive_max_count(size_t count) { + keep_alive_max_count_ = count; + return *this; +} + +inline Server &Server::set_keep_alive_timeout(time_t sec) { + keep_alive_timeout_sec_ = sec; + return *this; +} + +inline Server &Server::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; + return *this; +} + +inline Server &Server::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; + return *this; +} + +inline Server &Server::set_idle_interval(time_t sec, time_t usec) { + idle_interval_sec_ = sec; + idle_interval_usec_ = usec; + return *this; +} + +inline Server &Server::set_payload_max_length(size_t length) { + payload_max_length_ = length; + return *this; +} + +inline bool Server::bind_to_port(const std::string &host, int port, + int socket_flags) { + auto ret = bind_internal(host, port, socket_flags); + if (ret == -1) { is_decommissioned = true; } + return ret >= 0; +} +inline int Server::bind_to_any_port(const std::string &host, int socket_flags) { + auto ret = bind_internal(host, 0, socket_flags); + if (ret == -1) { is_decommissioned = true; } + return ret; +} + +inline bool Server::listen_after_bind() { return listen_internal(); } + +inline bool Server::listen(const std::string &host, int port, + int socket_flags) { + return bind_to_port(host, port, socket_flags) && listen_internal(); +} + +inline bool Server::is_running() const { return is_running_; } + +inline void Server::wait_until_ready() const { + while (!is_running_ && !is_decommissioned) { + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + } +} + +inline void Server::stop() { + if (is_running_) { + assert(svr_sock_ != INVALID_SOCKET); + std::atomic sock(svr_sock_.exchange(INVALID_SOCKET)); + detail::shutdown_socket(sock); + detail::close_socket(sock); + } + is_decommissioned = false; +} + +inline void Server::decommission() { is_decommissioned = true; } + +inline bool Server::parse_request_line(const char *s, Request &req) const { + auto len = strlen(s); + if (len < 2 || s[len - 2] != '\r' || s[len - 1] != '\n') { return false; } + len -= 2; + + { + size_t count = 0; + + detail::split(s, s + len, ' ', [&](const char *b, const char *e) { + switch (count) { + case 0: req.method = std::string(b, e); break; + case 1: req.target = std::string(b, e); break; + case 2: req.version = std::string(b, e); break; + default: break; + } + count++; + }); + + if (count != 3) { return false; } + } + + thread_local const std::set methods{ + "GET", "HEAD", "POST", "PUT", "DELETE", + "CONNECT", "OPTIONS", "TRACE", "PATCH", "PRI"}; + + if (methods.find(req.method) == methods.end()) { + output_error_log(Error::InvalidHTTPMethod, &req); + return false; + } + + if (req.version != "HTTP/1.1" && req.version != "HTTP/1.0") { + output_error_log(Error::InvalidHTTPVersion, &req); + return false; + } + + { + // Skip URL fragment + for (size_t i = 0; i < req.target.size(); i++) { + if (req.target[i] == '#') { + req.target.erase(i); + break; + } + } + + detail::divide(req.target, '?', + [&](const char *lhs_data, std::size_t lhs_size, + const char *rhs_data, std::size_t rhs_size) { + req.path = + decode_path_component(std::string(lhs_data, lhs_size)); + detail::parse_query_text(rhs_data, rhs_size, req.params); + }); + } + + return true; +} + +inline bool Server::write_response(Stream &strm, bool close_connection, + Request &req, Response &res) { + // NOTE: `req.ranges` should be empty, otherwise it will be applied + // incorrectly to the error content. + req.ranges.clear(); + return write_response_core(strm, close_connection, req, res, false); +} + +inline bool Server::write_response_with_content(Stream &strm, + bool close_connection, + const Request &req, + Response &res) { + return write_response_core(strm, close_connection, req, res, true); +} + +inline bool Server::write_response_core(Stream &strm, bool close_connection, + const Request &req, Response &res, + bool need_apply_ranges) { + assert(res.status != -1); + + if (400 <= res.status && error_handler_ && + error_handler_(req, res) == HandlerResponse::Handled) { + need_apply_ranges = true; + } + + std::string content_type; + std::string boundary; + if (need_apply_ranges) { apply_ranges(req, res, content_type, boundary); } + + // Prepare additional headers + if (close_connection || req.get_header_value("Connection") == "close" || + 400 <= res.status) { // Don't leave connections open after errors + res.set_header("Connection", "close"); + } else { + std::string s = "timeout="; + s += std::to_string(keep_alive_timeout_sec_); + s += ", max="; + s += std::to_string(keep_alive_max_count_); + res.set_header("Keep-Alive", s); + } + + if ((!res.body.empty() || res.content_length_ > 0 || res.content_provider_) && + !res.has_header("Content-Type")) { + res.set_header("Content-Type", "text/plain"); + } + + if (res.body.empty() && !res.content_length_ && !res.content_provider_ && + !res.has_header("Content-Length")) { + res.set_header("Content-Length", "0"); + } + + if (req.method == "HEAD" && !res.has_header("Accept-Ranges")) { + res.set_header("Accept-Ranges", "bytes"); + } + + if (post_routing_handler_) { post_routing_handler_(req, res); } + + // Response line and headers + { + detail::BufferStream bstrm; + if (!detail::write_response_line(bstrm, res.status)) { return false; } + if (!header_writer_(bstrm, res.headers)) { return false; } + + // Flush buffer + auto &data = bstrm.get_buffer(); + detail::write_data(strm, data.data(), data.size()); + } + + // Body + auto ret = true; + if (req.method != "HEAD") { + if (!res.body.empty()) { + if (!detail::write_data(strm, res.body.data(), res.body.size())) { + ret = false; + } + } else if (res.content_provider_) { + if (write_content_with_provider(strm, req, res, boundary, content_type)) { + res.content_provider_success_ = true; + } else { + ret = false; + } + } + } + + // Log + output_log(req, res); + + return ret; +} + +inline bool +Server::write_content_with_provider(Stream &strm, const Request &req, + Response &res, const std::string &boundary, + const std::string &content_type) { + auto is_shutting_down = [this]() { + return this->svr_sock_ == INVALID_SOCKET; + }; + + if (res.content_length_ > 0) { + if (req.ranges.empty()) { + return detail::write_content(strm, res.content_provider_, 0, + res.content_length_, is_shutting_down); + } else if (req.ranges.size() == 1) { + auto offset_and_length = detail::get_range_offset_and_length( + req.ranges[0], res.content_length_); + + return detail::write_content(strm, res.content_provider_, + offset_and_length.first, + offset_and_length.second, is_shutting_down); + } else { + return detail::write_multipart_ranges_data( + strm, req, res, boundary, content_type, res.content_length_, + is_shutting_down); + } + } else { + if (res.is_chunked_content_provider_) { + auto type = detail::encoding_type(req, res); + + std::unique_ptr compressor; + if (type == detail::EncodingType::Gzip) { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + compressor = detail::make_unique(); +#endif + } else if (type == detail::EncodingType::Brotli) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + compressor = detail::make_unique(); +#endif + } else if (type == detail::EncodingType::Zstd) { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + compressor = detail::make_unique(); +#endif + } else { + compressor = detail::make_unique(); + } + assert(compressor != nullptr); + + return detail::write_content_chunked(strm, res.content_provider_, + is_shutting_down, *compressor); + } else { + return detail::write_content_without_length(strm, res.content_provider_, + is_shutting_down); + } + } +} + +inline bool Server::read_content(Stream &strm, Request &req, Response &res) { + FormFields::iterator cur_field; + FormFiles::iterator cur_file; + auto is_text_field = false; + size_t count = 0; + if (read_content_core( + strm, req, res, + // Regular + [&](const char *buf, size_t n) { + if (req.body.size() + n > req.body.max_size()) { return false; } + req.body.append(buf, n); + return true; + }, + // Multipart FormData + [&](const FormData &file) { + if (count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) { + output_error_log(Error::TooManyFormDataFiles, &req); + return false; + } + + if (file.filename.empty()) { + cur_field = req.form.fields.emplace( + file.name, FormField{file.name, file.content, file.headers}); + is_text_field = true; + } else { + cur_file = req.form.files.emplace(file.name, file); + is_text_field = false; + } + return true; + }, + [&](const char *buf, size_t n) { + if (is_text_field) { + auto &content = cur_field->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + } else { + auto &content = cur_file->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + } + return true; + })) { + const auto &content_type = req.get_header_value("Content-Type"); + if (!content_type.find("application/x-www-form-urlencoded")) { + if (req.body.size() > CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH) { + res.status = StatusCode::PayloadTooLarge_413; // NOTE: should be 414? + output_error_log(Error::ExceedMaxPayloadSize, &req); + return false; + } + detail::parse_query_text(req.body, req.params); + } + return true; + } + return false; +} + +inline bool Server::read_content_with_content_receiver( + Stream &strm, Request &req, Response &res, ContentReceiver receiver, + FormDataHeader multipart_header, ContentReceiver multipart_receiver) { + return read_content_core(strm, req, res, std::move(receiver), + std::move(multipart_header), + std::move(multipart_receiver)); +} + +inline bool Server::read_content_core( + Stream &strm, Request &req, Response &res, ContentReceiver receiver, + FormDataHeader multipart_header, ContentReceiver multipart_receiver) const { + detail::FormDataParser multipart_form_data_parser; + ContentReceiverWithProgress out; + + if (req.is_multipart_form_data()) { + const auto &content_type = req.get_header_value("Content-Type"); + std::string boundary; + if (!detail::parse_multipart_boundary(content_type, boundary)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::MultipartParsing, &req); + return false; + } + + multipart_form_data_parser.set_boundary(std::move(boundary)); + out = [&](const char *buf, size_t n, size_t /*off*/, size_t /*len*/) { + return multipart_form_data_parser.parse(buf, n, multipart_header, + multipart_receiver); + }; + } else { + out = [receiver](const char *buf, size_t n, size_t /*off*/, + size_t /*len*/) { return receiver(buf, n); }; + } + + // RFC 7230 Section 3.3.3: If this is a request message and none of the above + // are true (no Transfer-Encoding and no Content-Length), then the message + // body length is zero (no message body is present). + if (!req.has_header("Content-Length") && + !detail::is_chunked_transfer_encoding(req.headers)) { + return true; + } + + if (!detail::read_content(strm, req, payload_max_length_, res.status, nullptr, + out, true)) { + return false; + } + + if (req.is_multipart_form_data()) { + if (!multipart_form_data_parser.is_valid()) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::MultipartParsing, &req); + return false; + } + } + + return true; +} + +inline bool Server::handle_file_request(const Request &req, Response &res) { + for (const auto &entry : base_dirs_) { + // Prefix match + if (!req.path.compare(0, entry.mount_point.size(), entry.mount_point)) { + std::string sub_path = "/" + req.path.substr(entry.mount_point.size()); + if (detail::is_valid_path(sub_path)) { + auto path = entry.base_dir + sub_path; + if (path.back() == '/') { path += "index.html"; } + + detail::FileStat stat(path); + + if (stat.is_dir()) { + res.set_redirect(sub_path + "/", StatusCode::MovedPermanently_301); + return true; + } + + if (stat.is_file()) { + for (const auto &kv : entry.headers) { + res.set_header(kv.first, kv.second); + } + + auto mm = std::make_shared(path.c_str()); + if (!mm->is_open()) { + output_error_log(Error::OpenFile, &req); + return false; + } + + res.set_content_provider( + mm->size(), + detail::find_content_type(path, file_extension_and_mimetype_map_, + default_file_mimetype_), + [mm](size_t offset, size_t length, DataSink &sink) -> bool { + sink.write(mm->data() + offset, length); + return true; + }); + + if (req.method != "HEAD" && file_request_handler_) { + file_request_handler_(req, res); + } + + return true; + } else { + output_error_log(Error::OpenFile, &req); + } + } + } + } + return false; +} + +inline socket_t +Server::create_server_socket(const std::string &host, int port, + int socket_flags, + SocketOptions socket_options) const { + return detail::create_socket( + host, std::string(), port, address_family_, socket_flags, tcp_nodelay_, + ipv6_v6only_, std::move(socket_options), + [&](socket_t sock, struct addrinfo &ai, bool & /*quit*/) -> bool { + if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + output_error_log(Error::BindIPAddress, nullptr); + return false; + } + if (::listen(sock, CPPHTTPLIB_LISTEN_BACKLOG)) { + output_error_log(Error::Listen, nullptr); + return false; + } + return true; + }); +} + +inline int Server::bind_internal(const std::string &host, int port, + int socket_flags) { + if (is_decommissioned) { return -1; } + + if (!is_valid()) { return -1; } + + svr_sock_ = create_server_socket(host, port, socket_flags, socket_options_); + if (svr_sock_ == INVALID_SOCKET) { return -1; } + + if (port == 0) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(svr_sock_, reinterpret_cast(&addr), + &addr_len) == -1) { + output_error_log(Error::GetSockName, nullptr); + return -1; + } + if (addr.ss_family == AF_INET) { + return ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + return ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + output_error_log(Error::UnsupportedAddressFamily, nullptr); + return -1; + } + } else { + return port; + } +} + +inline bool Server::listen_internal() { + if (is_decommissioned) { return false; } + + auto ret = true; + is_running_ = true; + auto se = detail::scope_exit([&]() { is_running_ = false; }); + + { + std::unique_ptr task_queue(new_task_queue()); + + while (svr_sock_ != INVALID_SOCKET) { +#ifndef _WIN32 + if (idle_interval_sec_ > 0 || idle_interval_usec_ > 0) { +#endif + auto val = detail::select_read(svr_sock_, idle_interval_sec_, + idle_interval_usec_); + if (val == 0) { // Timeout + task_queue->on_idle(); + continue; + } +#ifndef _WIN32 + } +#endif + +#if defined _WIN32 + // sockets connected via WASAccept inherit flags NO_HANDLE_INHERIT, + // OVERLAPPED + socket_t sock = WSAAccept(svr_sock_, nullptr, nullptr, nullptr, 0); +#elif defined SOCK_CLOEXEC + socket_t sock = accept4(svr_sock_, nullptr, nullptr, SOCK_CLOEXEC); +#else + socket_t sock = accept(svr_sock_, nullptr, nullptr); +#endif + + if (sock == INVALID_SOCKET) { + if (errno == EMFILE) { + // The per-process limit of open file descriptors has been reached. + // Try to accept new connections after a short sleep. + std::this_thread::sleep_for(std::chrono::microseconds{1}); + continue; + } else if (errno == EINTR || errno == EAGAIN) { + continue; + } + if (svr_sock_ != INVALID_SOCKET) { + detail::close_socket(svr_sock_); + ret = false; + output_error_log(Error::Connection, nullptr); + } else { + ; // The server socket was closed by user. + } + break; + } + + detail::set_socket_opt_time(sock, SOL_SOCKET, SO_RCVTIMEO, + read_timeout_sec_, read_timeout_usec_); + detail::set_socket_opt_time(sock, SOL_SOCKET, SO_SNDTIMEO, + write_timeout_sec_, write_timeout_usec_); + + if (!task_queue->enqueue( + [this, sock]() { process_and_close_socket(sock); })) { + output_error_log(Error::ResourceExhaustion, nullptr); + detail::shutdown_socket(sock); + detail::close_socket(sock); + } + } + + task_queue->shutdown(); + } + + is_decommissioned = !ret; + return ret; +} + +inline bool Server::routing(Request &req, Response &res, Stream &strm) { + if (pre_routing_handler_ && + pre_routing_handler_(req, res) == HandlerResponse::Handled) { + return true; + } + + // File handler + if ((req.method == "GET" || req.method == "HEAD") && + handle_file_request(req, res)) { + return true; + } + + if (detail::expect_content(req)) { + // Content reader handler + { + ContentReader reader( + [&](ContentReceiver receiver) { + auto result = read_content_with_content_receiver( + strm, req, res, std::move(receiver), nullptr, nullptr); + if (!result) { output_error_log(Error::Read, &req); } + return result; + }, + [&](FormDataHeader header, ContentReceiver receiver) { + auto result = read_content_with_content_receiver( + strm, req, res, nullptr, std::move(header), + std::move(receiver)); + if (!result) { output_error_log(Error::Read, &req); } + return result; + }); + + if (req.method == "POST") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + post_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "PUT") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + put_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "PATCH") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + patch_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "DELETE") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + delete_handlers_for_content_reader_)) { + return true; + } + } + } + + // Read content into `req.body` + if (!read_content(strm, req, res)) { + output_error_log(Error::Read, &req); + return false; + } + } + + // Regular handler + if (req.method == "GET" || req.method == "HEAD") { + return dispatch_request(req, res, get_handlers_); + } else if (req.method == "POST") { + return dispatch_request(req, res, post_handlers_); + } else if (req.method == "PUT") { + return dispatch_request(req, res, put_handlers_); + } else if (req.method == "DELETE") { + return dispatch_request(req, res, delete_handlers_); + } else if (req.method == "OPTIONS") { + return dispatch_request(req, res, options_handlers_); + } else if (req.method == "PATCH") { + return dispatch_request(req, res, patch_handlers_); + } + + res.status = StatusCode::BadRequest_400; + return false; +} + +inline bool Server::dispatch_request(Request &req, Response &res, + const Handlers &handlers) const { + for (const auto &x : handlers) { + const auto &matcher = x.first; + const auto &handler = x.second; + + if (matcher->match(req)) { + req.matched_route = matcher->pattern(); + if (!pre_request_handler_ || + pre_request_handler_(req, res) != HandlerResponse::Handled) { + handler(req, res); + } + return true; + } + } + return false; +} + +inline void Server::apply_ranges(const Request &req, Response &res, + std::string &content_type, + std::string &boundary) const { + if (req.ranges.size() > 1 && res.status == StatusCode::PartialContent_206) { + auto it = res.headers.find("Content-Type"); + if (it != res.headers.end()) { + content_type = it->second; + res.headers.erase(it); + } + + boundary = detail::make_multipart_data_boundary(); + + res.set_header("Content-Type", + "multipart/byteranges; boundary=" + boundary); + } + + auto type = detail::encoding_type(req, res); + + if (res.body.empty()) { + if (res.content_length_ > 0) { + size_t length = 0; + if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { + length = res.content_length_; + } else if (req.ranges.size() == 1) { + auto offset_and_length = detail::get_range_offset_and_length( + req.ranges[0], res.content_length_); + + length = offset_and_length.second; + + auto content_range = detail::make_content_range_header_field( + offset_and_length, res.content_length_); + res.set_header("Content-Range", content_range); + } else { + length = detail::get_multipart_ranges_data_length( + req, boundary, content_type, res.content_length_); + } + res.set_header("Content-Length", std::to_string(length)); + } else { + if (res.content_provider_) { + if (res.is_chunked_content_provider_) { + res.set_header("Transfer-Encoding", "chunked"); + if (type == detail::EncodingType::Gzip) { + res.set_header("Content-Encoding", "gzip"); + } else if (type == detail::EncodingType::Brotli) { + res.set_header("Content-Encoding", "br"); + } else if (type == detail::EncodingType::Zstd) { + res.set_header("Content-Encoding", "zstd"); + } + } + } + } + } else { + if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { + ; + } else if (req.ranges.size() == 1) { + auto offset_and_length = + detail::get_range_offset_and_length(req.ranges[0], res.body.size()); + auto offset = offset_and_length.first; + auto length = offset_and_length.second; + + auto content_range = detail::make_content_range_header_field( + offset_and_length, res.body.size()); + res.set_header("Content-Range", content_range); + + assert(offset + length <= res.body.size()); + res.body = res.body.substr(offset, length); + } else { + std::string data; + detail::make_multipart_ranges_data(req, res, boundary, content_type, + res.body.size(), data); + res.body.swap(data); + } + + if (type != detail::EncodingType::None) { + output_pre_compression_log(req, res); + + std::unique_ptr compressor; + std::string content_encoding; + + if (type == detail::EncodingType::Gzip) { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + compressor = detail::make_unique(); + content_encoding = "gzip"; +#endif + } else if (type == detail::EncodingType::Brotli) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + compressor = detail::make_unique(); + content_encoding = "br"; +#endif + } else if (type == detail::EncodingType::Zstd) { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + compressor = detail::make_unique(); + content_encoding = "zstd"; +#endif + } + + if (compressor) { + std::string compressed; + if (compressor->compress(res.body.data(), res.body.size(), true, + [&](const char *data, size_t data_len) { + compressed.append(data, data_len); + return true; + })) { + res.body.swap(compressed); + res.set_header("Content-Encoding", content_encoding); + } + } + } + + auto length = std::to_string(res.body.size()); + res.set_header("Content-Length", length); + } +} + +inline bool Server::dispatch_request_for_content_reader( + Request &req, Response &res, ContentReader content_reader, + const HandlersForContentReader &handlers) const { + for (const auto &x : handlers) { + const auto &matcher = x.first; + const auto &handler = x.second; + + if (matcher->match(req)) { + req.matched_route = matcher->pattern(); + if (!pre_request_handler_ || + pre_request_handler_(req, res) != HandlerResponse::Handled) { + handler(req, res, content_reader); + } + return true; + } + } + return false; +} + +inline std::string +get_client_ip(const std::string &x_forwarded_for, + const std::vector &trusted_proxies) { + // X-Forwarded-For is a comma-separated list per RFC 7239 + std::vector ip_list; + detail::split(x_forwarded_for.data(), + x_forwarded_for.data() + x_forwarded_for.size(), ',', + [&](const char *b, const char *e) { + auto r = detail::trim(b, e, 0, static_cast(e - b)); + ip_list.emplace_back(std::string(b + r.first, b + r.second)); + }); + + for (size_t i = 0; i < ip_list.size(); ++i) { + auto ip = ip_list[i]; + + auto is_trusted_proxy = + std::any_of(trusted_proxies.begin(), trusted_proxies.end(), + [&](const std::string &proxy) { return ip == proxy; }); + + if (is_trusted_proxy) { + if (i == 0) { + // If the trusted proxy is the first IP, there's no preceding client IP + return ip; + } else { + // Return the IP immediately before the trusted proxy + return ip_list[i - 1]; + } + } + } + + // If no trusted proxy is found, return the first IP in the list + return ip_list.front(); +} + +inline bool +Server::process_request(Stream &strm, const std::string &remote_addr, + int remote_port, const std::string &local_addr, + int local_port, bool close_connection, + bool &connection_closed, + const std::function &setup_request) { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + // Connection has been closed on client + if (!line_reader.getline()) { return false; } + + Request req; + req.start_time_ = std::chrono::steady_clock::now(); + + Response res; + res.version = "HTTP/1.1"; + res.headers = default_headers_; + +#ifdef __APPLE__ + // Socket file descriptor exceeded FD_SETSIZE... + if (strm.socket() >= FD_SETSIZE) { + Headers dummy; + detail::read_headers(strm, dummy); + res.status = StatusCode::InternalServerError_500; + output_error_log(Error::ExceedMaxSocketDescriptorCount, &req); + return write_response(strm, close_connection, req, res); + } +#endif + + // Request line and headers + if (!parse_request_line(line_reader.ptr(), req)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::InvalidRequestLine, &req); + return write_response(strm, close_connection, req, res); + } + + // Request headers + if (!detail::read_headers(strm, req.headers)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::InvalidHeaders, &req); + return write_response(strm, close_connection, req, res); + } + + // Check if the request URI doesn't exceed the limit + if (req.target.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { + res.status = StatusCode::UriTooLong_414; + output_error_log(Error::ExceedUriMaxLength, &req); + return write_response(strm, close_connection, req, res); + } + + if (req.get_header_value("Connection") == "close") { + connection_closed = true; + } + + if (req.version == "HTTP/1.0" && + req.get_header_value("Connection") != "Keep-Alive") { + connection_closed = true; + } + + if (!trusted_proxies_.empty() && req.has_header("X-Forwarded-For")) { + auto x_forwarded_for = req.get_header_value("X-Forwarded-For"); + req.remote_addr = get_client_ip(x_forwarded_for, trusted_proxies_); + } else { + req.remote_addr = remote_addr; + } + req.remote_port = remote_port; + + req.local_addr = local_addr; + req.local_port = local_port; + + if (req.has_header("Accept")) { + const auto &accept_header = req.get_header_value("Accept"); + if (!detail::parse_accept_header(accept_header, req.accept_content_types)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::HTTPParsing, &req); + return write_response(strm, close_connection, req, res); + } + } + + if (req.has_header("Range")) { + const auto &range_header_value = req.get_header_value("Range"); + if (!detail::parse_range_header(range_header_value, req.ranges)) { + res.status = StatusCode::RangeNotSatisfiable_416; + output_error_log(Error::InvalidRangeHeader, &req); + return write_response(strm, close_connection, req, res); + } + } + + if (setup_request) { setup_request(req); } + + if (req.get_header_value("Expect") == "100-continue") { + int status = StatusCode::Continue_100; + if (expect_100_continue_handler_) { + status = expect_100_continue_handler_(req, res); + } + switch (status) { + case StatusCode::Continue_100: + case StatusCode::ExpectationFailed_417: + detail::write_response_line(strm, status); + strm.write("\r\n"); + break; + default: + connection_closed = true; + return write_response(strm, true, req, res); + } + } + + // Setup `is_connection_closed` method + auto sock = strm.socket(); + req.is_connection_closed = [sock]() { + return !detail::is_socket_alive(sock); + }; + + // Routing + auto routed = false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS + routed = routing(req, res, strm); +#else + try { + routed = routing(req, res, strm); + } catch (std::exception &e) { + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = StatusCode::InternalServerError_500; + std::string val; + auto s = e.what(); + for (size_t i = 0; s[i]; i++) { + switch (s[i]) { + case '\r': val += "\\r"; break; + case '\n': val += "\\n"; break; + default: val += s[i]; break; + } + } + res.set_header("EXCEPTION_WHAT", val); + } + } catch (...) { + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = StatusCode::InternalServerError_500; + res.set_header("EXCEPTION_WHAT", "UNKNOWN"); + } + } +#endif + if (routed) { + if (res.status == -1) { + res.status = req.ranges.empty() ? StatusCode::OK_200 + : StatusCode::PartialContent_206; + } + + // Serve file content by using a content provider + if (!res.file_content_path_.empty()) { + const auto &path = res.file_content_path_; + auto mm = std::make_shared(path.c_str()); + if (!mm->is_open()) { + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + res.status = StatusCode::NotFound_404; + output_error_log(Error::OpenFile, &req); + return write_response(strm, close_connection, req, res); + } + + auto content_type = res.file_content_content_type_; + if (content_type.empty()) { + content_type = detail::find_content_type( + path, file_extension_and_mimetype_map_, default_file_mimetype_); + } + + res.set_content_provider( + mm->size(), content_type, + [mm](size_t offset, size_t length, DataSink &sink) -> bool { + sink.write(mm->data() + offset, length); + return true; + }); + } + + if (detail::range_error(req, res)) { + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + res.status = StatusCode::RangeNotSatisfiable_416; + return write_response(strm, close_connection, req, res); + } + + return write_response_with_content(strm, close_connection, req, res); + } else { + if (res.status == -1) { res.status = StatusCode::NotFound_404; } + + return write_response(strm, close_connection, req, res); + } +} + +inline bool Server::is_valid() const { return true; } + +inline bool Server::process_and_close_socket(socket_t sock) { + std::string remote_addr; + int remote_port = 0; + detail::get_remote_ip_and_port(sock, remote_addr, remote_port); + + std::string local_addr; + int local_port = 0; + detail::get_local_ip_and_port(sock, local_addr, local_port); + + auto ret = detail::process_server_socket( + svr_sock_, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [&](Stream &strm, bool close_connection, bool &connection_closed) { + return process_request(strm, remote_addr, remote_port, local_addr, + local_port, close_connection, connection_closed, + nullptr); + }); + + detail::shutdown_socket(sock); + detail::close_socket(sock); + return ret; +} + +inline void Server::output_log(const Request &req, const Response &res) const { + if (logger_) { + std::lock_guard guard(logger_mutex_); + logger_(req, res); + } +} + +inline void Server::output_pre_compression_log(const Request &req, + const Response &res) const { + if (pre_compression_logger_) { + std::lock_guard guard(logger_mutex_); + pre_compression_logger_(req, res); + } +} + +inline void Server::output_error_log(const Error &err, + const Request *req) const { + if (error_logger_) { + std::lock_guard guard(logger_mutex_); + error_logger_(err, req); + } +} + +// HTTP client implementation +inline ClientImpl::ClientImpl(const std::string &host) + : ClientImpl(host, 80, std::string(), std::string()) {} + +inline ClientImpl::ClientImpl(const std::string &host, int port) + : ClientImpl(host, port, std::string(), std::string()) {} + +inline ClientImpl::ClientImpl(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : host_(detail::escape_abstract_namespace_unix_domain(host)), port_(port), + host_and_port_(detail::make_host_and_port_string(host_, port, is_ssl())), + client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} + +inline ClientImpl::~ClientImpl() { + // Wait until all the requests in flight are handled. + size_t retry_count = 10; + while (retry_count-- > 0) { + { + std::lock_guard guard(socket_mutex_); + if (socket_requests_in_flight_ == 0) { break; } + } + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + } + + std::lock_guard guard(socket_mutex_); + shutdown_socket(socket_); + close_socket(socket_); +} + +inline bool ClientImpl::is_valid() const { return true; } + +inline void ClientImpl::copy_settings(const ClientImpl &rhs) { + client_cert_path_ = rhs.client_cert_path_; + client_key_path_ = rhs.client_key_path_; + connection_timeout_sec_ = rhs.connection_timeout_sec_; + read_timeout_sec_ = rhs.read_timeout_sec_; + read_timeout_usec_ = rhs.read_timeout_usec_; + write_timeout_sec_ = rhs.write_timeout_sec_; + write_timeout_usec_ = rhs.write_timeout_usec_; + max_timeout_msec_ = rhs.max_timeout_msec_; + basic_auth_username_ = rhs.basic_auth_username_; + basic_auth_password_ = rhs.basic_auth_password_; + bearer_token_auth_token_ = rhs.bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + digest_auth_username_ = rhs.digest_auth_username_; + digest_auth_password_ = rhs.digest_auth_password_; +#endif + keep_alive_ = rhs.keep_alive_; + follow_location_ = rhs.follow_location_; + path_encode_ = rhs.path_encode_; + address_family_ = rhs.address_family_; + tcp_nodelay_ = rhs.tcp_nodelay_; + ipv6_v6only_ = rhs.ipv6_v6only_; + socket_options_ = rhs.socket_options_; + compress_ = rhs.compress_; + decompress_ = rhs.decompress_; + interface_ = rhs.interface_; + proxy_host_ = rhs.proxy_host_; + proxy_port_ = rhs.proxy_port_; + proxy_basic_auth_username_ = rhs.proxy_basic_auth_username_; + proxy_basic_auth_password_ = rhs.proxy_basic_auth_password_; + proxy_bearer_token_auth_token_ = rhs.proxy_bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + proxy_digest_auth_username_ = rhs.proxy_digest_auth_username_; + proxy_digest_auth_password_ = rhs.proxy_digest_auth_password_; +#endif +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + ca_cert_file_path_ = rhs.ca_cert_file_path_; + ca_cert_dir_path_ = rhs.ca_cert_dir_path_; + ca_cert_store_ = rhs.ca_cert_store_; +#endif +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + server_certificate_verification_ = rhs.server_certificate_verification_; + server_hostname_verification_ = rhs.server_hostname_verification_; + server_certificate_verifier_ = rhs.server_certificate_verifier_; +#endif + logger_ = rhs.logger_; + error_logger_ = rhs.error_logger_; +} + +inline socket_t ClientImpl::create_client_socket(Error &error) const { + if (!proxy_host_.empty() && proxy_port_ != -1) { + return detail::create_client_socket( + proxy_host_, std::string(), proxy_port_, address_family_, tcp_nodelay_, + ipv6_v6only_, socket_options_, connection_timeout_sec_, + connection_timeout_usec_, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, interface_, error); + } + + // Check is custom IP specified for host_ + std::string ip; + auto it = addr_map_.find(host_); + if (it != addr_map_.end()) { ip = it->second; } + + return detail::create_client_socket( + host_, ip, port_, address_family_, tcp_nodelay_, ipv6_v6only_, + socket_options_, connection_timeout_sec_, connection_timeout_usec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, interface_, error); +} + +inline bool ClientImpl::create_and_connect_socket(Socket &socket, + Error &error) { + auto sock = create_client_socket(error); + if (sock == INVALID_SOCKET) { return false; } + socket.sock = sock; + return true; +} + +inline void ClientImpl::shutdown_ssl(Socket & /*socket*/, + bool /*shutdown_gracefully*/) { + // If there are any requests in flight from threads other than us, then it's + // a thread-unsafe race because individual ssl* objects are not thread-safe. + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); +} + +inline void ClientImpl::shutdown_socket(Socket &socket) const { + if (socket.sock == INVALID_SOCKET) { return; } + detail::shutdown_socket(socket.sock); +} + +inline void ClientImpl::close_socket(Socket &socket) { + // If there are requests in flight in another thread, usually closing + // the socket will be fine and they will simply receive an error when + // using the closed socket, but it is still a bug since rarely the OS + // may reassign the socket id to be used for a new socket, and then + // suddenly they will be operating on a live socket that is different + // than the one they intended! + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); + + // It is also a bug if this happens while SSL is still active +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + assert(socket.ssl == nullptr); +#endif + if (socket.sock == INVALID_SOCKET) { return; } + detail::close_socket(socket.sock); + socket.sock = INVALID_SOCKET; +} + +inline bool ClientImpl::read_response_line(Stream &strm, const Request &req, + Response &res) const { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + if (!line_reader.getline()) { return false; } + +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r?\n"); +#else + thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r\n"); +#endif + + std::cmatch m; + if (!std::regex_match(line_reader.ptr(), m, re)) { + return req.method == "CONNECT"; + } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + + // Ignore '100 Continue' + while (res.status == StatusCode::Continue_100) { + if (!line_reader.getline()) { return false; } // CRLF + if (!line_reader.getline()) { return false; } // next response line + + if (!std::regex_match(line_reader.ptr(), m, re)) { return false; } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + } + + return true; +} + +inline bool ClientImpl::send(Request &req, Response &res, Error &error) { + std::lock_guard request_mutex_guard(request_mutex_); + auto ret = send_(req, res, error); + if (error == Error::SSLPeerCouldBeClosed_) { + assert(!ret); + ret = send_(req, res, error); + } + return ret; +} + +inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { + { + std::lock_guard guard(socket_mutex_); + + // Set this to false immediately - if it ever gets set to true by the end + // of the request, we know another thread instructed us to close the + // socket. + socket_should_be_closed_when_request_is_done_ = false; + + auto is_alive = false; + if (socket_.is_open()) { + is_alive = detail::is_socket_alive(socket_.sock); + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (is_alive && is_ssl()) { + if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { + is_alive = false; + } + } +#endif + + if (!is_alive) { + // Attempt to avoid sigpipe by shutting down non-gracefully if it + // seems like the other side has already closed the connection Also, + // there cannot be any requests in flight from other threads since we + // locked request_mutex_, so safe to close everything immediately + const bool shutdown_gracefully = false; + shutdown_ssl(socket_, shutdown_gracefully); + shutdown_socket(socket_); + close_socket(socket_); + } + } + + if (!is_alive) { + if (!create_and_connect_socket(socket_, error)) { + output_error_log(error, &req); + return false; + } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // TODO: refactoring + if (is_ssl()) { + auto &scli = static_cast(*this); + if (!proxy_host_.empty() && proxy_port_ != -1) { + auto success = false; + if (!scli.connect_with_proxy(socket_, req.start_time_, res, success, + error)) { + if (!success) { output_error_log(error, &req); } + return success; + } + } + + if (!scli.initialize_ssl(socket_, error)) { + output_error_log(error, &req); + return false; + } + } +#endif + } + + // Mark the current socket as being in use so that it cannot be closed by + // anyone else while this request is ongoing, even though we will be + // releasing the mutex. + if (socket_requests_in_flight_ > 1) { + assert(socket_requests_are_from_thread_ == std::this_thread::get_id()); + } + socket_requests_in_flight_ += 1; + socket_requests_are_from_thread_ = std::this_thread::get_id(); + } + + for (const auto &header : default_headers_) { + if (req.headers.find(header.first) == req.headers.end()) { + req.headers.insert(header); + } + } + + auto ret = false; + auto close_connection = !keep_alive_; + + auto se = detail::scope_exit([&]() { + // Briefly lock mutex in order to mark that a request is no longer ongoing + std::lock_guard guard(socket_mutex_); + socket_requests_in_flight_ -= 1; + if (socket_requests_in_flight_ <= 0) { + assert(socket_requests_in_flight_ == 0); + socket_requests_are_from_thread_ = std::thread::id(); + } + + if (socket_should_be_closed_when_request_is_done_ || close_connection || + !ret) { + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); + } + }); + + ret = process_socket(socket_, req.start_time_, [&](Stream &strm) { + return handle_request(strm, req, res, close_connection, error); + }); + + if (!ret) { + if (error == Error::Success) { + error = Error::Unknown; + output_error_log(error, &req); + } + } + + return ret; +} + +inline Result ClientImpl::send(const Request &req) { + auto req2 = req; + return send_(std::move(req2)); +} + +inline Result ClientImpl::send_(Request &&req) { + auto res = detail::make_unique(); + auto error = Error::Success; + auto ret = send(req, *res, error); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers), + last_ssl_error_, last_openssl_error_}; +#else + return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers)}; +#endif +} + +inline bool ClientImpl::handle_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + if (req.path.empty()) { + error = Error::Connection; + output_error_log(error, &req); + return false; + } + + auto req_save = req; + + bool ret; + + if (!is_ssl() && !proxy_host_.empty() && proxy_port_ != -1) { + auto req2 = req; + req2.path = "http://" + host_and_port_ + req.path; + ret = process_request(strm, req2, res, close_connection, error); + req = req2; + req.path = req_save.path; + } else { + ret = process_request(strm, req, res, close_connection, error); + } + + if (!ret) { return false; } + + if (res.get_header_value("Connection") == "close" || + (res.version == "HTTP/1.0" && res.reason != "Connection established")) { + // TODO this requires a not-entirely-obvious chain of calls to be correct + // for this to be safe. + + // This is safe to call because handle_request is only called by send_ + // which locks the request mutex during the process. It would be a bug + // to call it from a different thread since it's a thread-safety issue + // to do these things to the socket if another thread is using the socket. + std::lock_guard guard(socket_mutex_); + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); + } + + if (300 < res.status && res.status < 400 && follow_location_) { + req = req_save; + ret = redirect(req, res, error); + } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if ((res.status == StatusCode::Unauthorized_401 || + res.status == StatusCode::ProxyAuthenticationRequired_407) && + req.authorization_count_ < 5) { + auto is_proxy = res.status == StatusCode::ProxyAuthenticationRequired_407; + const auto &username = + is_proxy ? proxy_digest_auth_username_ : digest_auth_username_; + const auto &password = + is_proxy ? proxy_digest_auth_password_ : digest_auth_password_; + + if (!username.empty() && !password.empty()) { + std::map auth; + if (detail::parse_www_authenticate(res, auth, is_proxy)) { + Request new_req = req; + new_req.authorization_count_ += 1; + new_req.headers.erase(is_proxy ? "Proxy-Authorization" + : "Authorization"); + new_req.headers.insert(detail::make_digest_authentication_header( + req, auth, new_req.authorization_count_, detail::random_string(10), + username, password, is_proxy)); + + Response new_res; + + ret = send(new_req, new_res, error); + if (ret) { res = new_res; } + } + } + } +#endif + + return ret; +} + +inline bool ClientImpl::redirect(Request &req, Response &res, Error &error) { + if (req.redirect_count_ == 0) { + error = Error::ExceedRedirectCount; + output_error_log(error, &req); + return false; + } + + auto location = res.get_header_value("location"); + if (location.empty()) { return false; } + + thread_local const std::regex re( + R"((?:(https?):)?(?://(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)?([^?#]*)(\?[^#]*)?(?:#.*)?)"); + + std::smatch m; + if (!std::regex_match(location, m, re)) { return false; } + + auto scheme = is_ssl() ? "https" : "http"; + + auto next_scheme = m[1].str(); + auto next_host = m[2].str(); + if (next_host.empty()) { next_host = m[3].str(); } + auto port_str = m[4].str(); + auto next_path = m[5].str(); + auto next_query = m[6].str(); + + auto next_port = port_; + if (!port_str.empty()) { + next_port = std::stoi(port_str); + } else if (!next_scheme.empty()) { + next_port = next_scheme == "https" ? 443 : 80; + } + + if (next_scheme.empty()) { next_scheme = scheme; } + if (next_host.empty()) { next_host = host_; } + if (next_path.empty()) { next_path = "/"; } + + auto path = decode_query_component(next_path, true) + next_query; + + // Same host redirect - use current client + if (next_scheme == scheme && next_host == host_ && next_port == port_) { + return detail::redirect(*this, req, res, path, location, error); + } + + // Cross-host/scheme redirect - create new client with robust setup + return create_redirect_client(next_scheme, next_host, next_port, req, res, + path, location, error); +} + +// New method for robust redirect client creation +inline bool ClientImpl::create_redirect_client( + const std::string &scheme, const std::string &host, int port, Request &req, + Response &res, const std::string &path, const std::string &location, + Error &error) { + // Determine if we need SSL + auto need_ssl = (scheme == "https"); + + // Clean up request headers that are host/client specific + // Remove headers that should not be carried over to new host + auto headers_to_remove = + std::vector{"Host", "Proxy-Authorization", "Authorization"}; + + for (const auto &header_name : headers_to_remove) { + auto it = req.headers.find(header_name); + while (it != req.headers.end()) { + it = req.headers.erase(it); + it = req.headers.find(header_name); + } + } + + // Create appropriate client type and handle redirect + if (need_ssl) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // Create SSL client for HTTPS redirect + SSLClient redirect_client(host, port); + + // Setup basic client configuration first + setup_redirect_client(redirect_client); + + // SSL-specific configuration for proxy environments + if (!proxy_host_.empty() && proxy_port_ != -1) { + // Critical: Disable SSL verification for proxy environments + redirect_client.enable_server_certificate_verification(false); + redirect_client.enable_server_hostname_verification(false); + } else { + // For direct SSL connections, copy SSL verification settings + redirect_client.enable_server_certificate_verification( + server_certificate_verification_); + redirect_client.enable_server_hostname_verification( + server_hostname_verification_); + } + + // Handle CA certificate store and paths if available + if (ca_cert_store_ && X509_STORE_up_ref(ca_cert_store_)) { + redirect_client.set_ca_cert_store(ca_cert_store_); + } + if (!ca_cert_file_path_.empty()) { + redirect_client.set_ca_cert_path(ca_cert_file_path_, ca_cert_dir_path_); + } + + // Client certificates are set through constructor for SSLClient + // NOTE: SSLClient constructor already takes client_cert_path and + // client_key_path so we need to create it properly if client certs are + // needed + + // Execute the redirect + return detail::redirect(redirect_client, req, res, path, location, error); +#else + // SSL not supported - set appropriate error + error = Error::SSLConnection; + output_error_log(error, &req); + return false; +#endif + } else { + // HTTP redirect + ClientImpl redirect_client(host, port); + + // Setup client with robust configuration + setup_redirect_client(redirect_client); + + // Execute the redirect + return detail::redirect(redirect_client, req, res, path, location, error); + } +} + +// New method for robust client setup (based on basic_manual_redirect.cpp +// logic) +template +inline void ClientImpl::setup_redirect_client(ClientType &client) { + // Copy basic settings first + client.set_connection_timeout(connection_timeout_sec_); + client.set_read_timeout(read_timeout_sec_, read_timeout_usec_); + client.set_write_timeout(write_timeout_sec_, write_timeout_usec_); + client.set_keep_alive(keep_alive_); + client.set_follow_location( + true); // Enable redirects to handle multi-step redirects + client.set_path_encode(path_encode_); + client.set_compress(compress_); + client.set_decompress(decompress_); + + // Copy authentication settings BEFORE proxy setup + if (!basic_auth_username_.empty()) { + client.set_basic_auth(basic_auth_username_, basic_auth_password_); + } + if (!bearer_token_auth_token_.empty()) { + client.set_bearer_token_auth(bearer_token_auth_token_); + } +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (!digest_auth_username_.empty()) { + client.set_digest_auth(digest_auth_username_, digest_auth_password_); + } +#endif + + // Setup proxy configuration (CRITICAL ORDER - proxy must be set + // before proxy auth) + if (!proxy_host_.empty() && proxy_port_ != -1) { + // First set proxy host and port + client.set_proxy(proxy_host_, proxy_port_); + + // Then set proxy authentication (order matters!) + if (!proxy_basic_auth_username_.empty()) { + client.set_proxy_basic_auth(proxy_basic_auth_username_, + proxy_basic_auth_password_); + } + if (!proxy_bearer_token_auth_token_.empty()) { + client.set_proxy_bearer_token_auth(proxy_bearer_token_auth_token_); + } +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (!proxy_digest_auth_username_.empty()) { + client.set_proxy_digest_auth(proxy_digest_auth_username_, + proxy_digest_auth_password_); + } +#endif + } + + // Copy network and socket settings + client.set_address_family(address_family_); + client.set_tcp_nodelay(tcp_nodelay_); + client.set_ipv6_v6only(ipv6_v6only_); + if (socket_options_) { client.set_socket_options(socket_options_); } + if (!interface_.empty()) { client.set_interface(interface_); } + + // Copy logging and headers + if (logger_) { client.set_logger(logger_); } + if (error_logger_) { client.set_error_logger(error_logger_); } + + // NOTE: DO NOT copy default_headers_ as they may contain stale Host headers + // Each new client should generate its own headers based on its target host +} + +inline bool ClientImpl::write_content_with_provider(Stream &strm, + const Request &req, + Error &error) const { + auto is_shutting_down = []() { return false; }; + + if (req.is_chunked_content_provider_) { + // TODO: Brotli support + std::unique_ptr compressor; +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_) { + compressor = detail::make_unique(); + } else +#endif + { + compressor = detail::make_unique(); + } + + return detail::write_content_chunked(strm, req.content_provider_, + is_shutting_down, *compressor, error); + } else { + return detail::write_content_with_progress( + strm, req.content_provider_, 0, req.content_length_, is_shutting_down, + req.upload_progress, error); + } +} + +inline bool ClientImpl::write_request(Stream &strm, Request &req, + bool close_connection, Error &error) { + // Prepare additional headers + if (close_connection) { + if (!req.has_header("Connection")) { + req.set_header("Connection", "close"); + } + } + + if (!req.has_header("Host")) { + // For Unix socket connections, use "localhost" as Host header (similar to + // curl behavior) + if (address_family_ == AF_UNIX) { + req.set_header("Host", "localhost"); + } else { + req.set_header("Host", host_and_port_); + } + } + + if (!req.has_header("Accept")) { req.set_header("Accept", "*/*"); } + + if (!req.content_receiver) { + if (!req.has_header("Accept-Encoding")) { + std::string accept_encoding; +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + accept_encoding = "br"; +#endif +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "gzip, deflate"; +#endif +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "zstd"; +#endif + req.set_header("Accept-Encoding", accept_encoding); + } + +#ifndef CPPHTTPLIB_NO_DEFAULT_USER_AGENT + if (!req.has_header("User-Agent")) { + auto agent = std::string("cpp-httplib/") + CPPHTTPLIB_VERSION; + req.set_header("User-Agent", agent); + } +#endif + }; + + if (req.body.empty()) { + if (req.content_provider_) { + if (!req.is_chunked_content_provider_) { + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.content_length_); + req.set_header("Content-Length", length); + } + } + } else { + if (req.method == "POST" || req.method == "PUT" || + req.method == "PATCH") { + req.set_header("Content-Length", "0"); + } + } + } else { + if (!req.has_header("Content-Type")) { + req.set_header("Content-Type", "text/plain"); + } + + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.body.size()); + req.set_header("Content-Length", length); + } + } + + if (!basic_auth_password_.empty() || !basic_auth_username_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_basic_authentication_header( + basic_auth_username_, basic_auth_password_, false)); + } + } + + if (!proxy_basic_auth_username_.empty() && + !proxy_basic_auth_password_.empty()) { + if (!req.has_header("Proxy-Authorization")) { + req.headers.insert(make_basic_authentication_header( + proxy_basic_auth_username_, proxy_basic_auth_password_, true)); + } + } + + if (!bearer_token_auth_token_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + bearer_token_auth_token_, false)); + } + } + + if (!proxy_bearer_token_auth_token_.empty()) { + if (!req.has_header("Proxy-Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + proxy_bearer_token_auth_token_, true)); + } + } + + // Request line and headers + { + detail::BufferStream bstrm; + + // Extract path and query from req.path + std::string path_part, query_part; + auto query_pos = req.path.find('?'); + if (query_pos != std::string::npos) { + path_part = req.path.substr(0, query_pos); + query_part = req.path.substr(query_pos + 1); + } else { + path_part = req.path; + query_part = ""; + } + + // Encode path and query + auto path_with_query = + path_encode_ ? detail::encode_path(path_part) : path_part; + + detail::parse_query_text(query_part, req.params); + if (!req.params.empty()) { + path_with_query = append_query_params(path_with_query, req.params); + } + + // Write request line and headers + detail::write_request_line(bstrm, req.method, path_with_query); + header_writer_(bstrm, req.headers); + + // Flush buffer + auto &data = bstrm.get_buffer(); + if (!detail::write_data(strm, data.data(), data.size())) { + error = Error::Write; + output_error_log(error, &req); + return false; + } + } + + // Body + if (req.body.empty()) { + return write_content_with_provider(strm, req, error); + } + + if (req.upload_progress) { + auto body_size = req.body.size(); + size_t written = 0; + auto data = req.body.data(); + + while (written < body_size) { + size_t to_write = (std::min)(CPPHTTPLIB_SEND_BUFSIZ, body_size - written); + if (!detail::write_data(strm, data + written, to_write)) { + error = Error::Write; + output_error_log(error, &req); + return false; + } + written += to_write; + + if (!req.upload_progress(written, body_size)) { + error = Error::Canceled; + output_error_log(error, &req); + return false; + } + } + } else { + if (!detail::write_data(strm, req.body.data(), req.body.size())) { + error = Error::Write; + output_error_log(error, &req); + return false; + } + } + + return true; +} + +inline std::unique_ptr +ClientImpl::send_with_content_provider_and_receiver( + Request &req, const char *body, size_t content_length, + ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + Error &error) { + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_) { req.set_header("Content-Encoding", "gzip"); } +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_ && !content_provider_without_length) { + // TODO: Brotli support + detail::gzip_compressor compressor; + + if (content_provider) { + auto ok = true; + size_t offset = 0; + DataSink data_sink; + + data_sink.write = [&](const char *data, size_t data_len) -> bool { + if (ok) { + auto last = offset + data_len == content_length; + + auto ret = compressor.compress( + data, data_len, last, + [&](const char *compressed_data, size_t compressed_data_len) { + req.body.append(compressed_data, compressed_data_len); + return true; + }); + + if (ret) { + offset += data_len; + } else { + ok = false; + } + } + return ok; + }; + + while (ok && offset < content_length) { + if (!content_provider(offset, content_length - offset, data_sink)) { + error = Error::Canceled; + output_error_log(error, &req); + return nullptr; + } + } + } else { + if (!compressor.compress(body, content_length, true, + [&](const char *data, size_t data_len) { + req.body.append(data, data_len); + return true; + })) { + error = Error::Compression; + output_error_log(error, &req); + return nullptr; + } + } + } else +#endif + { + if (content_provider) { + req.content_length_ = content_length; + req.content_provider_ = std::move(content_provider); + req.is_chunked_content_provider_ = false; + } else if (content_provider_without_length) { + req.content_length_ = 0; + req.content_provider_ = detail::ContentProviderAdapter( + std::move(content_provider_without_length)); + req.is_chunked_content_provider_ = true; + req.set_header("Transfer-Encoding", "chunked"); + } else { + req.body.assign(body, content_length); + } + } + + if (content_receiver) { + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + } + + auto res = detail::make_unique(); + return send(req, *res, error) ? std::move(res) : nullptr; +} + +inline Result ClientImpl::send_with_content_provider_and_receiver( + const std::string &method, const std::string &path, const Headers &headers, + const char *body, size_t content_length, ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + UploadProgress progress) { + Request req; + req.method = method; + req.headers = headers; + req.path = path; + req.upload_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + auto error = Error::Success; + + auto res = send_with_content_provider_and_receiver( + req, body, content_length, std::move(content_provider), + std::move(content_provider_without_length), content_type, + std::move(content_receiver), error); + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + return Result{std::move(res), error, std::move(req.headers), last_ssl_error_, + last_openssl_error_}; +#else + return Result{std::move(res), error, std::move(req.headers)}; +#endif +} + +inline void ClientImpl::output_log(const Request &req, + const Response &res) const { + if (logger_) { + std::lock_guard guard(logger_mutex_); + logger_(req, res); + } +} + +inline void ClientImpl::output_error_log(const Error &err, + const Request *req) const { + if (error_logger_) { + std::lock_guard guard(logger_mutex_); + error_logger_(err, req); + } +} + +inline bool ClientImpl::process_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + // Send request + if (!write_request(strm, req, close_connection, error)) { return false; } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (is_ssl()) { + auto is_proxy_enabled = !proxy_host_.empty() && proxy_port_ != -1; + if (!is_proxy_enabled) { + if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { + error = Error::SSLPeerCouldBeClosed_; + output_error_log(error, &req); + return false; + } + } + } +#endif + + // Receive response and headers + if (!read_response_line(strm, req, res) || + !detail::read_headers(strm, res.headers)) { + error = Error::Read; + output_error_log(error, &req); + return false; + } + + // Body + if ((res.status != StatusCode::NoContent_204) && req.method != "HEAD" && + req.method != "CONNECT") { + auto redirect = 300 < res.status && res.status < 400 && + res.status != StatusCode::NotModified_304 && + follow_location_; + + if (req.response_handler && !redirect) { + if (!req.response_handler(res)) { + error = Error::Canceled; + output_error_log(error, &req); + return false; + } + } + + auto out = + req.content_receiver + ? static_cast( + [&](const char *buf, size_t n, size_t off, size_t len) { + if (redirect) { return true; } + auto ret = req.content_receiver(buf, n, off, len); + if (!ret) { + error = Error::Canceled; + output_error_log(error, &req); + } + return ret; + }) + : static_cast( + [&](const char *buf, size_t n, size_t /*off*/, + size_t /*len*/) { + assert(res.body.size() + n <= res.body.max_size()); + res.body.append(buf, n); + return true; + }); + + auto progress = [&](size_t current, size_t total) { + if (!req.download_progress || redirect) { return true; } + auto ret = req.download_progress(current, total); + if (!ret) { + error = Error::Canceled; + output_error_log(error, &req); + } + return ret; + }; + + if (res.has_header("Content-Length")) { + if (!req.content_receiver) { + auto len = res.get_header_value_u64("Content-Length"); + if (len > res.body.max_size()) { + error = Error::Read; + output_error_log(error, &req); + return false; + } + res.body.reserve(static_cast(len)); + } + } + + if (res.status != StatusCode::NotModified_304) { + int dummy_status; + if (!detail::read_content(strm, res, (std::numeric_limits::max)(), + dummy_status, std::move(progress), + std::move(out), decompress_)) { + if (error != Error::Canceled) { error = Error::Read; } + output_error_log(error, &req); + return false; + } + } + } + + // Log + output_log(req, res); + + return true; +} + +inline ContentProviderWithoutLength ClientImpl::get_multipart_content_provider( + const std::string &boundary, const UploadFormDataItems &items, + const FormDataProviderItems &provider_items) const { + size_t cur_item = 0; + size_t cur_start = 0; + // cur_item and cur_start are copied to within the std::function and + // maintain state between successive calls + return [&, cur_item, cur_start](size_t offset, + DataSink &sink) mutable -> bool { + if (!offset && !items.empty()) { + sink.os << detail::serialize_multipart_formdata(items, boundary, false); + return true; + } else if (cur_item < provider_items.size()) { + if (!cur_start) { + const auto &begin = detail::serialize_multipart_formdata_item_begin( + provider_items[cur_item], boundary); + offset += begin.size(); + cur_start = offset; + sink.os << begin; + } + + DataSink cur_sink; + auto has_data = true; + cur_sink.write = sink.write; + cur_sink.done = [&]() { has_data = false; }; + + if (!provider_items[cur_item].provider(offset - cur_start, cur_sink)) { + return false; + } + + if (!has_data) { + sink.os << detail::serialize_multipart_formdata_item_end(); + cur_item++; + cur_start = 0; + } + return true; + } else { + sink.os << detail::serialize_multipart_formdata_finish(boundary); + sink.done(); + return true; + } + }; +} + +inline bool ClientImpl::process_socket( + const Socket &socket, + std::chrono::time_point start_time, + std::function callback) { + return detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, max_timeout_msec_, start_time, std::move(callback)); +} + +inline bool ClientImpl::is_ssl() const { return false; } + +inline Result ClientImpl::Get(const std::string &path, + DownloadProgress progress) { + return Get(path, Headers(), std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + DownloadProgress progress) { + if (params.empty()) { return Get(path, headers); } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query, headers, std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, + DownloadProgress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.download_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Get(const std::string &path, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, Headers(), nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, headers, nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, Headers(), std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.response_handler = std::move(response_handler); + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, params, headers, nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + if (params.empty()) { + return Get(path, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); + } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Head(const std::string &path) { + return Head(path, Headers()); +} + +inline Result ClientImpl::Head(const std::string &path, + const Headers &headers) { + Request req; + req.method = "HEAD"; + req.headers = headers; + req.path = path; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Post(const std::string &path) { + return Post(path, std::string(), std::string()); +} + +inline Result ClientImpl::Post(const std::string &path, + const Headers &headers) { + return Post(path, headers, nullptr, 0, std::string()); +} + +inline Result ClientImpl::Post(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), body, content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Params ¶ms) { + return Post(path, Headers(), params); +} + +inline Result ClientImpl::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), content_length, std::move(content_provider), + content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Post(path, Headers(), content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), std::move(content_provider), content_type, + progress); +} + +inline Result ClientImpl::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Post(path, Headers(), std::move(content_provider), content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Post(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Post(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return Post(path, Headers(), items, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Post(path, headers, body, content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Post(path, headers, body, content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, body, content_length, nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, body.data(), body.size(), nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, + std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "POST"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Put(const std::string &path) { + return Put(path, std::string(), std::string()); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers) { + return Put(path, headers, nullptr, 0, std::string()); +} + +inline Result ClientImpl::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), body, content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Params ¶ms) { + return Put(path, Headers(), params); +} + +inline Result ClientImpl::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), content_length, std::move(content_provider), + content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Put(path, Headers(), content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), std::move(content_provider), content_type, + progress); +} + +inline Result ClientImpl::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Put(path, Headers(), std::move(content_provider), content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Put(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Put(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return Put(path, Headers(), items, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Put(path, headers, body, content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Put(path, headers, body, content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, body, content_length, nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, body.data(), body.size(), nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "PUT"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Patch(const std::string &path) { + return Patch(path, std::string(), std::string()); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + UploadProgress progress) { + return Patch(path, headers, nullptr, 0, std::string(), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), body, content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Params ¶ms) { + return Patch(path, Headers(), params); +} + +inline Result ClientImpl::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), content_length, std::move(content_provider), + content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Patch(path, Headers(), content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), std::move(content_provider), content_type, + progress); +} + +inline Result ClientImpl::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Patch(path, Headers(), std::move(content_provider), content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Patch(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Patch(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return Patch(path, Headers(), items, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Patch(path, headers, body, content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Patch(path, headers, body, content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, body, content_length, nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, body.data(), body.size(), nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "PATCH"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Delete(const std::string &path, + DownloadProgress progress) { + return Delete(path, Headers(), std::string(), std::string(), progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + DownloadProgress progress) { + return Delete(path, headers, std::string(), std::string(), progress); +} + +inline Result ClientImpl::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, Headers(), body.data(), body.size(), content_type, + progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, headers, body.data(), body.size(), content_type, + progress); +} + +inline Result ClientImpl::Delete(const std::string &path, const Params ¶ms, + DownloadProgress progress) { + return Delete(path, Headers(), params, progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const Params ¶ms, + DownloadProgress progress) { + auto query = detail::params_to_query_str(params); + return Delete(path, headers, query, "application/x-www-form-urlencoded", + progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const char *body, + size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + Request req; + req.method = "DELETE"; + req.headers = headers; + req.path = path; + req.download_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + req.body.assign(body, content_length); + + return send_(std::move(req)); +} + +inline Result ClientImpl::Options(const std::string &path) { + return Options(path, Headers()); +} + +inline Result ClientImpl::Options(const std::string &path, + const Headers &headers) { + Request req; + req.method = "OPTIONS"; + req.headers = headers; + req.path = path; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline void ClientImpl::stop() { + std::lock_guard guard(socket_mutex_); + + // If there is anything ongoing right now, the ONLY thread-safe thing we can + // do is to shutdown_socket, so that threads using this socket suddenly + // discover they can't read/write any more and error out. Everything else + // (closing the socket, shutting ssl down) is unsafe because these actions + // are not thread-safe. + if (socket_requests_in_flight_ > 0) { + shutdown_socket(socket_); + + // Aside from that, we set a flag for the socket to be closed when we're + // done. + socket_should_be_closed_when_request_is_done_ = true; + return; + } + + // Otherwise, still holding the mutex, we can shut everything down ourselves + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); +} + +inline std::string ClientImpl::host() const { return host_; } + +inline int ClientImpl::port() const { return port_; } + +inline size_t ClientImpl::is_socket_open() const { + std::lock_guard guard(socket_mutex_); + return socket_.is_open(); +} + +inline socket_t ClientImpl::socket() const { return socket_.sock; } + +inline void ClientImpl::set_connection_timeout(time_t sec, time_t usec) { + connection_timeout_sec_ = sec; + connection_timeout_usec_ = usec; +} + +inline void ClientImpl::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; +} + +inline void ClientImpl::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; +} + +inline void ClientImpl::set_max_timeout(time_t msec) { + max_timeout_msec_ = msec; +} + +inline void ClientImpl::set_basic_auth(const std::string &username, + const std::string &password) { + basic_auth_username_ = username; + basic_auth_password_ = password; +} + +inline void ClientImpl::set_bearer_token_auth(const std::string &token) { + bearer_token_auth_token_ = token; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void ClientImpl::set_digest_auth(const std::string &username, + const std::string &password) { + digest_auth_username_ = username; + digest_auth_password_ = password; +} +#endif + +inline void ClientImpl::set_keep_alive(bool on) { keep_alive_ = on; } + +inline void ClientImpl::set_follow_location(bool on) { follow_location_ = on; } + +inline void ClientImpl::set_path_encode(bool on) { path_encode_ = on; } + +inline void +ClientImpl::set_hostname_addr_map(std::map addr_map) { + addr_map_ = std::move(addr_map); +} + +inline void ClientImpl::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); +} + +inline void ClientImpl::set_header_writer( + std::function const &writer) { + header_writer_ = writer; +} + +inline void ClientImpl::set_address_family(int family) { + address_family_ = family; +} + +inline void ClientImpl::set_tcp_nodelay(bool on) { tcp_nodelay_ = on; } + +inline void ClientImpl::set_ipv6_v6only(bool on) { ipv6_v6only_ = on; } + +inline void ClientImpl::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); +} + +inline void ClientImpl::set_compress(bool on) { compress_ = on; } + +inline void ClientImpl::set_decompress(bool on) { decompress_ = on; } + +inline void ClientImpl::set_interface(const std::string &intf) { + interface_ = intf; +} + +inline void ClientImpl::set_proxy(const std::string &host, int port) { + proxy_host_ = host; + proxy_port_ = port; +} + +inline void ClientImpl::set_proxy_basic_auth(const std::string &username, + const std::string &password) { + proxy_basic_auth_username_ = username; + proxy_basic_auth_password_ = password; +} + +inline void ClientImpl::set_proxy_bearer_token_auth(const std::string &token) { + proxy_bearer_token_auth_token_ = token; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void ClientImpl::set_proxy_digest_auth(const std::string &username, + const std::string &password) { + proxy_digest_auth_username_ = username; + proxy_digest_auth_password_ = password; +} + +inline void ClientImpl::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { + ca_cert_file_path_ = ca_cert_file_path; + ca_cert_dir_path_ = ca_cert_dir_path; +} + +inline void ClientImpl::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (ca_cert_store && ca_cert_store != ca_cert_store_) { + ca_cert_store_ = ca_cert_store; + } +} + +inline X509_STORE *ClientImpl::create_ca_cert_store(const char *ca_cert, + std::size_t size) const { + auto mem = BIO_new_mem_buf(ca_cert, static_cast(size)); + auto se = detail::scope_exit([&] { BIO_free_all(mem); }); + if (!mem) { return nullptr; } + + auto inf = PEM_X509_INFO_read_bio(mem, nullptr, nullptr, nullptr); + if (!inf) { return nullptr; } + + auto cts = X509_STORE_new(); + if (cts) { + for (auto i = 0; i < static_cast(sk_X509_INFO_num(inf)); i++) { + auto itmp = sk_X509_INFO_value(inf, i); + if (!itmp) { continue; } + + if (itmp->x509) { X509_STORE_add_cert(cts, itmp->x509); } + if (itmp->crl) { X509_STORE_add_crl(cts, itmp->crl); } + } + } + + sk_X509_INFO_pop_free(inf, X509_INFO_free); + return cts; +} + +inline void ClientImpl::enable_server_certificate_verification(bool enabled) { + server_certificate_verification_ = enabled; +} + +inline void ClientImpl::enable_server_hostname_verification(bool enabled) { + server_hostname_verification_ = enabled; +} + +inline void ClientImpl::set_server_certificate_verifier( + std::function verifier) { + server_certificate_verifier_ = verifier; +} +#endif + +inline void ClientImpl::set_logger(Logger logger) { + logger_ = std::move(logger); +} + +inline void ClientImpl::set_error_logger(ErrorLogger error_logger) { + error_logger_ = std::move(error_logger); +} + +/* + * SSL Implementation + */ +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +namespace detail { + +inline bool is_ip_address(const std::string &host) { + struct in_addr addr4; + struct in6_addr addr6; + return inet_pton(AF_INET, host.c_str(), &addr4) == 1 || + inet_pton(AF_INET6, host.c_str(), &addr6) == 1; +} + +template +inline SSL *ssl_new(socket_t sock, SSL_CTX *ctx, std::mutex &ctx_mutex, + U SSL_connect_or_accept, V setup) { + SSL *ssl = nullptr; + { + std::lock_guard guard(ctx_mutex); + ssl = SSL_new(ctx); + } + + if (ssl) { + set_nonblocking(sock, true); + auto bio = BIO_new_socket(static_cast(sock), BIO_NOCLOSE); + BIO_set_nbio(bio, 1); + SSL_set_bio(ssl, bio, bio); + + if (!setup(ssl) || SSL_connect_or_accept(ssl) != 1) { + SSL_shutdown(ssl); + { + std::lock_guard guard(ctx_mutex); + SSL_free(ssl); + } + set_nonblocking(sock, false); + return nullptr; + } + BIO_set_nbio(bio, 0); + set_nonblocking(sock, false); + } + + return ssl; +} + +inline void ssl_delete(std::mutex &ctx_mutex, SSL *ssl, socket_t sock, + bool shutdown_gracefully) { + // sometimes we may want to skip this to try to avoid SIGPIPE if we know + // the remote has closed the network connection + // Note that it is not always possible to avoid SIGPIPE, this is merely a + // best-efforts. + if (shutdown_gracefully) { + (void)(sock); + // SSL_shutdown() returns 0 on first call (indicating close_notify alert + // sent) and 1 on subsequent call (indicating close_notify alert received) + if (SSL_shutdown(ssl) == 0) { + // Expected to return 1, but even if it doesn't, we free ssl + SSL_shutdown(ssl); + } + } + + std::lock_guard guard(ctx_mutex); + SSL_free(ssl); +} + +template +bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl, + U ssl_connect_or_accept, + time_t timeout_sec, time_t timeout_usec, + int *ssl_error) { + auto res = 0; + while ((res = ssl_connect_or_accept(ssl)) != 1) { + auto err = SSL_get_error(ssl, res); + switch (err) { + case SSL_ERROR_WANT_READ: + if (select_read(sock, timeout_sec, timeout_usec) > 0) { continue; } + break; + case SSL_ERROR_WANT_WRITE: + if (select_write(sock, timeout_sec, timeout_usec) > 0) { continue; } + break; + default: break; + } + if (ssl_error) { *ssl_error = err; } + return false; + } + return true; +} + +template +inline bool process_server_socket_ssl( + const std::atomic &svr_sock, SSL *ssl, socket_t sock, + size_t keep_alive_max_count, time_t keep_alive_timeout_sec, + time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +template +inline bool process_client_socket_ssl( + SSL *ssl, socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time, T callback) { + SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec, max_timeout_msec, + start_time); + return callback(strm); +} + +// SSL socket stream implementation +inline SSLSocketStream::SSLSocketStream( + socket_t sock, SSL *ssl, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time) + : sock_(sock), ssl_(ssl), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec), + max_timeout_msec_(max_timeout_msec), start_time_(start_time) { + SSL_clear_mode(ssl, SSL_MODE_AUTO_RETRY); +} + +inline SSLSocketStream::~SSLSocketStream() = default; + +inline bool SSLSocketStream::is_readable() const { + return SSL_pending(ssl_) > 0; +} + +inline bool SSLSocketStream::wait_readable() const { + if (max_timeout_msec_ <= 0) { + return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; + } + + time_t read_timeout_sec; + time_t read_timeout_usec; + calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, + read_timeout_usec_, read_timeout_sec, read_timeout_usec); + + return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; +} + +inline bool SSLSocketStream::wait_writable() const { + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && + is_socket_alive(sock_) && !is_ssl_peer_could_be_closed(ssl_, sock_); +} + +inline ssize_t SSLSocketStream::read(char *ptr, size_t size) { + if (SSL_pending(ssl_) > 0) { + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (wait_readable()) { + auto ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + auto n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err == SSL_ERROR_WANT_READ || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err == SSL_ERROR_WANT_READ) { +#endif + if (SSL_pending(ssl_) > 0) { + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (wait_readable()) { + std::this_thread::sleep_for(std::chrono::microseconds{10}); + ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + break; + } + } + assert(ret < 0); + } + return ret; + } else { + return -1; + } +} + +inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) { + if (wait_writable()) { + auto handle_size = static_cast( + std::min(size, (std::numeric_limits::max)())); + + auto ret = SSL_write(ssl_, ptr, static_cast(handle_size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + auto n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err == SSL_ERROR_WANT_WRITE || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) { +#endif + if (wait_writable()) { + std::this_thread::sleep_for(std::chrono::microseconds{10}); + ret = SSL_write(ssl_, ptr, static_cast(handle_size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + break; + } + } + assert(ret < 0); + } + return ret; + } + return -1; +} + +inline void SSLSocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + detail::get_remote_ip_and_port(sock_, ip, port); +} + +inline void SSLSocketStream::get_local_ip_and_port(std::string &ip, + int &port) const { + detail::get_local_ip_and_port(sock_, ip, port); +} + +inline socket_t SSLSocketStream::socket() const { return sock_; } + +inline time_t SSLSocketStream::duration() const { + return std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time_) + .count(); +} + +} // namespace detail + +// SSL HTTP server implementation +inline SSLServer::SSLServer(const char *cert_path, const char *private_key_path, + const char *client_ca_cert_file_path, + const char *client_ca_cert_dir_path, + const char *private_key_password) { + ctx_ = SSL_CTX_new(TLS_server_method()); + + if (ctx_) { + SSL_CTX_set_options(ctx_, + SSL_OP_NO_COMPRESSION | + SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); + + if (private_key_password != nullptr && (private_key_password[0] != '\0')) { + SSL_CTX_set_default_passwd_cb_userdata( + ctx_, + reinterpret_cast(const_cast(private_key_password))); + } + + if (SSL_CTX_use_certificate_chain_file(ctx_, cert_path) != 1 || + SSL_CTX_use_PrivateKey_file(ctx_, private_key_path, SSL_FILETYPE_PEM) != + 1 || + SSL_CTX_check_private_key(ctx_) != 1) { + last_ssl_error_ = static_cast(ERR_get_error()); + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } else if (client_ca_cert_file_path || client_ca_cert_dir_path) { + SSL_CTX_load_verify_locations(ctx_, client_ca_cert_file_path, + client_ca_cert_dir_path); + + // Set client CA list to be sent to clients during TLS handshake + if (client_ca_cert_file_path) { + auto ca_list = SSL_load_client_CA_file(client_ca_cert_file_path); + if (ca_list != nullptr) { + SSL_CTX_set_client_CA_list(ctx_, ca_list); + } else { + // Failed to load client CA list, but we continue since + // SSL_CTX_load_verify_locations already succeeded and + // certificate verification will still work + last_ssl_error_ = static_cast(ERR_get_error()); + } + } + + SSL_CTX_set_verify( + ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); + } + } +} + +inline SSLServer::SSLServer(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store) { + ctx_ = SSL_CTX_new(TLS_server_method()); + + if (ctx_) { + SSL_CTX_set_options(ctx_, + SSL_OP_NO_COMPRESSION | + SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); + + if (SSL_CTX_use_certificate(ctx_, cert) != 1 || + SSL_CTX_use_PrivateKey(ctx_, private_key) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } else if (client_ca_cert_store) { + SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); + + // Extract CA names from the store and set them as the client CA list + auto ca_list = extract_ca_names_from_x509_store(client_ca_cert_store); + if (ca_list) { + SSL_CTX_set_client_CA_list(ctx_, ca_list); + } else { + // Failed to extract CA names, record the error + last_ssl_error_ = static_cast(ERR_get_error()); + } + + SSL_CTX_set_verify( + ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); + } + } +} + +inline SSLServer::SSLServer( + const std::function &setup_ssl_ctx_callback) { + ctx_ = SSL_CTX_new(TLS_method()); + if (ctx_) { + if (!setup_ssl_ctx_callback(*ctx_)) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +inline SSLServer::~SSLServer() { + if (ctx_) { SSL_CTX_free(ctx_); } +} + +inline bool SSLServer::is_valid() const { return ctx_; } + +inline SSL_CTX *SSLServer::ssl_context() const { return ctx_; } + +inline void SSLServer::update_certs(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store) { + + std::lock_guard guard(ctx_mutex_); + + SSL_CTX_use_certificate(ctx_, cert); + SSL_CTX_use_PrivateKey(ctx_, private_key); + + if (client_ca_cert_store != nullptr) { + SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); + } +} + +inline bool SSLServer::process_and_close_socket(socket_t sock) { + auto ssl = detail::ssl_new( + sock, ctx_, ctx_mutex_, + [&](SSL *ssl2) { + return detail::ssl_connect_or_accept_nonblocking( + sock, ssl2, SSL_accept, read_timeout_sec_, read_timeout_usec_, + &last_ssl_error_); + }, + [](SSL * /*ssl2*/) { return true; }); + + auto ret = false; + if (ssl) { + std::string remote_addr; + int remote_port = 0; + detail::get_remote_ip_and_port(sock, remote_addr, remote_port); + + std::string local_addr; + int local_port = 0; + detail::get_local_ip_and_port(sock, local_addr, local_port); + + ret = detail::process_server_socket_ssl( + svr_sock_, ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [&](Stream &strm, bool close_connection, bool &connection_closed) { + return process_request(strm, remote_addr, remote_port, local_addr, + local_port, close_connection, + connection_closed, + [&](Request &req) { req.ssl = ssl; }); + }); + + // Shutdown gracefully if the result seemed successful, non-gracefully if + // the connection appeared to be closed. + const bool shutdown_gracefully = ret; + detail::ssl_delete(ctx_mutex_, ssl, sock, shutdown_gracefully); + } + + detail::shutdown_socket(sock); + detail::close_socket(sock); + return ret; +} + +inline STACK_OF(X509_NAME) * SSLServer::extract_ca_names_from_x509_store( + X509_STORE *store) { + if (!store) { return nullptr; } + + auto ca_list = sk_X509_NAME_new_null(); + if (!ca_list) { return nullptr; } + + // Get all objects from the store + auto objs = X509_STORE_get0_objects(store); + if (!objs) { + sk_X509_NAME_free(ca_list); + return nullptr; + } + + // Iterate through objects and extract certificate subject names + for (int i = 0; i < sk_X509_OBJECT_num(objs); i++) { + auto obj = sk_X509_OBJECT_value(objs, i); + if (X509_OBJECT_get_type(obj) == X509_LU_X509) { + auto cert = X509_OBJECT_get0_X509(obj); + if (cert) { + auto subject = X509_get_subject_name(cert); + if (subject) { + auto name_dup = X509_NAME_dup(subject); + if (name_dup) { sk_X509_NAME_push(ca_list, name_dup); } + } + } + } + } + + // If no names were extracted, free the list and return nullptr + if (sk_X509_NAME_num(ca_list) == 0) { + sk_X509_NAME_free(ca_list); + return nullptr; + } + + return ca_list; +} + +// SSL HTTP client implementation +inline SSLClient::SSLClient(const std::string &host) + : SSLClient(host, 443, std::string(), std::string()) {} + +inline SSLClient::SSLClient(const std::string &host, int port) + : SSLClient(host, port, std::string(), std::string()) {} + +inline SSLClient::SSLClient(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path, + const std::string &private_key_password) + : ClientImpl(host, port, client_cert_path, client_key_path) { + ctx_ = SSL_CTX_new(TLS_client_method()); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); + + detail::split(&host_[0], &host_[host_.size()], '.', + [&](const char *b, const char *e) { + host_components_.emplace_back(b, e); + }); + + if (!client_cert_path.empty() && !client_key_path.empty()) { + if (!private_key_password.empty()) { + SSL_CTX_set_default_passwd_cb_userdata( + ctx_, reinterpret_cast( + const_cast(private_key_password.c_str()))); + } + + if (SSL_CTX_use_certificate_file(ctx_, client_cert_path.c_str(), + SSL_FILETYPE_PEM) != 1 || + SSL_CTX_use_PrivateKey_file(ctx_, client_key_path.c_str(), + SSL_FILETYPE_PEM) != 1) { + last_openssl_error_ = ERR_get_error(); + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +inline SSLClient::SSLClient(const std::string &host, int port, + X509 *client_cert, EVP_PKEY *client_key, + const std::string &private_key_password) + : ClientImpl(host, port) { + ctx_ = SSL_CTX_new(TLS_client_method()); + + detail::split(&host_[0], &host_[host_.size()], '.', + [&](const char *b, const char *e) { + host_components_.emplace_back(b, e); + }); + + if (client_cert != nullptr && client_key != nullptr) { + if (!private_key_password.empty()) { + SSL_CTX_set_default_passwd_cb_userdata( + ctx_, reinterpret_cast( + const_cast(private_key_password.c_str()))); + } + + if (SSL_CTX_use_certificate(ctx_, client_cert) != 1 || + SSL_CTX_use_PrivateKey(ctx_, client_key) != 1) { + last_openssl_error_ = ERR_get_error(); + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +inline SSLClient::~SSLClient() { + if (ctx_) { SSL_CTX_free(ctx_); } + // Make sure to shut down SSL since shutdown_ssl will resolve to the + // base function rather than the derived function once we get to the + // base class destructor, and won't free the SSL (causing a leak). + shutdown_ssl_impl(socket_, true); +} + +inline bool SSLClient::is_valid() const { return ctx_; } + +inline void SSLClient::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (ca_cert_store) { + if (ctx_) { + if (SSL_CTX_get_cert_store(ctx_) != ca_cert_store) { + // Free memory allocated for old cert and use new store + // `ca_cert_store` + SSL_CTX_set_cert_store(ctx_, ca_cert_store); + ca_cert_store_ = ca_cert_store; + } + } else { + X509_STORE_free(ca_cert_store); + } + } +} + +inline void SSLClient::load_ca_cert_store(const char *ca_cert, + std::size_t size) { + set_ca_cert_store(ClientImpl::create_ca_cert_store(ca_cert, size)); +} + +inline long SSLClient::get_openssl_verify_result() const { + return verify_result_; +} + +inline SSL_CTX *SSLClient::ssl_context() const { return ctx_; } + +inline bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { + if (!is_valid()) { + error = Error::SSLConnection; + return false; + } + return ClientImpl::create_and_connect_socket(socket, error); +} + +// Assumes that socket_mutex_ is locked and that there are no requests in +// flight +inline bool SSLClient::connect_with_proxy( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error) { + success = true; + Response proxy_res; + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, + start_time, [&](Stream &strm) { + Request req2; + req2.method = "CONNECT"; + req2.path = host_and_port_; + if (max_timeout_msec_ > 0) { + req2.start_time_ = std::chrono::steady_clock::now(); + } + return process_request(strm, req2, proxy_res, false, error); + })) { + // Thread-safe to close everything because we are assuming there are no + // requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + + if (proxy_res.status == StatusCode::ProxyAuthenticationRequired_407) { + if (!proxy_digest_auth_username_.empty() && + !proxy_digest_auth_password_.empty()) { + std::map auth; + if (detail::parse_www_authenticate(proxy_res, auth, true)) { + // Close the current socket and create a new one for the authenticated + // request + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + + // Create a new socket for the authenticated CONNECT request + if (!create_and_connect_socket(socket, error)) { + success = false; + output_error_log(error, nullptr); + return false; + } + + proxy_res = Response(); + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, + start_time, [&](Stream &strm) { + Request req3; + req3.method = "CONNECT"; + req3.path = host_and_port_; + req3.headers.insert(detail::make_digest_authentication_header( + req3, auth, 1, detail::random_string(10), + proxy_digest_auth_username_, proxy_digest_auth_password_, + true)); + if (max_timeout_msec_ > 0) { + req3.start_time_ = std::chrono::steady_clock::now(); + } + return process_request(strm, req3, proxy_res, false, error); + })) { + // Thread-safe to close everything because we are assuming there are + // no requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + } + } + } + + // If status code is not 200, proxy request is failed. + // Set error to ProxyConnection and return proxy response + // as the response of the request + if (proxy_res.status != StatusCode::OK_200) { + error = Error::ProxyConnection; + output_error_log(error, nullptr); + res = std::move(proxy_res); + // Thread-safe to close everything because we are assuming there are + // no requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + return false; + } + + return true; +} + +inline bool SSLClient::load_certs() { + auto ret = true; + + std::call_once(initialize_cert_, [&]() { + std::lock_guard guard(ctx_mutex_); + if (!ca_cert_file_path_.empty()) { + if (!SSL_CTX_load_verify_locations(ctx_, ca_cert_file_path_.c_str(), + nullptr)) { + last_openssl_error_ = ERR_get_error(); + ret = false; + } + } else if (!ca_cert_dir_path_.empty()) { + if (!SSL_CTX_load_verify_locations(ctx_, nullptr, + ca_cert_dir_path_.c_str())) { + last_openssl_error_ = ERR_get_error(); + ret = false; + } + } else { + auto loaded = false; +#ifdef _WIN32 + loaded = + detail::load_system_certs_on_windows(SSL_CTX_get_cert_store(ctx_)); +#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && TARGET_OS_MAC + loaded = detail::load_system_certs_on_macos(SSL_CTX_get_cert_store(ctx_)); +#endif // _WIN32 + if (!loaded) { SSL_CTX_set_default_verify_paths(ctx_); } + } + }); + + return ret; +} + +inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { + auto ssl = detail::ssl_new( + socket.sock, ctx_, ctx_mutex_, + [&](SSL *ssl2) { + if (server_certificate_verification_) { + if (!load_certs()) { + error = Error::SSLLoadingCerts; + output_error_log(error, nullptr); + return false; + } + SSL_set_verify(ssl2, SSL_VERIFY_NONE, nullptr); + } + + if (!detail::ssl_connect_or_accept_nonblocking( + socket.sock, ssl2, SSL_connect, connection_timeout_sec_, + connection_timeout_usec_, &last_ssl_error_)) { + error = Error::SSLConnection; + output_error_log(error, nullptr); + return false; + } + + if (server_certificate_verification_) { + auto verification_status = SSLVerifierResponse::NoDecisionMade; + + if (server_certificate_verifier_) { + verification_status = server_certificate_verifier_(ssl2); + } + + if (verification_status == SSLVerifierResponse::CertificateRejected) { + last_openssl_error_ = ERR_get_error(); + error = Error::SSLServerVerification; + output_error_log(error, nullptr); + return false; + } + + if (verification_status == SSLVerifierResponse::NoDecisionMade) { + verify_result_ = SSL_get_verify_result(ssl2); + + if (verify_result_ != X509_V_OK) { + last_openssl_error_ = static_cast(verify_result_); + error = Error::SSLServerVerification; + output_error_log(error, nullptr); + return false; + } + + auto server_cert = SSL_get1_peer_certificate(ssl2); + auto se = detail::scope_exit([&] { X509_free(server_cert); }); + + if (server_cert == nullptr) { + last_openssl_error_ = ERR_get_error(); + error = Error::SSLServerVerification; + output_error_log(error, nullptr); + return false; + } + + if (server_hostname_verification_) { + if (!verify_host(server_cert)) { + last_openssl_error_ = X509_V_ERR_HOSTNAME_MISMATCH; + error = Error::SSLServerHostnameVerification; + output_error_log(error, nullptr); + return false; + } + } + } + } + + return true; + }, + [&](SSL *ssl2) { + // Set SNI only if host is not IP address + if (!detail::is_ip_address(host_)) { +#if defined(OPENSSL_IS_BORINGSSL) + SSL_set_tlsext_host_name(ssl2, host_.c_str()); +#else + // NOTE: Direct call instead of using the OpenSSL macro to suppress + // -Wold-style-cast warning + SSL_ctrl(ssl2, SSL_CTRL_SET_TLSEXT_HOSTNAME, + TLSEXT_NAMETYPE_host_name, + static_cast(const_cast(host_.c_str()))); +#endif + } + return true; + }); + + if (ssl) { + socket.ssl = ssl; + return true; + } + + if (ctx_ == nullptr) { + error = Error::SSLConnection; + last_openssl_error_ = ERR_get_error(); + } + + shutdown_socket(socket); + close_socket(socket); + return false; +} + +inline void SSLClient::shutdown_ssl(Socket &socket, bool shutdown_gracefully) { + shutdown_ssl_impl(socket, shutdown_gracefully); +} + +inline void SSLClient::shutdown_ssl_impl(Socket &socket, + bool shutdown_gracefully) { + if (socket.sock == INVALID_SOCKET) { + assert(socket.ssl == nullptr); + return; + } + if (socket.ssl) { + detail::ssl_delete(ctx_mutex_, socket.ssl, socket.sock, + shutdown_gracefully); + socket.ssl = nullptr; + } + assert(socket.ssl == nullptr); +} + +inline bool SSLClient::process_socket( + const Socket &socket, + std::chrono::time_point start_time, + std::function callback) { + assert(socket.ssl); + return detail::process_client_socket_ssl( + socket.ssl, socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, start_time, + std::move(callback)); +} + +inline bool SSLClient::is_ssl() const { return true; } + +inline bool SSLClient::verify_host(X509 *server_cert) const { + /* Quote from RFC2818 section 3.1 "Server Identity" + + If a subjectAltName extension of type dNSName is present, that MUST + be used as the identity. Otherwise, the (most specific) Common Name + field in the Subject field of the certificate MUST be used. Although + the use of the Common Name is existing practice, it is deprecated and + Certification Authorities are encouraged to use the dNSName instead. + + Matching is performed using the matching rules specified by + [RFC2459]. If more than one identity of a given type is present in + the certificate (e.g., more than one dNSName name, a match in any one + of the set is considered acceptable.) Names may contain the wildcard + character * which is considered to match any single domain name + component or component fragment. E.g., *.a.com matches foo.a.com but + not bar.foo.a.com. f*.com matches foo.com but not bar.com. + + In some cases, the URI is specified as an IP address rather than a + hostname. In this case, the iPAddress subjectAltName must be present + in the certificate and must exactly match the IP in the URI. + + */ + return verify_host_with_subject_alt_name(server_cert) || + verify_host_with_common_name(server_cert); +} + +inline bool +SSLClient::verify_host_with_subject_alt_name(X509 *server_cert) const { + auto ret = false; + + auto type = GEN_DNS; + + struct in6_addr addr6 = {}; + struct in_addr addr = {}; + size_t addr_len = 0; + +#ifndef __MINGW32__ + if (inet_pton(AF_INET6, host_.c_str(), &addr6)) { + type = GEN_IPADD; + addr_len = sizeof(struct in6_addr); + } else if (inet_pton(AF_INET, host_.c_str(), &addr)) { + type = GEN_IPADD; + addr_len = sizeof(struct in_addr); + } +#endif + + auto alt_names = static_cast( + X509_get_ext_d2i(server_cert, NID_subject_alt_name, nullptr, nullptr)); + + if (alt_names) { + auto dsn_matched = false; + auto ip_matched = false; + + auto count = sk_GENERAL_NAME_num(alt_names); + + for (decltype(count) i = 0; i < count && !dsn_matched; i++) { + auto val = sk_GENERAL_NAME_value(alt_names, i); + if (!val || val->type != type) { continue; } + + auto name = + reinterpret_cast(ASN1_STRING_get0_data(val->d.ia5)); + if (name == nullptr) { continue; } + + auto name_len = static_cast(ASN1_STRING_length(val->d.ia5)); + + switch (type) { + case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; + + case GEN_IPADD: + if (!memcmp(&addr6, name, addr_len) || !memcmp(&addr, name, addr_len)) { + ip_matched = true; + } + break; + } + } + + if (dsn_matched || ip_matched) { ret = true; } + } + + GENERAL_NAMES_free(const_cast( + reinterpret_cast(alt_names))); + return ret; +} + +inline bool SSLClient::verify_host_with_common_name(X509 *server_cert) const { + const auto subject_name = X509_get_subject_name(server_cert); + + if (subject_name != nullptr) { + char name[BUFSIZ]; + auto name_len = X509_NAME_get_text_by_NID(subject_name, NID_commonName, + name, sizeof(name)); + + if (name_len != -1) { + return check_host_name(name, static_cast(name_len)); + } + } + + return false; +} + +inline bool SSLClient::check_host_name(const char *pattern, + size_t pattern_len) const { + if (host_.size() == pattern_len && host_ == pattern) { return true; } + + // Wildcard match + // https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/376484 + std::vector pattern_components; + detail::split(&pattern[0], &pattern[pattern_len], '.', + [&](const char *b, const char *e) { + pattern_components.emplace_back(b, e); + }); + + if (host_components_.size() != pattern_components.size()) { return false; } + + auto itr = pattern_components.begin(); + for (const auto &h : host_components_) { + auto &p = *itr; + if (p != h && p != "*") { + auto partial_match = (p.size() > 0 && p[p.size() - 1] == '*' && + !p.compare(0, p.size() - 1, h)); + if (!partial_match) { return false; } + } + ++itr; + } + + return true; +} +#endif + +// Universal client implementation +inline Client::Client(const std::string &scheme_host_port) + : Client(scheme_host_port, std::string(), std::string()) {} + +inline Client::Client(const std::string &scheme_host_port, + const std::string &client_cert_path, + const std::string &client_key_path) { + const static std::regex re( + R"((?:([a-z]+):\/\/)?(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)"); + + std::smatch m; + if (std::regex_match(scheme_host_port, m, re)) { + auto scheme = m[1].str(); + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (!scheme.empty() && (scheme != "http" && scheme != "https")) { +#else + if (!scheme.empty() && scheme != "http") { +#endif +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "'" + scheme + "' scheme is not supported."; + throw std::invalid_argument(msg); +#endif + return; + } + + auto is_ssl = scheme == "https"; + + auto host = m[2].str(); + if (host.empty()) { host = m[3].str(); } + + auto port_str = m[4].str(); + auto port = !port_str.empty() ? std::stoi(port_str) : (is_ssl ? 443 : 80); + + if (is_ssl) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); + is_ssl_ = is_ssl; +#endif + } else { + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); + } + } else { + // NOTE: Update TEST(UniversalClientImplTest, Ipv6LiteralAddress) + // if port param below changes. + cli_ = detail::make_unique(scheme_host_port, 80, + client_cert_path, client_key_path); + } +} // namespace detail + +inline Client::Client(const std::string &host, int port) + : cli_(detail::make_unique(host, port)) {} + +inline Client::Client(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : cli_(detail::make_unique(host, port, client_cert_path, + client_key_path)) {} + +inline Client::~Client() = default; + +inline bool Client::is_valid() const { + return cli_ != nullptr && cli_->is_valid(); +} + +inline Result Client::Get(const std::string &path, DownloadProgress progress) { + return cli_->Get(path, std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Headers &headers, + DownloadProgress progress) { + return cli_->Get(path, headers, std::move(progress)); +} +inline Result Client::Get(const std::string &path, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, headers, std::move(content_receiver), + std::move(progress)); +} +inline Result Client::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, DownloadProgress progress) { + return cli_->Get(path, params, headers, std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, params, headers, std::move(content_receiver), + std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, params, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +inline Result Client::Head(const std::string &path) { return cli_->Head(path); } +inline Result Client::Head(const std::string &path, const Headers &headers) { + return cli_->Head(path, headers); +} + +inline Result Client::Post(const std::string &path) { return cli_->Post(path); } +inline Result Client::Post(const std::string &path, const Headers &headers) { + return cli_->Post(path, headers); +} +inline Result Client::Post(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, body, content_length, content_type, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, body, content_length, content_type, + progress); +} +inline Result Client::Post(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, body, content_type, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, body, content_type, progress); +} +inline Result Client::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Post(path, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, std::move(content_provider), content_type, progress); +} +inline Result Client::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Post(path, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Post(path, headers, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, std::move(content_provider), content_type, + progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Post(path, headers, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, const Params ¶ms) { + return cli_->Post(path, params); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Post(path, headers, params); +} +inline Result Client::Post(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Post(path, items, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Post(path, headers, items, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Post(path, headers, items, boundary, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Post(path, headers, items, provider_items, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Post(path, headers, body, content_type, + std::move(content_receiver), progress); +} + +inline Result Client::Put(const std::string &path) { return cli_->Put(path); } +inline Result Client::Put(const std::string &path, const Headers &headers) { + return cli_->Put(path, headers); +} +inline Result Client::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, body, content_length, content_type, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, body, content_length, content_type, progress); +} +inline Result Client::Put(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, body, content_type, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, body, content_type, progress); +} +inline Result Client::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, std::move(content_provider), content_type, progress); +} +inline Result Client::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, headers, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, std::move(content_provider), content_type, + progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, headers, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, const Params ¶ms) { + return cli_->Put(path, params); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Put(path, headers, params); +} +inline Result Client::Put(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Put(path, items, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Put(path, headers, items, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Put(path, headers, items, boundary, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Put(path, headers, items, provider_items, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Put(path, headers, body, content_type, content_receiver, + progress); +} + +inline Result Client::Patch(const std::string &path) { + return cli_->Patch(path); +} +inline Result Client::Patch(const std::string &path, const Headers &headers) { + return cli_->Patch(path, headers); +} +inline Result Client::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, body, content_length, content_type, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, body, content_length, content_type, + progress); +} +inline Result Client::Patch(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, body, content_type, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, body, content_type, progress); +} +inline Result Client::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, std::move(content_provider), content_type, progress); +} +inline Result Client::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, headers, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, std::move(content_provider), content_type, + progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, headers, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, const Params ¶ms) { + return cli_->Patch(path, params); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Patch(path, headers, params); +} +inline Result Client::Patch(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Patch(path, items, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Patch(path, headers, items, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Patch(path, headers, items, boundary, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Patch(path, headers, items, provider_items, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Patch(path, headers, body, content_type, content_receiver, + progress); +} + +inline Result Client::Delete(const std::string &path, + DownloadProgress progress) { + return cli_->Delete(path, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + DownloadProgress progress) { + return cli_->Delete(path, headers, progress); +} +inline Result Client::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, body, content_length, content_type, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, headers, body, content_length, content_type, + progress); +} +inline Result Client::Delete(const std::string &path, const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, body, content_type, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, headers, body, content_type, progress); +} +inline Result Client::Delete(const std::string &path, const Params ¶ms, + DownloadProgress progress) { + return cli_->Delete(path, params, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + const Params ¶ms, DownloadProgress progress) { + return cli_->Delete(path, headers, params, progress); +} + +inline Result Client::Options(const std::string &path) { + return cli_->Options(path); +} +inline Result Client::Options(const std::string &path, const Headers &headers) { + return cli_->Options(path, headers); +} + +inline bool Client::send(Request &req, Response &res, Error &error) { + return cli_->send(req, res, error); +} + +inline Result Client::send(const Request &req) { return cli_->send(req); } + +inline void Client::stop() { cli_->stop(); } + +inline std::string Client::host() const { return cli_->host(); } + +inline int Client::port() const { return cli_->port(); } + +inline size_t Client::is_socket_open() const { return cli_->is_socket_open(); } + +inline socket_t Client::socket() const { return cli_->socket(); } + +inline void +Client::set_hostname_addr_map(std::map addr_map) { + cli_->set_hostname_addr_map(std::move(addr_map)); +} + +inline void Client::set_default_headers(Headers headers) { + cli_->set_default_headers(std::move(headers)); +} + +inline void Client::set_header_writer( + std::function const &writer) { + cli_->set_header_writer(writer); +} + +inline void Client::set_address_family(int family) { + cli_->set_address_family(family); +} + +inline void Client::set_tcp_nodelay(bool on) { cli_->set_tcp_nodelay(on); } + +inline void Client::set_socket_options(SocketOptions socket_options) { + cli_->set_socket_options(std::move(socket_options)); +} + +inline void Client::set_connection_timeout(time_t sec, time_t usec) { + cli_->set_connection_timeout(sec, usec); +} + +inline void Client::set_read_timeout(time_t sec, time_t usec) { + cli_->set_read_timeout(sec, usec); +} + +inline void Client::set_write_timeout(time_t sec, time_t usec) { + cli_->set_write_timeout(sec, usec); +} + +inline void Client::set_basic_auth(const std::string &username, + const std::string &password) { + cli_->set_basic_auth(username, password); +} +inline void Client::set_bearer_token_auth(const std::string &token) { + cli_->set_bearer_token_auth(token); +} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::set_digest_auth(const std::string &username, + const std::string &password) { + cli_->set_digest_auth(username, password); +} +#endif + +inline void Client::set_keep_alive(bool on) { cli_->set_keep_alive(on); } +inline void Client::set_follow_location(bool on) { + cli_->set_follow_location(on); +} + +inline void Client::set_path_encode(bool on) { cli_->set_path_encode(on); } + +[[deprecated("Use set_path_encode instead")]] +inline void Client::set_url_encode(bool on) { + cli_->set_path_encode(on); +} + +inline void Client::set_compress(bool on) { cli_->set_compress(on); } + +inline void Client::set_decompress(bool on) { cli_->set_decompress(on); } + +inline void Client::set_interface(const std::string &intf) { + cli_->set_interface(intf); +} + +inline void Client::set_proxy(const std::string &host, int port) { + cli_->set_proxy(host, port); +} +inline void Client::set_proxy_basic_auth(const std::string &username, + const std::string &password) { + cli_->set_proxy_basic_auth(username, password); +} +inline void Client::set_proxy_bearer_token_auth(const std::string &token) { + cli_->set_proxy_bearer_token_auth(token); +} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::set_proxy_digest_auth(const std::string &username, + const std::string &password) { + cli_->set_proxy_digest_auth(username, password); +} +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::enable_server_certificate_verification(bool enabled) { + cli_->enable_server_certificate_verification(enabled); +} + +inline void Client::enable_server_hostname_verification(bool enabled) { + cli_->enable_server_hostname_verification(enabled); +} + +inline void Client::set_server_certificate_verifier( + std::function verifier) { + cli_->set_server_certificate_verifier(verifier); +} +#endif + +inline void Client::set_logger(Logger logger) { + cli_->set_logger(std::move(logger)); +} + +inline void Client::set_error_logger(ErrorLogger error_logger) { + cli_->set_error_logger(std::move(error_logger)); +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline void Client::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { + cli_->set_ca_cert_path(ca_cert_file_path, ca_cert_dir_path); +} + +inline void Client::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (is_ssl_) { + static_cast(*cli_).set_ca_cert_store(ca_cert_store); + } else { + cli_->set_ca_cert_store(ca_cert_store); + } +} + +inline void Client::load_ca_cert_store(const char *ca_cert, std::size_t size) { + set_ca_cert_store(cli_->create_ca_cert_store(ca_cert, size)); +} + +inline long Client::get_openssl_verify_result() const { + if (is_ssl_) { + return static_cast(*cli_).get_openssl_verify_result(); + } + return -1; // NOTE: -1 doesn't match any of X509_V_ERR_??? +} + +inline SSL_CTX *Client::ssl_context() const { + if (is_ssl_) { return static_cast(*cli_).ssl_context(); } + return nullptr; +} +#endif + +// ---------------------------------------------------------------------------- + +} // namespace httplib + +#endif // CPPHTTPLIB_HTTPLIB_H diff --git a/include/json.hpp b/include/json.hpp new file mode 100644 index 0000000..82d69f7 --- /dev/null +++ b/include/json.hpp @@ -0,0 +1,25526 @@ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + +/****************************************************************************\ + * Note on documentation: The source files contain links to the online * + * documentation of the public API at https://json.nlohmann.me. This URL * + * contains the most recent documentation and should also be applicable to * + * previous versions; documentation for deprecated functions is not * + * removed, but marked deprecated. See "Generate documentation" section in * + * file docs/README.md. * +\****************************************************************************/ + +#ifndef INCLUDE_NLOHMANN_JSON_HPP_ +#define INCLUDE_NLOHMANN_JSON_HPP_ + +#include // all_of, find, for_each +#include // nullptr_t, ptrdiff_t, size_t +#include // hash, less +#include // initializer_list +#ifndef JSON_NO_IO + #include // istream, ostream +#endif // JSON_NO_IO +#include // random_access_iterator_tag +#include // unique_ptr +#include // string, stoi, to_string +#include // declval, forward, move, pair, swap +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 12 || NLOHMANN_JSON_VERSION_PATCH != 0 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 12 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 0 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_DIAGNOSTIC_POSITIONS + #define JSON_DIAGNOSTIC_POSITIONS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_DIAGNOSTIC_POSITIONS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS _dp +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) json_abi ## a ## b ## c +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b, c) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b, c) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON, \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTIC_POSITIONS) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // transform +#include // array +#include // forward_list +#include // inserter, front_inserter, end +#include // map +#ifdef JSON_HAS_CPP_17 + #include // optional +#endif +#include // string +#include // tuple, make_tuple +#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible +#include // unordered_map +#include // pair, declval +#include // valarray + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // nullptr_t +#include // exception +#if JSON_DIAGNOSTICS + #include // accumulate +#endif +#include // runtime_error +#include // to_string +#include // vector + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // uint8_t +#include // string + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // declval, pair +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + + +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2016 - 2021 Evan Nemerson +// SPDX-License-Identifier: MIT + +/* Hedley - https://nemequ.github.io/hedley + * Created by Evan Nemerson + */ + +#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) +#if defined(JSON_HEDLEY_VERSION) + #undef JSON_HEDLEY_VERSION +#endif +#define JSON_HEDLEY_VERSION 15 + +#if defined(JSON_HEDLEY_STRINGIFY_EX) + #undef JSON_HEDLEY_STRINGIFY_EX +#endif +#define JSON_HEDLEY_STRINGIFY_EX(x) #x + +#if defined(JSON_HEDLEY_STRINGIFY) + #undef JSON_HEDLEY_STRINGIFY +#endif +#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) + +#if defined(JSON_HEDLEY_CONCAT_EX) + #undef JSON_HEDLEY_CONCAT_EX +#endif +#define JSON_HEDLEY_CONCAT_EX(a,b) a##b + +#if defined(JSON_HEDLEY_CONCAT) + #undef JSON_HEDLEY_CONCAT +#endif +#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) + +#if defined(JSON_HEDLEY_CONCAT3_EX) + #undef JSON_HEDLEY_CONCAT3_EX +#endif +#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c + +#if defined(JSON_HEDLEY_CONCAT3) + #undef JSON_HEDLEY_CONCAT3 +#endif +#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) + +#if defined(JSON_HEDLEY_VERSION_ENCODE) + #undef JSON_HEDLEY_VERSION_ENCODE +#endif +#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) + #undef JSON_HEDLEY_VERSION_DECODE_MAJOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) + #undef JSON_HEDLEY_VERSION_DECODE_MINOR +#endif +#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) + +#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) + #undef JSON_HEDLEY_VERSION_DECODE_REVISION +#endif +#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) + +#if defined(JSON_HEDLEY_GNUC_VERSION) + #undef JSON_HEDLEY_GNUC_VERSION +#endif +#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) +#elif defined(__GNUC__) + #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) +#endif + +#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) + #undef JSON_HEDLEY_GNUC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GNUC_VERSION) + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION) + #undef JSON_HEDLEY_MSVC_VERSION +#endif +#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) +#elif defined(_MSC_FULL_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) +#elif defined(_MSC_VER) && !defined(__ICL) + #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) + #undef JSON_HEDLEY_MSVC_VERSION_CHECK +#endif +#if !defined(JSON_HEDLEY_MSVC_VERSION) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) +#elif defined(_MSC_VER) && (_MSC_VER >= 1200) + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) +#else + #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION) + #undef JSON_HEDLEY_INTEL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) +#elif defined(__INTEL_COMPILER) && !defined(__ICL) + #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_VERSION) + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #undef JSON_HEDLEY_INTEL_CL_VERSION +#endif +#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) + #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) +#endif + +#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) + #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_INTEL_CL_VERSION) + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION) + #undef JSON_HEDLEY_PGI_VERSION +#endif +#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) + #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) +#endif + +#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) + #undef JSON_HEDLEY_PGI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PGI_VERSION) + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #undef JSON_HEDLEY_SUNPRO_VERSION +#endif +#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) +#elif defined(__SUNPRO_C) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) +#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) +#elif defined(__SUNPRO_CC) + #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) +#endif + +#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) + #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_SUNPRO_VERSION) + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION +#endif +#if defined(__EMSCRIPTEN__) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) +#endif + +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) + #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION) + #undef JSON_HEDLEY_ARM_VERSION +#endif +#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) +#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) + #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) +#endif + +#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) + #undef JSON_HEDLEY_ARM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_ARM_VERSION) + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION) + #undef JSON_HEDLEY_IBM_VERSION +#endif +#if defined(__ibmxl__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) +#elif defined(__xlC__) && defined(__xlC_ver__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) +#elif defined(__xlC__) + #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) +#endif + +#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) + #undef JSON_HEDLEY_IBM_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IBM_VERSION) + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_VERSION) + #undef JSON_HEDLEY_TI_VERSION +#endif +#if \ + defined(__TI_COMPILER_VERSION__) && \ + ( \ + defined(__TMS470__) || defined(__TI_ARM__) || \ + defined(__MSP430__) || \ + defined(__TMS320C2000__) \ + ) +#if (__TI_COMPILER_VERSION__ >= 16000000) + #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif +#endif + +#if defined(JSON_HEDLEY_TI_VERSION_CHECK) + #undef JSON_HEDLEY_TI_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_VERSION) + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #undef JSON_HEDLEY_TI_CL2000_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) + #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL2000_VERSION) + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #undef JSON_HEDLEY_TI_CL430_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) + #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL430_VERSION) + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #undef JSON_HEDLEY_TI_ARMCL_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) + #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) + #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #undef JSON_HEDLEY_TI_CL6X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) + #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL6X_VERSION) + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #undef JSON_HEDLEY_TI_CL7X_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) + #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CL7X_VERSION) + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #undef JSON_HEDLEY_TI_CLPRU_VERSION +#endif +#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) + #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) +#endif + +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) + #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION) + #undef JSON_HEDLEY_CRAY_VERSION +#endif +#if defined(_CRAYC) + #if defined(_RELEASE_PATCHLEVEL) + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) + #else + #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) + #undef JSON_HEDLEY_CRAY_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_CRAY_VERSION) + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION) + #undef JSON_HEDLEY_IAR_VERSION +#endif +#if defined(__IAR_SYSTEMS_ICC__) + #if __VER__ > 1000 + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) + #else + #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) + #endif +#endif + +#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) + #undef JSON_HEDLEY_IAR_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_IAR_VERSION) + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION) + #undef JSON_HEDLEY_TINYC_VERSION +#endif +#if defined(__TINYC__) + #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) +#endif + +#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) + #undef JSON_HEDLEY_TINYC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION) + #undef JSON_HEDLEY_DMC_VERSION +#endif +#if defined(__DMC__) + #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) +#endif + +#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) + #undef JSON_HEDLEY_DMC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_DMC_VERSION) + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #undef JSON_HEDLEY_COMPCERT_VERSION +#endif +#if defined(__COMPCERT_VERSION__) + #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) +#endif + +#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) + #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_COMPCERT_VERSION) + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION) + #undef JSON_HEDLEY_PELLES_VERSION +#endif +#if defined(__POCC__) + #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) +#endif + +#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) + #undef JSON_HEDLEY_PELLES_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_PELLES_VERSION) + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #undef JSON_HEDLEY_MCST_LCC_VERSION +#endif +#if defined(__LCC__) && defined(__LCC_MINOR__) + #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) +#endif + +#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) + #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION) + #undef JSON_HEDLEY_GCC_VERSION +#endif +#if \ + defined(JSON_HEDLEY_GNUC_VERSION) && \ + !defined(__clang__) && \ + !defined(JSON_HEDLEY_INTEL_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_ARM_VERSION) && \ + !defined(JSON_HEDLEY_CRAY_VERSION) && \ + !defined(JSON_HEDLEY_TI_VERSION) && \ + !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ + !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ + !defined(__COMPCERT__) && \ + !defined(JSON_HEDLEY_MCST_LCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION +#endif + +#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_VERSION_CHECK +#endif +#if defined(JSON_HEDLEY_GCC_VERSION) + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) +#else + #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_ATTRIBUTE +#endif +#if \ + defined(__has_attribute) && \ + ( \ + (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ + ) +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) +#else +# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE +#endif +#if defined(__has_attribute) + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE +#endif +#if \ + defined(__has_cpp_attribute) && \ + defined(__cplusplus) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) + #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS +#endif +#if !defined(__cplusplus) || !defined(__has_cpp_attribute) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#elif \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION) && \ + (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ + (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) +#else + #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE +#endif +#if defined(__has_cpp_attribute) && defined(__cplusplus) + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_BUILTIN) + #undef JSON_HEDLEY_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) +#else + #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) + #undef JSON_HEDLEY_GNUC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) + #undef JSON_HEDLEY_GCC_HAS_BUILTIN +#endif +#if defined(__has_builtin) + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) +#else + #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_FEATURE) + #undef JSON_HEDLEY_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) +#else + #define JSON_HEDLEY_HAS_FEATURE(feature) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) + #undef JSON_HEDLEY_GNUC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) + #undef JSON_HEDLEY_GCC_HAS_FEATURE +#endif +#if defined(__has_feature) + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) +#else + #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_EXTENSION) + #undef JSON_HEDLEY_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) +#else + #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) + #undef JSON_HEDLEY_GNUC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) + #undef JSON_HEDLEY_GCC_HAS_EXTENSION +#endif +#if defined(__has_extension) + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) +#else + #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE +#endif +#if defined(__has_declspec_attribute) + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) +#else + #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_HAS_WARNING) + #undef JSON_HEDLEY_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) +#else + #define JSON_HEDLEY_HAS_WARNING(warning) (0) +#endif + +#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) + #undef JSON_HEDLEY_GNUC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_GCC_HAS_WARNING) + #undef JSON_HEDLEY_GCC_HAS_WARNING +#endif +#if defined(__has_warning) + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) +#else + #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + defined(__clang__) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ + (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) + #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_PRAGMA(value) __pragma(value) +#else + #define JSON_HEDLEY_PRAGMA(value) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) + #undef JSON_HEDLEY_DIAGNOSTIC_PUSH +#endif +#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) + #undef JSON_HEDLEY_DIAGNOSTIC_POP +#endif +#if defined(__clang__) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) + #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) +#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") + #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_PUSH + #define JSON_HEDLEY_DIAGNOSTIC_POP +#endif + +/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") +# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") +# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# else +# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ + xpr \ + JSON_HEDLEY_DIAGNOSTIC_POP +# endif +# endif +#endif +#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x +#endif + +#if defined(JSON_HEDLEY_CONST_CAST) + #undef JSON_HEDLEY_CONST_CAST +#endif +#if defined(__cplusplus) +# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) +#elif \ + JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_REINTERPRET_CAST) + #undef JSON_HEDLEY_REINTERPRET_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) +#else + #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_STATIC_CAST) + #undef JSON_HEDLEY_STATIC_CAST +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) +#else + #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) +#endif + +#if defined(JSON_HEDLEY_CPP_CAST) + #undef JSON_HEDLEY_CPP_CAST +#endif +#if defined(__cplusplus) +# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ + ((T) (expr)) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) +# define JSON_HEDLEY_CPP_CAST(T, expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("diag_suppress=Pe137") \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) +# endif +#else +# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") +#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") +#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") +#elif \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") +#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL +#endif + +#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) + #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") +#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) +#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") +#else + #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION +#endif + +#if defined(JSON_HEDLEY_DEPRECATED) + #undef JSON_HEDLEY_DEPRECATED +#endif +#if defined(JSON_HEDLEY_DEPRECATED_FOR) + #undef JSON_HEDLEY_DEPRECATED_FOR +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) +#elif \ + (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) +#elif defined(__cplusplus) && (__cplusplus >= 201402L) + #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") +#else + #define JSON_HEDLEY_DEPRECATED(since) + #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) +#endif + +#if defined(JSON_HEDLEY_UNAVAILABLE) + #undef JSON_HEDLEY_UNAVAILABLE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) +#else + #define JSON_HEDLEY_UNAVAILABLE(available_since) +#endif + +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT +#endif +#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) + #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) +#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) + #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) +#elif defined(_Check_return_) /* SAL */ + #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ +#else + #define JSON_HEDLEY_WARN_UNUSED_RESULT + #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) +#endif + +#if defined(JSON_HEDLEY_SENTINEL) + #undef JSON_HEDLEY_SENTINEL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) +#else + #define JSON_HEDLEY_SENTINEL(position) +#endif + +#if defined(JSON_HEDLEY_NO_RETURN) + #undef JSON_HEDLEY_NO_RETURN +#endif +#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NO_RETURN __noreturn +#elif \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L + #define JSON_HEDLEY_NO_RETURN _Noreturn +#elif defined(__cplusplus) && (__cplusplus >= 201103L) + #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) +#else + #define JSON_HEDLEY_NO_RETURN +#endif + +#if defined(JSON_HEDLEY_NO_ESCAPE) + #undef JSON_HEDLEY_NO_ESCAPE +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) + #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) +#else + #define JSON_HEDLEY_NO_ESCAPE +#endif + +#if defined(JSON_HEDLEY_UNREACHABLE) + #undef JSON_HEDLEY_UNREACHABLE +#endif +#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) + #undef JSON_HEDLEY_UNREACHABLE_RETURN +#endif +#if defined(JSON_HEDLEY_ASSUME) + #undef JSON_HEDLEY_ASSUME +#endif +#if \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_ASSUME(expr) __assume(expr) +#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) + #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) +#elif \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #if defined(__cplusplus) + #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) + #else + #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) + #endif +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() +#elif defined(JSON_HEDLEY_ASSUME) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif +#if !defined(JSON_HEDLEY_ASSUME) + #if defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) + #else + #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) + #endif +#endif +#if defined(JSON_HEDLEY_UNREACHABLE) + #if \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) + #else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() + #endif +#else + #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) +#endif +#if !defined(JSON_HEDLEY_UNREACHABLE) + #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) +#endif + +JSON_HEDLEY_DIAGNOSTIC_PUSH +#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") + #pragma clang diagnostic ignored "-Wpedantic" +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) + #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" +#endif +#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) + #if defined(__clang__) + #pragma clang diagnostic ignored "-Wvariadic-macros" + #elif defined(JSON_HEDLEY_GCC_VERSION) + #pragma GCC diagnostic ignored "-Wvariadic-macros" + #endif +#endif +#if defined(JSON_HEDLEY_NON_NULL) + #undef JSON_HEDLEY_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) +#else + #define JSON_HEDLEY_NON_NULL(...) +#endif +JSON_HEDLEY_DIAGNOSTIC_POP + +#if defined(JSON_HEDLEY_PRINTF_FORMAT) + #undef JSON_HEDLEY_PRINTF_FORMAT +#endif +#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) +#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) +#elif \ + JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) +#else + #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) +#endif + +#if defined(JSON_HEDLEY_CONSTEXPR) + #undef JSON_HEDLEY_CONSTEXPR +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) + #endif +#endif +#if !defined(JSON_HEDLEY_CONSTEXPR) + #define JSON_HEDLEY_CONSTEXPR +#endif + +#if defined(JSON_HEDLEY_PREDICT) + #undef JSON_HEDLEY_PREDICT +#endif +#if defined(JSON_HEDLEY_LIKELY) + #undef JSON_HEDLEY_LIKELY +#endif +#if defined(JSON_HEDLEY_UNLIKELY) + #undef JSON_HEDLEY_UNLIKELY +#endif +#if defined(JSON_HEDLEY_UNPREDICTABLE) + #undef JSON_HEDLEY_UNPREDICTABLE +#endif +#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) + #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) +#endif +#if \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) +#elif \ + (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ + (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ + })) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ + (__extension__ ({ \ + double hedley_probability_ = (probability); \ + ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ + })) +# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) +# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +#else +# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) +# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) +# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) +# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) +#endif +#if !defined(JSON_HEDLEY_UNPREDICTABLE) + #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) +#endif + +#if defined(JSON_HEDLEY_MALLOC) + #undef JSON_HEDLEY_MALLOC +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_MALLOC __declspec(restrict) +#else + #define JSON_HEDLEY_MALLOC +#endif + +#if defined(JSON_HEDLEY_PURE) + #undef JSON_HEDLEY_PURE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PURE __attribute__((__pure__)) +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) +# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ + ) +# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") +#else +# define JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_CONST) + #undef JSON_HEDLEY_CONST +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_CONST __attribute__((__const__)) +#elif \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) + #define JSON_HEDLEY_CONST _Pragma("no_side_effect") +#else + #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE +#endif + +#if defined(JSON_HEDLEY_RESTRICT) + #undef JSON_HEDLEY_RESTRICT +#endif +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT restrict +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ + defined(__clang__) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RESTRICT __restrict +#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) + #define JSON_HEDLEY_RESTRICT _Restrict +#else + #define JSON_HEDLEY_RESTRICT +#endif + +#if defined(JSON_HEDLEY_INLINE) + #undef JSON_HEDLEY_INLINE +#endif +#if \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ + (defined(__cplusplus) && (__cplusplus >= 199711L)) + #define JSON_HEDLEY_INLINE inline +#elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) + #define JSON_HEDLEY_INLINE __inline__ +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_INLINE __inline +#else + #define JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_ALWAYS_INLINE) + #undef JSON_HEDLEY_ALWAYS_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) +# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_ALWAYS_INLINE __forceinline +#elif defined(__cplusplus) && \ + ( \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ + ) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") +#else +# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE +#endif + +#if defined(JSON_HEDLEY_NEVER_INLINE) + #undef JSON_HEDLEY_NEVER_INLINE +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ + JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ + (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ + (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ + (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ + JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ + JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ + JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") +#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) + #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") +#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) + #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) + #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) +#else + #define JSON_HEDLEY_NEVER_INLINE +#endif + +#if defined(JSON_HEDLEY_PRIVATE) + #undef JSON_HEDLEY_PRIVATE +#endif +#if defined(JSON_HEDLEY_PUBLIC) + #undef JSON_HEDLEY_PUBLIC +#endif +#if defined(JSON_HEDLEY_IMPORT) + #undef JSON_HEDLEY_IMPORT +#endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC __declspec(dllexport) +# define JSON_HEDLEY_IMPORT __declspec(dllimport) +#else +# if \ + JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + ( \ + defined(__TI_EABI__) && \ + ( \ + (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ + ) \ + ) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) +# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) +# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) +# else +# define JSON_HEDLEY_PRIVATE +# define JSON_HEDLEY_PUBLIC +# endif +# define JSON_HEDLEY_IMPORT extern +#endif + +#if defined(JSON_HEDLEY_NO_THROW) + #undef JSON_HEDLEY_NO_THROW +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) + #define JSON_HEDLEY_NO_THROW __declspec(nothrow) +#else + #define JSON_HEDLEY_NO_THROW +#endif + +#if defined(JSON_HEDLEY_FALL_THROUGH) + #undef JSON_HEDLEY_FALL_THROUGH +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) +#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) + #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) +#elif defined(__fallthrough) /* SAL */ + #define JSON_HEDLEY_FALL_THROUGH __fallthrough +#else + #define JSON_HEDLEY_FALL_THROUGH +#endif + +#if defined(JSON_HEDLEY_RETURNS_NON_NULL) + #undef JSON_HEDLEY_RETURNS_NON_NULL +#endif +#if \ + JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) +#elif defined(_Ret_notnull_) /* SAL */ + #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ +#else + #define JSON_HEDLEY_RETURNS_NON_NULL +#endif + +#if defined(JSON_HEDLEY_ARRAY_PARAM) + #undef JSON_HEDLEY_ARRAY_PARAM +#endif +#if \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ + !defined(__STDC_NO_VLA__) && \ + !defined(__cplusplus) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_TINYC_VERSION) + #define JSON_HEDLEY_ARRAY_PARAM(name) (name) +#else + #define JSON_HEDLEY_ARRAY_PARAM(name) +#endif + +#if defined(JSON_HEDLEY_IS_CONSTANT) + #undef JSON_HEDLEY_IS_CONSTANT +#endif +#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) + #undef JSON_HEDLEY_REQUIRE_CONSTEXPR +#endif +/* JSON_HEDLEY_IS_CONSTEXPR_ is for + HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #undef JSON_HEDLEY_IS_CONSTEXPR_ +#endif +#if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ + (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) + #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) +#endif +#if !defined(__cplusplus) +# if \ + JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ + JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ + JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) +#endif +# elif \ + ( \ + defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ + !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ + !defined(JSON_HEDLEY_PGI_VERSION) && \ + !defined(JSON_HEDLEY_IAR_VERSION)) || \ + (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ + JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ + JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) +#if defined(__INTPTR_TYPE__) + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) +#else + #include + #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) +#endif +# elif \ + defined(JSON_HEDLEY_GCC_VERSION) || \ + defined(JSON_HEDLEY_INTEL_VERSION) || \ + defined(JSON_HEDLEY_TINYC_VERSION) || \ + defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ + JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ + defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ + defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ + defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ + defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ + defined(__clang__) +# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ + sizeof(void) != \ + sizeof(*( \ + 1 ? \ + ((void*) ((expr) * 0L) ) : \ +((struct { char v[sizeof(void) * 2]; } *) 1) \ + ) \ + ) \ + ) +# endif +#endif +#if defined(JSON_HEDLEY_IS_CONSTEXPR_) + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) +#else + #if !defined(JSON_HEDLEY_IS_CONSTANT) + #define JSON_HEDLEY_IS_CONSTANT(expr) (0) + #endif + #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) +#endif + +#if defined(JSON_HEDLEY_BEGIN_C_DECLS) + #undef JSON_HEDLEY_BEGIN_C_DECLS +#endif +#if defined(JSON_HEDLEY_END_C_DECLS) + #undef JSON_HEDLEY_END_C_DECLS +#endif +#if defined(JSON_HEDLEY_C_DECL) + #undef JSON_HEDLEY_C_DECL +#endif +#if defined(__cplusplus) + #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { + #define JSON_HEDLEY_END_C_DECLS } + #define JSON_HEDLEY_C_DECL extern "C" +#else + #define JSON_HEDLEY_BEGIN_C_DECLS + #define JSON_HEDLEY_END_C_DECLS + #define JSON_HEDLEY_C_DECL +#endif + +#if defined(JSON_HEDLEY_STATIC_ASSERT) + #undef JSON_HEDLEY_STATIC_ASSERT +#endif +#if \ + !defined(__cplusplus) && ( \ + (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ + (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ + JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ + defined(_Static_assert) \ + ) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) +#elif \ + (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ + JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) +#else +# define JSON_HEDLEY_STATIC_ASSERT(expr, message) +#endif + +#if defined(JSON_HEDLEY_NULL) + #undef JSON_HEDLEY_NULL +#endif +#if defined(__cplusplus) + #if __cplusplus >= 201103L + #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) + #elif defined(NULL) + #define JSON_HEDLEY_NULL NULL + #else + #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) + #endif +#elif defined(NULL) + #define JSON_HEDLEY_NULL NULL +#else + #define JSON_HEDLEY_NULL ((void*) 0) +#endif + +#if defined(JSON_HEDLEY_MESSAGE) + #undef JSON_HEDLEY_MESSAGE +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_MESSAGE(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(message msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) +#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) +#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) +# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_WARNING) + #undef JSON_HEDLEY_WARNING +#endif +#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") +# define JSON_HEDLEY_WARNING(msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ + JSON_HEDLEY_PRAGMA(clang warning msg) \ + JSON_HEDLEY_DIAGNOSTIC_POP +#elif \ + JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ + JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ + JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) +#elif \ + JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) +#else +# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) +#endif + +#if defined(JSON_HEDLEY_REQUIRE) + #undef JSON_HEDLEY_REQUIRE +#endif +#if defined(JSON_HEDLEY_REQUIRE_MSG) + #undef JSON_HEDLEY_REQUIRE_MSG +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) +# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") +# define JSON_HEDLEY_REQUIRE(expr) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), #expr, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ + __attribute__((diagnose_if(!(expr), msg, "error"))) \ + JSON_HEDLEY_DIAGNOSTIC_POP +# else +# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) +# endif +#else +# define JSON_HEDLEY_REQUIRE(expr) +# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) +#endif + +#if defined(JSON_HEDLEY_FLAGS) + #undef JSON_HEDLEY_FLAGS +#endif +#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) + #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) +#else + #define JSON_HEDLEY_FLAGS +#endif + +#if defined(JSON_HEDLEY_FLAGS_CAST) + #undef JSON_HEDLEY_FLAGS_CAST +#endif +#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) +# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ + JSON_HEDLEY_DIAGNOSTIC_PUSH \ + _Pragma("warning(disable:188)") \ + ((T) (expr)); \ + JSON_HEDLEY_DIAGNOSTIC_POP \ + })) +#else +# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) +#endif + +#if defined(JSON_HEDLEY_EMPTY_BASES) + #undef JSON_HEDLEY_EMPTY_BASES +#endif +#if \ + (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ + JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) + #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) +#else + #define JSON_HEDLEY_EMPTY_BASES +#endif + +/* Remaining macros are deprecated. */ + +#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) + #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK +#endif +#if defined(__clang__) + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) +#else + #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) +#endif + +#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) + #undef JSON_HEDLEY_CLANG_HAS_BUILTIN +#endif +#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) + +#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) + #undef JSON_HEDLEY_CLANG_HAS_FEATURE +#endif +#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) + +#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) + #undef JSON_HEDLEY_CLANG_HAS_EXTENSION +#endif +#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) + +#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) + #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE +#endif +#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) + +#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) + #undef JSON_HEDLEY_CLANG_HAS_WARNING +#endif +#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) + +#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ + + +// This file contains all internal macro definitions (except those affecting ABI) +// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them + +// #include + + +// exclude unsupported compilers +#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) + #if defined(__clang__) + #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 + #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) + #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 + #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" + #endif + #endif +#endif + +// C++ language standard detection +// if the user manually specified the used c++ version this is skipped +#if !defined(JSON_HAS_CPP_23) && !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) + #if (defined(__cplusplus) && __cplusplus > 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG > 202002L) + #define JSON_HAS_CPP_23 + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG > 201703L) + #define JSON_HAS_CPP_20 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201402L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 + #define JSON_HAS_CPP_17 + #define JSON_HAS_CPP_14 + #elif (defined(__cplusplus) && __cplusplus > 201103L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) + #define JSON_HAS_CPP_14 + #endif + // the cpp 11 flag is always specified because it is the minimal required version + #define JSON_HAS_CPP_11 +#endif + +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + +#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) + #ifdef JSON_HAS_CPP_17 + #if defined(__cpp_lib_filesystem) + #define JSON_HAS_FILESYSTEM 1 + #elif defined(__cpp_lib_experimental_filesystem) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif !defined(__has_include) + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_FILESYSTEM 1 + #elif __has_include() + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 + #endif + + // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ + #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support + #if defined(__clang_major__) && __clang_major__ < 7 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support + #if defined(_MSC_VER) && _MSC_VER < 1914 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before iOS 13 + #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + + // no filesystem support before macOS Catalina + #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 + #undef JSON_HAS_FILESYSTEM + #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #endif + #endif +#endif + +#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM + #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_FILESYSTEM + #define JSON_HAS_FILESYSTEM 0 +#endif + +#ifndef JSON_HAS_THREE_WAY_COMPARISON + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L + #define JSON_HAS_THREE_WAY_COMPARISON 1 + #else + #define JSON_HAS_THREE_WAY_COMPARISON 0 + #endif +#endif + +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifndef JSON_HAS_STATIC_RTTI + #if !defined(_HAS_STATIC_RTTI) || _HAS_STATIC_RTTI != 0 + #define JSON_HAS_STATIC_RTTI 1 + #else + #define JSON_HAS_STATIC_RTTI 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + +#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) + #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] +#else + #define JSON_NO_UNIQUE_ADDRESS +#endif + +// disable documentation warnings on clang +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +// allow disabling exceptions +#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) + #define JSON_THROW(exception) throw exception + #define JSON_TRY try + #define JSON_CATCH(exception) catch(exception) + #define JSON_INTERNAL_CATCH(exception) catch(exception) +#else + #include + #define JSON_THROW(exception) std::abort() + #define JSON_TRY if(true) + #define JSON_CATCH(exception) if(false) + #define JSON_INTERNAL_CATCH(exception) if(false) +#endif + +// override exception macros +#if defined(JSON_THROW_USER) + #undef JSON_THROW + #define JSON_THROW JSON_THROW_USER +#endif +#if defined(JSON_TRY_USER) + #undef JSON_TRY + #define JSON_TRY JSON_TRY_USER +#endif +#if defined(JSON_CATCH_USER) + #undef JSON_CATCH + #define JSON_CATCH JSON_CATCH_USER + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_CATCH_USER +#endif +#if defined(JSON_INTERNAL_CATCH_USER) + #undef JSON_INTERNAL_CATCH + #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER +#endif + +// allow overriding assert +#if !defined(JSON_ASSERT) + #include // assert + #define JSON_ASSERT(x) assert(x) +#endif + +// allow to access some private functions (needed by the test suite) +#if defined(JSON_TESTS_PRIVATE) + #define JSON_PRIVATE_UNLESS_TESTED public +#else + #define JSON_PRIVATE_UNLESS_TESTED private +#endif + +/*! +@brief macro to briefly define a mapping between an enum and JSON +@def NLOHMANN_JSON_SERIALIZE_ENUM +@since version 3.4.0 +*/ +#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ + template \ + inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [e](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.first == e; \ + }); \ + j = ((it != std::end(m)) ? it : std::begin(m))->second; \ + } \ + template \ + inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ + { \ + /* NOLINTNEXTLINE(modernize-type-traits) we use C++11 */ \ + static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ + /* NOLINTNEXTLINE(modernize-avoid-c-arrays) we don't want to depend on */ \ + static const std::pair m[] = __VA_ARGS__; \ + auto it = std::find_if(std::begin(m), std::end(m), \ + [&j](const std::pair& ej_pair) -> bool \ + { \ + return ej_pair.second == j; \ + }); \ + e = ((it != std::end(m)) ? it : std::begin(m))->first; \ + } + +// Ugly macros to avoid uglier copy-paste when specializing basic_json. They +// may be removed in the future once the class is split. + +#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ + template class ObjectType, \ + template class ArrayType, \ + class StringType, class BooleanType, class NumberIntegerType, \ + class NumberUnsignedType, class NumberFloatType, \ + template class AllocatorType, \ + template class JSONSerializer, \ + class BinaryType, \ + class CustomBaseClass> + +#define NLOHMANN_BASIC_JSON_TPL \ + basic_json + +// Macros to simplify conversion from/to types + +#define NLOHMANN_JSON_EXPAND( x ) x +#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME +#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ + NLOHMANN_JSON_PASTE64, \ + NLOHMANN_JSON_PASTE63, \ + NLOHMANN_JSON_PASTE62, \ + NLOHMANN_JSON_PASTE61, \ + NLOHMANN_JSON_PASTE60, \ + NLOHMANN_JSON_PASTE59, \ + NLOHMANN_JSON_PASTE58, \ + NLOHMANN_JSON_PASTE57, \ + NLOHMANN_JSON_PASTE56, \ + NLOHMANN_JSON_PASTE55, \ + NLOHMANN_JSON_PASTE54, \ + NLOHMANN_JSON_PASTE53, \ + NLOHMANN_JSON_PASTE52, \ + NLOHMANN_JSON_PASTE51, \ + NLOHMANN_JSON_PASTE50, \ + NLOHMANN_JSON_PASTE49, \ + NLOHMANN_JSON_PASTE48, \ + NLOHMANN_JSON_PASTE47, \ + NLOHMANN_JSON_PASTE46, \ + NLOHMANN_JSON_PASTE45, \ + NLOHMANN_JSON_PASTE44, \ + NLOHMANN_JSON_PASTE43, \ + NLOHMANN_JSON_PASTE42, \ + NLOHMANN_JSON_PASTE41, \ + NLOHMANN_JSON_PASTE40, \ + NLOHMANN_JSON_PASTE39, \ + NLOHMANN_JSON_PASTE38, \ + NLOHMANN_JSON_PASTE37, \ + NLOHMANN_JSON_PASTE36, \ + NLOHMANN_JSON_PASTE35, \ + NLOHMANN_JSON_PASTE34, \ + NLOHMANN_JSON_PASTE33, \ + NLOHMANN_JSON_PASTE32, \ + NLOHMANN_JSON_PASTE31, \ + NLOHMANN_JSON_PASTE30, \ + NLOHMANN_JSON_PASTE29, \ + NLOHMANN_JSON_PASTE28, \ + NLOHMANN_JSON_PASTE27, \ + NLOHMANN_JSON_PASTE26, \ + NLOHMANN_JSON_PASTE25, \ + NLOHMANN_JSON_PASTE24, \ + NLOHMANN_JSON_PASTE23, \ + NLOHMANN_JSON_PASTE22, \ + NLOHMANN_JSON_PASTE21, \ + NLOHMANN_JSON_PASTE20, \ + NLOHMANN_JSON_PASTE19, \ + NLOHMANN_JSON_PASTE18, \ + NLOHMANN_JSON_PASTE17, \ + NLOHMANN_JSON_PASTE16, \ + NLOHMANN_JSON_PASTE15, \ + NLOHMANN_JSON_PASTE14, \ + NLOHMANN_JSON_PASTE13, \ + NLOHMANN_JSON_PASTE12, \ + NLOHMANN_JSON_PASTE11, \ + NLOHMANN_JSON_PASTE10, \ + NLOHMANN_JSON_PASTE9, \ + NLOHMANN_JSON_PASTE8, \ + NLOHMANN_JSON_PASTE7, \ + NLOHMANN_JSON_PASTE6, \ + NLOHMANN_JSON_PASTE5, \ + NLOHMANN_JSON_PASTE4, \ + NLOHMANN_JSON_PASTE3, \ + NLOHMANN_JSON_PASTE2, \ + NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) +#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) +#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) +#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) +#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) +#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) +#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) +#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) +#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) +#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) +#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) +#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) +#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) +#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) +#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) +#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) +#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) +#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) +#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) +#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) +#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) +#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) +#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) +#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) +#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) +#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) +#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) +#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) +#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) +#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) +#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) +#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) +#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) +#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) +#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) +#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) +#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) +#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) +#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) +#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) +#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) +#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) +#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) +#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) +#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) +#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) +#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) +#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) +#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) +#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) +#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) +#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) +#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) +#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) +#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) +#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) +#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) +#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) +#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) +#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) +#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) +#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) +#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) +#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) + +#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; +#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); +#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = !nlohmann_json_j.is_null() ? nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1) : nlohmann_json_default_obj.v1; + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE +@since version 3.9.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.11.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.11.3 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_type_non_intrusive/ +*/ +#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + friend void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + friend void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ + template::value, int> = 0> \ + void from_json(const BasicJsonType& nlohmann_json_j, Type& nlohmann_json_t) { nlohmann::from_json(nlohmann_json_j, static_cast(nlohmann_json_t)); const Type nlohmann_json_default_obj{}; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } + +/*! +@brief macro +@def NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE +@since version 3.12.0 +@sa https://json.nlohmann.me/api/macros/nlohmann_define_derived_type/ +*/ +#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(Type, BaseType, ...) \ + template::value, int> = 0> \ + void to_json(BasicJsonType& nlohmann_json_j, const Type& nlohmann_json_t) { nlohmann::to_json(nlohmann_json_j, static_cast(nlohmann_json_t)); NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } + +// inspired from https://stackoverflow.com/a/26745591 +// allows calling any std function as if (e.g., with begin): +// using std::begin; begin(x); +// +// it allows using the detected idiom to retrieve the return type +// of such an expression +#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ + namespace detail { \ + using std::std_name; \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + } \ + \ + namespace detail2 { \ + struct std_name##_tag \ + { \ + }; \ + \ + template \ + std_name##_tag std_name(T&&...); \ + \ + template \ + using result_of_##std_name = decltype(std_name(std::declval()...)); \ + \ + template \ + struct would_call_std_##std_name \ + { \ + static constexpr auto const value = ::nlohmann::detail:: \ + is_detected_exact::value; \ + }; \ + } /* namespace detail2 */ \ + \ + template \ + struct would_call_std_##std_name : detail2::would_call_std_##std_name \ + { \ + } + +#ifndef JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_USE_IMPLICIT_CONVERSIONS 1 +#endif + +#if JSON_USE_IMPLICIT_CONVERSIONS + #define JSON_EXPLICIT +#else + #define JSON_EXPLICIT explicit +#endif + +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 +#endif + +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif + +#if JSON_HAS_THREE_WAY_COMPARISON + #include // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/*! +@brief replace all occurrences of a substring by another string + +@param[in,out] s the string to manipulate; changed so that all + occurrences of @a f are replaced with @a t +@param[in] f the substring to replace with @a t +@param[in] t the string to replace @a f + +@pre The search string @a f must not be empty. **This precondition is +enforced with an assertion.** + +@since version 2.0.0 +*/ +template +inline void replace_substring(StringType& s, const StringType& f, + const StringType& t) +{ + JSON_ASSERT(!f.empty()); + for (auto pos = s.find(f); // find first occurrence of f + pos != StringType::npos; // make sure f was found + s.replace(pos, f.size(), t), // replace with t, and + pos = s.find(f, pos + t.size())) // find next occurrence of f + {} +} + +/*! + * @brief string escaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to escape + * @return escaped string + * + * Note the order of escaping "~" to "~0" and "/" to "~1" is important. + */ +template +inline StringType escape(StringType s) +{ + replace_substring(s, StringType{"~"}, StringType{"~0"}); + replace_substring(s, StringType{"/"}, StringType{"~1"}); + return s; +} + +/*! + * @brief string unescaping as described in RFC 6901 (Sect. 4) + * @param[in] s string to unescape + * @return unescaped string + * + * Note the order of escaping "~1" to "/" and "~0" to "~" is important. + */ +template +static void unescape(StringType& s) +{ + replace_substring(s, StringType{"~1"}, StringType{"/"}); + replace_substring(s, StringType{"~0"}, StringType{"~"}); +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // size_t + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +/// struct to capture the start position of the current token +struct position_t +{ + /// the total number of characters read + std::size_t chars_read_total = 0; + /// the number of characters read in the current line + std::size_t chars_read_current_line = 0; + /// the number of lines read + std::size_t lines_read = 0; + + /// conversion to size_t to preserve SAX interface + constexpr operator size_t() const + { + return chars_read_total; + } +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + + + +#include // array +#include // size_t +#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type +#include // index_sequence, make_index_sequence, index_sequence_for + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +using uncvref_t = typename std::remove_cv::type>::type; + +#ifdef JSON_HAS_CPP_14 + +// the following utilities are natively available in C++14 +using std::enable_if_t; +using std::index_sequence; +using std::make_index_sequence; +using std::index_sequence_for; + +#else + +// alias templates to reduce boilerplate +template +using enable_if_t = typename std::enable_if::type; + +// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h +// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. + +//// START OF CODE FROM GOOGLE ABSEIL + +// integer_sequence +// +// Class template representing a compile-time integer sequence. An instantiation +// of `integer_sequence` has a sequence of integers encoded in its +// type through its template arguments (which is a common need when +// working with C++11 variadic templates). `absl::integer_sequence` is designed +// to be a drop-in replacement for C++14's `std::integer_sequence`. +// +// Example: +// +// template< class T, T... Ints > +// void user_function(integer_sequence); +// +// int main() +// { +// // user_function's `T` will be deduced to `int` and `Ints...` +// // will be deduced to `0, 1, 2, 3, 4`. +// user_function(make_integer_sequence()); +// } +template +struct integer_sequence +{ + using value_type = T; + static constexpr std::size_t size() noexcept + { + return sizeof...(Ints); + } +}; + +// index_sequence +// +// A helper template for an `integer_sequence` of `size_t`, +// `absl::index_sequence` is designed to be a drop-in replacement for C++14's +// `std::index_sequence`. +template +using index_sequence = integer_sequence; + +namespace utility_internal +{ + +template +struct Extend; + +// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. +template +struct Extend, SeqSize, 0> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; +}; + +template +struct Extend, SeqSize, 1> +{ + using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; +}; + +// Recursion helper for 'make_integer_sequence'. +// 'Gen::type' is an alias for 'integer_sequence'. +template +struct Gen +{ + using type = + typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; +}; + +template +struct Gen +{ + using type = integer_sequence; +}; + +} // namespace utility_internal + +// Compile-time sequences of integers + +// make_integer_sequence +// +// This template alias is equivalent to +// `integer_sequence`, and is designed to be a drop-in +// replacement for C++14's `std::make_integer_sequence`. +template +using make_integer_sequence = typename utility_internal::Gen::type; + +// make_index_sequence +// +// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, +// and is designed to be a drop-in replacement for C++14's +// `std::make_index_sequence`. +template +using make_index_sequence = make_integer_sequence; + +// index_sequence_for +// +// Converts a typename pack into an index sequence of the same length, and +// is designed to be a drop-in replacement for C++14's +// `std::index_sequence_for()` +template +using index_sequence_for = make_index_sequence; + +//// END OF CODE FROM GOOGLE ABSEIL + +#endif + +// dispatch utility (taken from ranges-v3) +template struct priority_tag : priority_tag < N - 1 > {}; +template<> struct priority_tag<0> {}; + +// taken from ranges-v3 +template +struct static_const +{ + static JSON_INLINE_VARIABLE constexpr T value{}; +}; + +#ifndef JSON_HAS_CPP_17 + template + constexpr T static_const::value; +#endif + +template +constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // numeric_limits +#include // char_traits +#include // tuple +#include // false_type, is_constructible, is_integral, is_same, true_type +#include // declval + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include // random_access_iterator_tag + +// #include + +// #include + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template +struct iterator_types {}; + +template +struct iterator_types < + It, + void_t> +{ + using difference_type = typename It::difference_type; + using value_type = typename It::value_type; + using pointer = typename It::pointer; + using reference = typename It::reference; + using iterator_category = typename It::iterator_category; +}; + +// This is required as some compilers implement std::iterator_traits in a way that +// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. +template +struct iterator_traits +{ +}; + +template +struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> + : iterator_types +{ +}; + +template +struct iterator_traits::value>> +{ + using iterator_category = std::random_access_iterator_tag; + using value_type = T; + using difference_type = ptrdiff_t; + using pointer = T*; + using reference = T&; +}; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); + +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN + +NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); + +NLOHMANN_JSON_NAMESPACE_END + +// #include + +// #include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.12.0 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013 - 2025 Niels Lohmann +// SPDX-License-Identifier: MIT + +#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + #include // int64_t, uint64_t + #include // map + #include // allocator + #include // string + #include // vector + + // #include + + + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN + + /*! + @brief default JSONSerializer template argument + + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template + struct adl_serializer; + + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector, // cppcheck-suppress syntaxError + class CustomBaseClass = void> + class basic_json; + + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template + class json_pointer; + + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json; + + NLOHMANN_JSON_NAMESPACE_END + +#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ + + +NLOHMANN_JSON_NAMESPACE_BEGIN +/*! +@brief detail namespace with internal helper functions + +This namespace collects functions that should not be exposed, +implementations of some @ref basic_json methods, and meta-programming helpers. + +@since version 2.1.0 +*/ +namespace detail +{ + +///////////// +// helpers // +///////////// + +// Note to maintainers: +// +// Every trait in this file expects a non CV-qualified type. +// The only exceptions are in the 'aliases for detected' section +// (i.e. those of the form: decltype(T::member_function(std::declval()))) +// +// In this case, T has to be properly CV-qualified to constraint the function arguments +// (e.g. to_json(BasicJsonType&, const T&)) + +template struct is_basic_json : std::false_type {}; + +NLOHMANN_BASIC_JSON_TPL_DECLARATION +struct is_basic_json : std::true_type {}; + +// used by exceptions create() member functions +// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t +// false_type otherwise +template +struct is_basic_json_context : + std::integral_constant < bool, + is_basic_json::type>::type>::value + || std::is_same::value > +{}; + +////////////////////// +// json_ref helpers // +////////////////////// + +template +class json_ref; + +template +struct is_json_ref : std::false_type {}; + +template +struct is_json_ref> : std::true_type {}; + +////////////////////////// +// aliases for detected // +////////////////////////// + +template +using mapped_type_t = typename T::mapped_type; + +template +using key_type_t = typename T::key_type; + +template +using value_type_t = typename T::value_type; + +template +using difference_type_t = typename T::difference_type; + +template +using pointer_t = typename T::pointer; + +template +using reference_t = typename T::reference; + +template +using iterator_category_t = typename T::iterator_category; + +template +using to_json_function = decltype(T::to_json(std::declval()...)); + +template +using from_json_function = decltype(T::from_json(std::declval()...)); + +template +using get_template_function = decltype(std::declval().template get()); + +// trait checking if JSONSerializer::from_json(json const&, udt&) exists +template +struct has_from_json : std::false_type {}; + +// trait checking if j.get is valid +// use this trait instead of std::is_constructible or std::is_convertible, +// both rely on, or make use of implicit conversions, and thus fail when T +// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) +template +struct is_getable +{ + static constexpr bool value = is_detected::value; +}; + +template +struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if JSONSerializer::from_json(json const&) exists +// this overload is used for non-default-constructible user-defined-types +template +struct has_non_default_from_json : std::false_type {}; + +template +struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +// This trait checks if BasicJsonType::json_serializer::to_json exists +// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. +template +struct has_to_json : std::false_type {}; + +template +struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> +{ + using serializer = typename BasicJsonType::template json_serializer; + + static constexpr bool value = + is_detected_exact::value; +}; + +template +using detect_key_compare = typename T::key_compare; + +template +struct has_key_compare : std::integral_constant::value> {}; + +// obtains the actual object key comparator +template +struct actual_object_comparator +{ + using object_t = typename BasicJsonType::object_t; + using object_comparator_t = typename BasicJsonType::default_object_comparator_t; + using type = typename std::conditional < has_key_compare::value, + typename object_t::key_compare, object_comparator_t>::type; +}; + +template +using actual_object_comparator_t = typename actual_object_comparator::type; + +///////////////// +// char_traits // +///////////////// + +// Primary template of char_traits calls std char_traits +template +struct char_traits : std::char_traits +{}; + +// Explicitly define char traits for unsigned char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = unsigned char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +// Explicitly define char traits for signed char since it is not standard +template<> +struct char_traits : std::char_traits +{ + using char_type = signed char; + using int_type = uint64_t; + + // Redefine to_int_type function + static int_type to_int_type(char_type c) noexcept + { + return static_cast(c); + } + + static char_type to_char_type(int_type i) noexcept + { + return static_cast(i); + } + + static constexpr int_type eof() noexcept + { + return static_cast(std::char_traits::eof()); + } +}; + +/////////////////// +// is_ functions // +/////////////////// + +// https://en.cppreference.com/w/cpp/types/conjunction +template struct conjunction : std::true_type { }; +template struct conjunction : B { }; +template +struct conjunction +: std::conditional(B::value), conjunction, B>::type {}; + +// https://en.cppreference.com/w/cpp/types/negation +template struct negation : std::integral_constant < bool, !B::value > { }; + +// Reimplementation of is_constructible and is_default_constructible, due to them being broken for +// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). +// This causes compile errors in e.g. clang 3.5 or gcc 4.9. +template +struct is_default_constructible : std::is_default_constructible {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction, is_default_constructible> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_default_constructible> + : conjunction...> {}; + +template +struct is_constructible : std::is_constructible {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_constructible> : is_default_constructible> {}; + +template +struct is_iterator_traits : std::false_type {}; + +template +struct is_iterator_traits> +{ + private: + using traits = iterator_traits; + + public: + static constexpr auto value = + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value && + is_detected::value; +}; + +template +struct is_range +{ + private: + using t_ref = typename std::add_lvalue_reference::type; + + using iterator = detected_t; + using sentinel = detected_t; + + // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator + // and https://en.cppreference.com/w/cpp/iterator/sentinel_for + // but reimplementing these would be too much work, as a lot of other concepts are used underneath + static constexpr auto is_iterator_begin = + is_iterator_traits>::value; + + public: + static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; +}; + +template +using iterator_t = enable_if_t::value, result_of_begin())>>; + +template +using range_value_t = value_type_t>>; + +// The following implementation of is_complete_type is taken from +// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ +// and is written by Xiang Fan who agreed to using it in this library. + +template +struct is_complete_type : std::false_type {}; + +template +struct is_complete_type : std::true_type {}; + +template +struct is_compatible_object_type_impl : std::false_type {}; + +template +struct is_compatible_object_type_impl < + BasicJsonType, CompatibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + // macOS's is_constructible does not play well with nonesuch... + static constexpr bool value = + is_constructible::value && + is_constructible::value; +}; + +template +struct is_compatible_object_type + : is_compatible_object_type_impl {}; + +template +struct is_constructible_object_type_impl : std::false_type {}; + +template +struct is_constructible_object_type_impl < + BasicJsonType, ConstructibleObjectType, + enable_if_t < is_detected::value&& + is_detected::value >> +{ + using object_t = typename BasicJsonType::object_t; + + static constexpr bool value = + (is_default_constructible::value && + (std::is_move_assignable::value || + std::is_copy_assignable::value) && + (is_constructible::value && + std::is_same < + typename object_t::mapped_type, + typename ConstructibleObjectType::mapped_type >::value)) || + (has_from_json::value || + has_non_default_from_json < + BasicJsonType, + typename ConstructibleObjectType::mapped_type >::value); +}; + +template +struct is_constructible_object_type + : is_constructible_object_type_impl {}; + +template +struct is_compatible_string_type +{ + static constexpr auto value = + is_constructible::value; +}; + +template +struct is_constructible_string_type +{ + // launder type through decltype() to fix compilation failure on ICPC +#ifdef __INTEL_COMPILER + using laundered_type = decltype(std::declval()); +#else + using laundered_type = ConstructibleStringType; +#endif + + static constexpr auto value = + conjunction < + is_constructible, + is_detected_exact>::value; +}; + +template +struct is_compatible_array_type_impl : std::false_type {}; + +template +struct is_compatible_array_type_impl < + BasicJsonType, CompatibleArrayType, + enable_if_t < + is_detected::value&& + is_iterator_traits>>::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 + !std::is_same>::value >> +{ + static constexpr bool value = + is_constructible>::value; +}; + +template +struct is_compatible_array_type + : is_compatible_array_type_impl {}; + +template +struct is_constructible_array_type_impl : std::false_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t::value >> + : std::true_type {}; + +template +struct is_constructible_array_type_impl < + BasicJsonType, ConstructibleArrayType, + enable_if_t < !std::is_same::value&& + !is_compatible_string_type::value&& + is_default_constructible::value&& +(std::is_move_assignable::value || + std::is_copy_assignable::value)&& +is_detected::value&& +is_iterator_traits>>::value&& +is_detected::value&& +// special case for types like std::filesystem::path whose iterator's value_type are themselves +// c.f. https://github.com/nlohmann/json/pull/3073 +!std::is_same>::value&& +is_complete_type < +detected_t>::value >> +{ + using value_type = range_value_t; + + static constexpr bool value = + std::is_same::value || + has_from_json::value || + has_non_default_from_json < + BasicJsonType, + value_type >::value; +}; + +template +struct is_constructible_array_type + : is_constructible_array_type_impl {}; + +template +struct is_compatible_integer_type_impl : std::false_type {}; + +template +struct is_compatible_integer_type_impl < + RealIntegerType, CompatibleNumberIntegerType, + enable_if_t < std::is_integral::value&& + std::is_integral::value&& + !std::is_same::value >> +{ + // is there an assert somewhere on overflows? + using RealLimits = std::numeric_limits; + using CompatibleLimits = std::numeric_limits; + + static constexpr auto value = + is_constructible::value && + CompatibleLimits::is_integer && + RealLimits::is_signed == CompatibleLimits::is_signed; +}; + +template +struct is_compatible_integer_type + : is_compatible_integer_type_impl {}; + +template +struct is_compatible_type_impl: std::false_type {}; + +template +struct is_compatible_type_impl < + BasicJsonType, CompatibleType, + enable_if_t::value >> +{ + static constexpr bool value = + has_to_json::value; +}; + +template +struct is_compatible_type + : is_compatible_type_impl {}; + +template +struct is_constructible_tuple : std::false_type {}; + +template +struct is_constructible_tuple> : conjunction...> {}; + +template +struct is_json_iterator_of : std::false_type {}; + +template +struct is_json_iterator_of : std::true_type {}; + +template +struct is_json_iterator_of : std::true_type +{}; + +// checks if a given type T is a template specialization of Primary +template