From fcd8920e344aded6518dc9756f675f84d6cb138b Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 13 Feb 2026 20:21:30 +0200 Subject: [PATCH] fix: replace curl_error_map with switch to fix Static Initialization Order Fiasco --- cpr/error.cpp | 221 +++++++++++++++++++++++++++++++------------------- 1 file changed, 138 insertions(+), 83 deletions(-) diff --git a/cpr/error.cpp b/cpr/error.cpp index 8714b86bb..4c533a670 100644 --- a/cpr/error.cpp +++ b/cpr/error.cpp @@ -2,167 +2,222 @@ #include #include #include -#include namespace cpr { -// NOLINTNEXTLINE - (needed because of static init) -static const std::unordered_map curl_error_map = { - {CURLE_OK, ErrorCode::OK}, - {CURLE_UNSUPPORTED_PROTOCOL, ErrorCode::UNSUPPORTED_PROTOCOL}, - {CURLE_FAILED_INIT, ErrorCode::FAILED_INIT}, - {CURLE_URL_MALFORMAT, ErrorCode::URL_MALFORMAT}, - {CURLE_NOT_BUILT_IN, ErrorCode::NOT_BUILT_IN}, - {CURLE_COULDNT_RESOLVE_PROXY, ErrorCode::COULDNT_RESOLVE_PROXY}, - {CURLE_COULDNT_RESOLVE_HOST, ErrorCode::COULDNT_RESOLVE_HOST}, - {CURLE_COULDNT_CONNECT, ErrorCode::COULDNT_CONNECT}, - +ErrorCode Error::getErrorCodeForCurlError(std::int32_t curl_code) { + switch (curl_code) + { + case CURLE_OK: + return ErrorCode::OK; + case CURLE_UNSUPPORTED_PROTOCOL: + return ErrorCode::UNSUPPORTED_PROTOCOL; + case CURLE_FAILED_INIT: + return ErrorCode::FAILED_INIT; + case CURLE_URL_MALFORMAT: + return ErrorCode::URL_MALFORMAT; + case CURLE_NOT_BUILT_IN: + return ErrorCode::NOT_BUILT_IN; + case CURLE_COULDNT_RESOLVE_PROXY: + return ErrorCode::COULDNT_RESOLVE_PROXY; + case CURLE_COULDNT_RESOLVE_HOST: + return ErrorCode::COULDNT_RESOLVE_HOST; + case CURLE_COULDNT_CONNECT: + return ErrorCode::COULDNT_CONNECT; + // Name changed in curl >= 7.51.0. #if LIBCURL_VERSION_NUM >= 0x073300 - {CURLE_WEIRD_SERVER_REPLY, ErrorCode::WEIRD_SERVER_REPLY}, + case CURLE_WEIRD_SERVER_REPLY: + return ErrorCode::WEIRD_SERVER_REPLY; #else - {CURLE_FTP_WEIRD_SERVER_REPLY, ErrorCode::WEIRD_SERVER_REPLY}, -#endif - - {CURLE_REMOTE_ACCESS_DENIED, ErrorCode::REMOTE_ACCESS_DENIED}, - {CURLE_HTTP2, ErrorCode::HTTP2}, - {CURLE_QUOTE_ERROR, ErrorCode::QUOTE_ERROR}, - {CURLE_HTTP_RETURNED_ERROR, ErrorCode::HTTP_RETURNED_ERROR}, - {CURLE_WRITE_ERROR, ErrorCode::WRITE_ERROR}, - {CURLE_UPLOAD_FAILED, ErrorCode::UPLOAD_FAILED}, - {CURLE_READ_ERROR, ErrorCode::READ_ERROR}, - {CURLE_OUT_OF_MEMORY, ErrorCode::OUT_OF_MEMORY}, - {CURLE_OPERATION_TIMEDOUT, ErrorCode::OPERATION_TIMEDOUT}, - {CURLE_RANGE_ERROR, ErrorCode::RANGE_ERROR}, - {CURLE_HTTP_POST_ERROR, ErrorCode::HTTP_POST_ERROR}, - {CURLE_SSL_CONNECT_ERROR, ErrorCode::SSL_CONNECT_ERROR}, - {CURLE_BAD_DOWNLOAD_RESUME, ErrorCode::BAD_DOWNLOAD_RESUME}, - {CURLE_FILE_COULDNT_READ_FILE, ErrorCode::FILE_COULDNT_READ_FILE}, - {CURLE_FUNCTION_NOT_FOUND, ErrorCode::FUNCTION_NOT_FOUND}, - {CURLE_ABORTED_BY_CALLBACK, ErrorCode::ABORTED_BY_CALLBACK}, - {CURLE_BAD_FUNCTION_ARGUMENT, ErrorCode::BAD_FUNCTION_ARGUMENT}, - {CURLE_INTERFACE_FAILED, ErrorCode::INTERFACE_FAILED}, - {CURLE_TOO_MANY_REDIRECTS, ErrorCode::TOO_MANY_REDIRECTS}, - {CURLE_UNKNOWN_OPTION, ErrorCode::UNKNOWN_OPTION}, - + case CURLE_FTP_WEIRD_SERVER_REPLY: + return ErrorCode::WEIRD_SERVER_REPLY; +#endif + case CURLE_REMOTE_ACCESS_DENIED: + return ErrorCode::REMOTE_ACCESS_DENIED; + case CURLE_HTTP2: + return ErrorCode::HTTP2; + case CURLE_QUOTE_ERROR: + return ErrorCode::QUOTE_ERROR; + case CURLE_HTTP_RETURNED_ERROR: + return ErrorCode::HTTP_RETURNED_ERROR; + case CURLE_WRITE_ERROR: + return ErrorCode::WRITE_ERROR; + case CURLE_UPLOAD_FAILED: + return ErrorCode::UPLOAD_FAILED; + case CURLE_READ_ERROR: + return ErrorCode::READ_ERROR; + case CURLE_OUT_OF_MEMORY: + return ErrorCode::OUT_OF_MEMORY; + case CURLE_OPERATION_TIMEDOUT: + return ErrorCode::OPERATION_TIMEDOUT; + case CURLE_RANGE_ERROR: + return ErrorCode::RANGE_ERROR; + case CURLE_HTTP_POST_ERROR: + return ErrorCode::HTTP_POST_ERROR; + case CURLE_SSL_CONNECT_ERROR: + return ErrorCode::SSL_CONNECT_ERROR; + case CURLE_BAD_DOWNLOAD_RESUME: + return ErrorCode::BAD_DOWNLOAD_RESUME; + case CURLE_FILE_COULDNT_READ_FILE: + return ErrorCode::FILE_COULDNT_READ_FILE; + case CURLE_FUNCTION_NOT_FOUND: + return ErrorCode::FUNCTION_NOT_FOUND; + case CURLE_ABORTED_BY_CALLBACK: + return ErrorCode::ABORTED_BY_CALLBACK; + case CURLE_BAD_FUNCTION_ARGUMENT: + return ErrorCode::BAD_FUNCTION_ARGUMENT; + case CURLE_INTERFACE_FAILED: + return ErrorCode::INTERFACE_FAILED; + case CURLE_TOO_MANY_REDIRECTS: + return ErrorCode::TOO_MANY_REDIRECTS; + case CURLE_UNKNOWN_OPTION: + return ErrorCode::UNKNOWN_OPTION; // Added in curl 7.78.0. #if LIBCURL_VERSION_NUM >= 0x074E00 - {CURLE_SETOPT_OPTION_SYNTAX, ErrorCode::SETOPT_OPTION_SYNTAX}, -#endif - - {CURLE_GOT_NOTHING, ErrorCode::GOT_NOTHING}, - {CURLE_SSL_ENGINE_NOTFOUND, ErrorCode::SSL_ENGINE_NOTFOUND}, - {CURLE_SSL_ENGINE_SETFAILED, ErrorCode::SSL_ENGINE_SETFAILED}, - {CURLE_SEND_ERROR, ErrorCode::SEND_ERROR}, - {CURLE_RECV_ERROR, ErrorCode::RECV_ERROR}, - {CURLE_SSL_CERTPROBLEM, ErrorCode::SSL_CERTPROBLEM}, - {CURLE_SSL_CIPHER, ErrorCode::SSL_CIPHER}, - {CURLE_PEER_FAILED_VERIFICATION, ErrorCode::PEER_FAILED_VERIFICATION}, - {CURLE_BAD_CONTENT_ENCODING, ErrorCode::BAD_CONTENT_ENCODING}, - {CURLE_FILESIZE_EXCEEDED, ErrorCode::FILESIZE_EXCEEDED}, - {CURLE_USE_SSL_FAILED, ErrorCode::USE_SSL_FAILED}, - {CURLE_SEND_FAIL_REWIND, ErrorCode::SEND_FAIL_REWIND}, - {CURLE_SSL_ENGINE_INITFAILED, ErrorCode::SSL_ENGINE_INITFAILED}, + case CURLE_SETOPT_OPTION_SYNTAX: + return ErrorCode::SETOPT_OPTION_SYNTAX; +#endif + case CURLE_GOT_NOTHING: + return ErrorCode::GOT_NOTHING; + case CURLE_SSL_ENGINE_NOTFOUND: + return ErrorCode::SSL_ENGINE_NOTFOUND; + case CURLE_SSL_ENGINE_SETFAILED: + return ErrorCode::SSL_ENGINE_SETFAILED; + case CURLE_SEND_ERROR: + return ErrorCode::SEND_ERROR; + case CURLE_RECV_ERROR: + return ErrorCode::RECV_ERROR; + case CURLE_SSL_CERTPROBLEM: + return ErrorCode::SSL_CERTPROBLEM; + case CURLE_SSL_CIPHER: + return ErrorCode::SSL_CIPHER; + case CURLE_PEER_FAILED_VERIFICATION: + return ErrorCode::PEER_FAILED_VERIFICATION; + case CURLE_BAD_CONTENT_ENCODING: + return ErrorCode::BAD_CONTENT_ENCODING; + case CURLE_FILESIZE_EXCEEDED: + return ErrorCode::FILESIZE_EXCEEDED; + case CURLE_USE_SSL_FAILED: + return ErrorCode::USE_SSL_FAILED; + case CURLE_SEND_FAIL_REWIND: + return ErrorCode::SEND_FAIL_REWIND; + case CURLE_SSL_ENGINE_INITFAILED: + return ErrorCode::SSL_ENGINE_INITFAILED; // Added in curl 7.13.1. #if LIBCURL_VERSION_NUM >= 0x070D01 - {CURLE_LOGIN_DENIED, ErrorCode::LOGIN_DENIED}, + case CURLE_LOGIN_DENIED: + return ErrorCode::LOGIN_DENIED; #endif // Added in curl 7.16.0. #if LIBCURL_VERSION_NUM >= 0x071000 - {CURLE_SSL_CACERT_BADFILE, ErrorCode::SSL_CACERT_BADFILE}, + case CURLE_SSL_CACERT_BADFILE: + return ErrorCode::SSL_CACERT_BADFILE; #endif // Added in curl 7.16.1. #if LIBCURL_VERSION_NUM >= 0x071001 - {CURLE_SSL_SHUTDOWN_FAILED, ErrorCode::SSL_SHUTDOWN_FAILED}, + case CURLE_SSL_SHUTDOWN_FAILED: + return ErrorCode::SSL_SHUTDOWN_FAILED; #endif // Added in curl 7.18.2. #if LIBCURL_VERSION_NUM >= 0x071202 - {CURLE_AGAIN, ErrorCode::AGAIN}, + case CURLE_AGAIN: + return ErrorCode::AGAIN; #endif // Added in curl 7.19.0. #if LIBCURL_VERSION_NUM >= 0x071300 - {CURLE_SSL_CRL_BADFILE, ErrorCode::SSL_CRL_BADFILE}, - {CURLE_SSL_ISSUER_ERROR, ErrorCode::SSL_ISSUER_ERROR}, + case CURLE_SSL_CRL_BADFILE: + return ErrorCode::SSL_CRL_BADFILE; + case CURLE_SSL_ISSUER_ERROR: + return ErrorCode::SSL_ISSUER_ERROR; #endif // Added in curl 7.21.0. #if LIBCURL_VERSION_NUM >= 0x071500 - {CURLE_CHUNK_FAILED, ErrorCode::CHUNK_FAILED}, + case CURLE_CHUNK_FAILED: + return ErrorCode::CHUNK_FAILED; #endif // Added in curl 7.30.0. #if LIBCURL_VERSION_NUM >= 0x071E00 - {CURLE_NO_CONNECTION_AVAILABLE, ErrorCode::NO_CONNECTION_AVAILABLE}, + case CURLE_NO_CONNECTION_AVAILABLE: + return ErrorCode::NO_CONNECTION_AVAILABLE; #endif // Added in curl 7.39.0. #if LIBCURL_VERSION_NUM >= 0x072700 - {CURLE_SSL_PINNEDPUBKEYNOTMATCH, ErrorCode::SSL_PINNEDPUBKEYNOTMATCH}, + case CURLE_SSL_PINNEDPUBKEYNOTMATCH: + return ErrorCode::SSL_PINNEDPUBKEYNOTMATCH; #endif // Added in curl 7.41.0. #if LIBCURL_VERSION_NUM >= 0x072900 - {CURLE_SSL_INVALIDCERTSTATUS, ErrorCode::SSL_INVALIDCERTSTATUS}, + case CURLE_SSL_INVALIDCERTSTATUS: + return ErrorCode::SSL_INVALIDCERTSTATUS; #endif // Added in curl 7.49.0. #if LIBCURL_VERSION_NUM >= 0x073100 - {CURLE_HTTP2_STREAM, ErrorCode::HTTP2_STREAM}, + case CURLE_HTTP2_STREAM: + return ErrorCode::HTTP2_STREAM; #endif - - {CURLE_PARTIAL_FILE, ErrorCode::PARTIAL_FILE}, + case CURLE_PARTIAL_FILE: + return ErrorCode::PARTIAL_FILE; // Added in curl 7.59.0. #if LIBCURL_VERSION_NUM >= 0x073B00 - {CURLE_RECURSIVE_API_CALL, ErrorCode::RECURSIVE_API_CALL}, + case CURLE_RECURSIVE_API_CALL: + return ErrorCode::RECURSIVE_API_CALL; #endif // Added in curl 7.66.0. #if LIBCURL_VERSION_NUM >= 0x074200 - {CURLE_AUTH_ERROR, ErrorCode::AUTH_ERROR}, + case CURLE_AUTH_ERROR: + return ErrorCode::AUTH_ERROR; #endif // Added in curl 7.68.0. #if LIBCURL_VERSION_NUM >= 0x074400 - {CURLE_HTTP3, ErrorCode::HTTP3}, + case CURLE_HTTP3: + return ErrorCode::HTTP3; #endif // Added in curl 7.69.0. #if LIBCURL_VERSION_NUM >= 0x074500 - {CURLE_QUIC_CONNECT_ERROR, ErrorCode::QUIC_CONNECT_ERROR}, + case CURLE_QUIC_CONNECT_ERROR: + return ErrorCode::QUIC_CONNECT_ERROR; #endif // Added in curl 7.73.0. #if LIBCURL_VERSION_NUM >= 0x074900 - {CURLE_PROXY, ErrorCode::PROXY}, + case CURLE_PROXY: + return ErrorCode::PROXY; #endif // Added in curl 7.77.0. #if LIBCURL_VERSION_NUM >= 0x074D00 - {CURLE_SSL_CLIENTCERT, ErrorCode::SSL_CLIENTCERT}, + case CURLE_SSL_CLIENTCERT: + return ErrorCode::SSL_CLIENTCERT; #endif // Added in curl 7.84.0. #if LIBCURL_VERSION_NUM >= 0x075400 - {CURLE_UNRECOVERABLE_POLL, ErrorCode::UNRECOVERABLE_POLL}, + case CURLE_UNRECOVERABLE_POLL: + return ErrorCode::UNRECOVERABLE_POLL; #endif // Added in curl 7.6.0. #if LIBCURL_VERSION_NUM >= 0x080600 - {CURLE_TOO_LARGE, ErrorCode::TOO_LARGE}, + case CURLE_TOO_LARGE: + return ErrorCode::TOO_LARGE; #endif -}; - -ErrorCode Error::getErrorCodeForCurlError(std::int32_t curl_code) { - auto it = curl_error_map.find(curl_code); - if (it == curl_error_map.end()) { - // Default return value when the CURL error code is not recognized - return ErrorCode::UNKNOWN_ERROR; - } - return it->second; + default: + return ErrorCode::UNKNOWN_ERROR; + } } + } // namespace cpr \ No newline at end of file