--- libcmis/src/libcmis/http-session.cxx.orig 2024-06-21 12:22:36.083125022 +0200 +++ libcmis/src/libcmis/http-session.cxx 2024-06-21 13:08:37.403016695 +0200 @@ -653,7 +653,7 @@ m_authProvided = authProvider->authenticationQuery( m_username, m_password ); if ( !m_authProvided ) { - throw CurlException( "User cancelled authentication request" ); + throw CurlException("User cancelled authentication request", CURLE_OK); } } } @@ -762,6 +762,7 @@ if ( CURLE_SSL_CACERT == errCode ) { vector< string > certificates; + string err(errBuff); // We somehow need to rerun the request to get the certificate curl_easy_setopt(m_curlHandle, CURLOPT_SSL_VERIFYHOST, 0); @@ -814,7 +815,7 @@ } else { - throw CurlException( "Invalid SSL certificate" ); + throw CurlException(err, CURLE_SSL_CACERT); } } } @@ -827,7 +828,6 @@ void HttpSession::checkOAuth2( string url ) -try { if ( m_oauth2Handler ) { @@ -836,10 +836,6 @@ oauth2Authenticate( ); } } -catch ( const libcmis::Exception& e ) -{ - throw CurlException( e.what( ) ); -} long HttpSession::getHttpStatus( ) { @@ -906,15 +902,10 @@ } void HttpSession::oauth2Refresh( ) -try { const ScopeGuard inOauth2Guard(m_inOAuth2Authentication, true); m_oauth2Handler->refresh( ); } -catch ( const libcmis::Exception& e ) -{ - throw CurlException( e.what() ); -} void HttpSession::initProtocols( ) { @@ -981,11 +972,45 @@ break; default: msg = what(); - if ( !isCancelled( ) ) - msg += ": " + m_url; - else - type = "permissionDenied"; - break; + switch (m_code) + { + case CURLE_COULDNT_RESOLVE_PROXY: + case CURLE_COULDNT_RESOLVE_HOST: + type = "dnsFailed"; + break; + case CURLE_COULDNT_CONNECT: + case CURLE_SSL_CONNECT_ERROR: + case CURLE_SSL_CERTPROBLEM: + case CURLE_SSL_CIPHER: + case CURLE_PEER_FAILED_VERIFICATION: +#if CURL_AT_LEAST_VERSION(7, 19, 0) + case CURLE_SSL_ISSUER_ERROR: +#endif + case CURLE_SSL_PINNEDPUBKEYNOTMATCH: + case CURLE_SSL_INVALIDCERTSTATUS: + case CURLE_FAILED_INIT: +#if CURL_AT_LEAST_VERSION(7, 69, 0) + case CURLE_QUIC_CONNECT_ERROR: +#endif + type = "connectFailed"; + break; + case CURLE_OPERATION_TIMEDOUT: + type = "connectTimeout"; + break; + case CURLE_WRITE_ERROR: + case CURLE_READ_ERROR: // error returned from our callbacks + case CURLE_ABORTED_BY_CALLBACK: + case CURLE_SEND_ERROR: + case CURLE_RECV_ERROR: + type = "transferFailed"; + break; + default: + if ( !isCancelled( ) ) + msg += ": " + m_url; + else if (msg == "User cancelled authentication request") + type = "permissionDenied"; + break; + } } return libcmis::Exception( msg, type ); --- libcmis/src/libcmis/http-session.hxx.orig 2024-06-21 12:36:22.785868998 +0200 +++ libcmis/src/libcmis/http-session.hxx 2024-06-21 12:36:44.272966309 +0200 @@ -71,10 +71,10 @@ { } - CurlException( std::string message ) : + CurlException(std::string message, CURLcode const code) : exception( ), m_message( message ), - m_code( CURLE_OK ), + m_code(code), m_url( ), m_httpStatus( 0 ), m_cancelled( true ), --- libcmis/src/libcmis/sharepoint-session.cxx.orig 2024-06-21 12:23:07.164265783 +0200 +++ libcmis/src/libcmis/sharepoint-session.cxx 2024-06-21 12:37:45.528243723 +0200 @@ -289,6 +291,7 @@ if ( CURLE_SSL_CACERT == errCode ) { vector< string > certificates; + string err(errBuff); // We somehow need to rerun the request to get the certificate curl_easy_setopt(m_curlHandle, CURLOPT_SSL_VERIFYHOST, 0); @@ -344,7 +344,7 @@ } else { - throw CurlException( "Invalid SSL certificate" ); + throw CurlException(err, CURLE_SSL_CACERT); } } } --- libcmis/src/libcmis/session-factory.cxx.orig 2024-06-21 15:37:55.132824666 +0200 +++ libcmis/src/libcmis/session-factory.cxx 2024-06-21 15:36:17.558408868 +0200 @@ -96,7 +96,7 @@ } catch (const CurlException& e) { - if (strcmp(e.what(), "Invalid SSL certificate") == 0) + if (e.getErrorCode() == CURLE_SSL_CACERT) { // no point in trying other protocols throw e.getCmisException(); --- libcmis/qa/libcmis/test-atom.cxx.orig 2024-06-21 15:39:49.130310447 +0200 +++ libcmis/qa/libcmis/test-atom.cxx 2024-06-21 15:39:51.541320721 +0200 @@ -323,8 +323,8 @@ } catch ( const libcmis::Exception& e ) { - CPPUNIT_ASSERT_EQUAL_MESSAGE( "Wrong exception message", - string( "Invalid SSL certificate" ), string( e.what() ) ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( "Wrong exception type", + string("connectFailed"), string(e.getType()) ); } } }