diff --git a/include/cpr/error.h b/include/cpr/error.h index 6f598f161..738d91040 100644 --- a/include/cpr/error.h +++ b/include/cpr/error.h @@ -90,70 +90,74 @@ enum class ErrorCode { UNKNOWN_ERROR = 1000, }; -inline const std::unordered_map error_code_to_string_mapping = {{ErrorCode::OK, "OK"}, - {ErrorCode::UNSUPPORTED_PROTOCOL, "UNSUPPORTED_PROTOCOL"}, - {ErrorCode::FAILED_INIT, "FAILED_INIT"}, - {ErrorCode::URL_MALFORMAT, "URL_MALFORMAT"}, - {ErrorCode::NOT_BUILT_IN, "NOT_BUILT_IN"}, - {ErrorCode::COULDNT_RESOLVE_PROXY, "COULDNT_RESOLVE_PROXY"}, - {ErrorCode::COULDNT_RESOLVE_HOST, "COULDNT_RESOLVE_HOST"}, - {ErrorCode::COULDNT_CONNECT, "COULDNT_CONNECT"}, - {ErrorCode::WEIRD_SERVER_REPLY, "WEIRD_SERVER_REPLY"}, - {ErrorCode::REMOTE_ACCESS_DENIED, "REMOTE_ACCESS_DENIED"}, - {ErrorCode::HTTP2, "HTTP2"}, - {ErrorCode::PARTIAL_FILE, "PARTIAL_FILE"}, - {ErrorCode::QUOTE_ERROR, "QUOTE_ERROR"}, - {ErrorCode::HTTP_RETURNED_ERROR, "HTTP_RETURNED_ERROR"}, - {ErrorCode::WRITE_ERROR, "WRITE_ERROR"}, - {ErrorCode::UPLOAD_FAILED, "UPLOAD_FAILED"}, - {ErrorCode::READ_ERROR, "READ_ERROR"}, - {ErrorCode::OUT_OF_MEMORY, "OUT_OF_MEMORY"}, - {ErrorCode::OPERATION_TIMEDOUT, "OPERATION_TIMEDOUT"}, - {ErrorCode::RANGE_ERROR, "RANGE_ERROR"}, - {ErrorCode::HTTP_POST_ERROR, "HTTP_POST_ERROR"}, - {ErrorCode::SSL_CONNECT_ERROR, "SSL_CONNECT_ERROR"}, - {ErrorCode::BAD_DOWNLOAD_RESUME, "BAD_DOWNLOAD_RESUME"}, - {ErrorCode::FILE_COULDNT_READ_FILE, "FILE_COULDNT_READ_FILE"}, - {ErrorCode::FUNCTION_NOT_FOUND, "FUNCTION_NOT_FOUND"}, - {ErrorCode::ABORTED_BY_CALLBACK, "ABORTED_BY_CALLBACK"}, - {ErrorCode::BAD_FUNCTION_ARGUMENT, "BAD_FUNCTION_ARGUMENT"}, - {ErrorCode::INTERFACE_FAILED, "INTERFACE_FAILED"}, - {ErrorCode::TOO_MANY_REDIRECTS, "TOO_MANY_REDIRECTS"}, - {ErrorCode::UNKNOWN_OPTION, "UNKNOWN_OPTION"}, - {ErrorCode::SETOPT_OPTION_SYNTAX, "SETOPT_OPTION_SYNTAX"}, - {ErrorCode::GOT_NOTHING, "GOT_NOTHING"}, - {ErrorCode::SSL_ENGINE_NOTFOUND, "SSL_ENGINE_NOTFOUND"}, - {ErrorCode::SSL_ENGINE_SETFAILED, "SSL_ENGINE_SETFAILED"}, - {ErrorCode::SEND_ERROR, "SEND_ERROR"}, - {ErrorCode::RECV_ERROR, "RECV_ERROR"}, - {ErrorCode::SSL_CERTPROBLEM, "SSL_CERTPROBLEM"}, - {ErrorCode::SSL_CIPHER, "SSL_CIPHER"}, - {ErrorCode::PEER_FAILED_VERIFICATION, "PEER_FAILED_VERIFICATION"}, - {ErrorCode::BAD_CONTENT_ENCODING, "BAD_CONTENT_ENCODING"}, - {ErrorCode::FILESIZE_EXCEEDED, "FILESIZE_EXCEEDED"}, - {ErrorCode::USE_SSL_FAILED, "USE_SSL_FAILED"}, - {ErrorCode::SEND_FAIL_REWIND, "SEND_FAIL_REWIND"}, - {ErrorCode::SSL_ENGINE_INITFAILED, "SSL_ENGINE_INITFAILED"}, - {ErrorCode::LOGIN_DENIED, "LOGIN_DENIED"}, - {ErrorCode::SSL_CACERT_BADFILE, "SSL_CACERT_BADFILE"}, - {ErrorCode::SSL_SHUTDOWN_FAILED, "SSL_SHUTDOWN_FAILED"}, - {ErrorCode::AGAIN, "AGAIN"}, - {ErrorCode::SSL_CRL_BADFILE, "SSL_CRL_BADFILE"}, - {ErrorCode::SSL_ISSUER_ERROR, "SSL_ISSUER_ERROR"}, - {ErrorCode::CHUNK_FAILED, "CHUNK_FAILED"}, - {ErrorCode::NO_CONNECTION_AVAILABLE, "NO_CONNECTION_AVAILABLE"}, - {ErrorCode::SSL_PINNEDPUBKEYNOTMATCH, "SSL_PINNEDPUBKEYNOTMATCH"}, - {ErrorCode::SSL_INVALIDCERTSTATUS, "SSL_INVALIDCERTSTATUS"}, - {ErrorCode::HTTP2_STREAM, "HTTP2_STREAM"}, - {ErrorCode::RECURSIVE_API_CALL, "RECURSIVE_API_CALL"}, - {ErrorCode::AUTH_ERROR, "AUTH_ERROR"}, - {ErrorCode::HTTP3, "HTTP3"}, - {ErrorCode::QUIC_CONNECT_ERROR, "QUIC_CONNECT_ERROR"}, - {ErrorCode::PROXY, "PROXY"}, - {ErrorCode::SSL_CLIENTCERT, "SSL_CLIENTCERT"}, - {ErrorCode::UNRECOVERABLE_POLL, "UNRECOVERABLE_POLL"}, - {ErrorCode::TOO_LARGE, "TOO_LARGE"}, - {ErrorCode::UNKNOWN_ERROR, "UNKNOWN_ERROR"}}; +inline const std::unordered_map& get_error_code_to_string_mapping() { + // Use a function-local static rather than inline global objects to avoid the 'double-destructor' problem in MSVC when using /MT flags. + static const std::unordered_map mapping = {{ErrorCode::OK, "OK"}, + {ErrorCode::UNSUPPORTED_PROTOCOL, "UNSUPPORTED_PROTOCOL"}, + {ErrorCode::FAILED_INIT, "FAILED_INIT"}, + {ErrorCode::URL_MALFORMAT, "URL_MALFORMAT"}, + {ErrorCode::NOT_BUILT_IN, "NOT_BUILT_IN"}, + {ErrorCode::COULDNT_RESOLVE_PROXY, "COULDNT_RESOLVE_PROXY"}, + {ErrorCode::COULDNT_RESOLVE_HOST, "COULDNT_RESOLVE_HOST"}, + {ErrorCode::COULDNT_CONNECT, "COULDNT_CONNECT"}, + {ErrorCode::WEIRD_SERVER_REPLY, "WEIRD_SERVER_REPLY"}, + {ErrorCode::REMOTE_ACCESS_DENIED, "REMOTE_ACCESS_DENIED"}, + {ErrorCode::HTTP2, "HTTP2"}, + {ErrorCode::PARTIAL_FILE, "PARTIAL_FILE"}, + {ErrorCode::QUOTE_ERROR, "QUOTE_ERROR"}, + {ErrorCode::HTTP_RETURNED_ERROR, "HTTP_RETURNED_ERROR"}, + {ErrorCode::WRITE_ERROR, "WRITE_ERROR"}, + {ErrorCode::UPLOAD_FAILED, "UPLOAD_FAILED"}, + {ErrorCode::READ_ERROR, "READ_ERROR"}, + {ErrorCode::OUT_OF_MEMORY, "OUT_OF_MEMORY"}, + {ErrorCode::OPERATION_TIMEDOUT, "OPERATION_TIMEDOUT"}, + {ErrorCode::RANGE_ERROR, "RANGE_ERROR"}, + {ErrorCode::HTTP_POST_ERROR, "HTTP_POST_ERROR"}, + {ErrorCode::SSL_CONNECT_ERROR, "SSL_CONNECT_ERROR"}, + {ErrorCode::BAD_DOWNLOAD_RESUME, "BAD_DOWNLOAD_RESUME"}, + {ErrorCode::FILE_COULDNT_READ_FILE, "FILE_COULDNT_READ_FILE"}, + {ErrorCode::FUNCTION_NOT_FOUND, "FUNCTION_NOT_FOUND"}, + {ErrorCode::ABORTED_BY_CALLBACK, "ABORTED_BY_CALLBACK"}, + {ErrorCode::BAD_FUNCTION_ARGUMENT, "BAD_FUNCTION_ARGUMENT"}, + {ErrorCode::INTERFACE_FAILED, "INTERFACE_FAILED"}, + {ErrorCode::TOO_MANY_REDIRECTS, "TOO_MANY_REDIRECTS"}, + {ErrorCode::UNKNOWN_OPTION, "UNKNOWN_OPTION"}, + {ErrorCode::SETOPT_OPTION_SYNTAX, "SETOPT_OPTION_SYNTAX"}, + {ErrorCode::GOT_NOTHING, "GOT_NOTHING"}, + {ErrorCode::SSL_ENGINE_NOTFOUND, "SSL_ENGINE_NOTFOUND"}, + {ErrorCode::SSL_ENGINE_SETFAILED, "SSL_ENGINE_SETFAILED"}, + {ErrorCode::SEND_ERROR, "SEND_ERROR"}, + {ErrorCode::RECV_ERROR, "RECV_ERROR"}, + {ErrorCode::SSL_CERTPROBLEM, "SSL_CERTPROBLEM"}, + {ErrorCode::SSL_CIPHER, "SSL_CIPHER"}, + {ErrorCode::PEER_FAILED_VERIFICATION, "PEER_FAILED_VERIFICATION"}, + {ErrorCode::BAD_CONTENT_ENCODING, "BAD_CONTENT_ENCODING"}, + {ErrorCode::FILESIZE_EXCEEDED, "FILESIZE_EXCEEDED"}, + {ErrorCode::USE_SSL_FAILED, "USE_SSL_FAILED"}, + {ErrorCode::SEND_FAIL_REWIND, "SEND_FAIL_REWIND"}, + {ErrorCode::SSL_ENGINE_INITFAILED, "SSL_ENGINE_INITFAILED"}, + {ErrorCode::LOGIN_DENIED, "LOGIN_DENIED"}, + {ErrorCode::SSL_CACERT_BADFILE, "SSL_CACERT_BADFILE"}, + {ErrorCode::SSL_SHUTDOWN_FAILED, "SSL_SHUTDOWN_FAILED"}, + {ErrorCode::AGAIN, "AGAIN"}, + {ErrorCode::SSL_CRL_BADFILE, "SSL_CRL_BADFILE"}, + {ErrorCode::SSL_ISSUER_ERROR, "SSL_ISSUER_ERROR"}, + {ErrorCode::CHUNK_FAILED, "CHUNK_FAILED"}, + {ErrorCode::NO_CONNECTION_AVAILABLE, "NO_CONNECTION_AVAILABLE"}, + {ErrorCode::SSL_PINNEDPUBKEYNOTMATCH, "SSL_PINNEDPUBKEYNOTMATCH"}, + {ErrorCode::SSL_INVALIDCERTSTATUS, "SSL_INVALIDCERTSTATUS"}, + {ErrorCode::HTTP2_STREAM, "HTTP2_STREAM"}, + {ErrorCode::RECURSIVE_API_CALL, "RECURSIVE_API_CALL"}, + {ErrorCode::AUTH_ERROR, "AUTH_ERROR"}, + {ErrorCode::HTTP3, "HTTP3"}, + {ErrorCode::QUIC_CONNECT_ERROR, "QUIC_CONNECT_ERROR"}, + {ErrorCode::PROXY, "PROXY"}, + {ErrorCode::SSL_CLIENTCERT, "SSL_CLIENTCERT"}, + {ErrorCode::UNRECOVERABLE_POLL, "UNRECOVERABLE_POLL"}, + {ErrorCode::TOO_LARGE, "TOO_LARGE"}, + {ErrorCode::UNKNOWN_ERROR, "UNKNOWN_ERROR"}}; + return mapping; +} class Error { public: @@ -176,7 +180,7 @@ class Error { namespace std { inline std::string to_string(const cpr::ErrorCode& code) { - return cpr::error_code_to_string_mapping.at(code); + return cpr::get_error_code_to_string_mapping().at(code); } } // namespace std