ucb/source/ucp/webdav-curl/DAVException.hxx  |    4 ++++
 ucb/source/ucp/webdav-curl/webdavcontent.cxx |   25 +++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

New commits:
commit 2346a19dfeba7f0f2082888ab76c1c731e9e591c
Author:     Giuseppe Castagno <giuseppe.casta...@acca-esse.eu>
AuthorDate: Thu Oct 13 09:34:19 2016 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Mon Nov 1 18:52:18 2021 +0100

    ucb: webdav-curl: tdf#102499 (7): Caching connect timeout or cannot connect.
    
    An unofficial HTTP response status code is defined and used
    internally in LibreOffice WebDAV ucp provider in order to
    catch either the DAVException::DAV_HTTP_TIMEOUT state or the
    DAVException::DAV_HTTP_CONNECT state.
    
    [ port of commit 97cc70d7285526ae2ee3b3bac425eb031c4c0321 ]
    
    Change-Id: Idd5d412dd10131199f34a047055d098a0f74cf7e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123499
    Tested-by: Michael Stahl <michael.st...@allotropia.de>
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>

diff --git a/ucb/source/ucp/webdav-curl/DAVException.hxx 
b/ucb/source/ucp/webdav-curl/DAVException.hxx
index 4da64420cc00..c2f9f53acdd9 100644
--- a/ucb/source/ucp/webdav-curl/DAVException.hxx
+++ b/ucb/source/ucp/webdav-curl/DAVException.hxx
@@ -91,6 +91,10 @@ const sal_uInt16 SC_HTTP_VERSION_NOT_SUPPORTED       = 505;
 // DAV extensions (<https://tools.ietf.org/html/rfc4918#section-11>)
 const sal_uInt16 SC_INSUFFICIENT_STORAGE             = 507;
 
+// unofficial status codes only used internally by LO
+// used to cache the connection time out event
+const sal_uInt16 USC_CONNECTION_TIMED_OUT            = 908;
+
 
 class DAVException : public std::exception
 {
diff --git a/ucb/source/ucp/webdav-curl/webdavcontent.cxx 
b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
index 7866ce132632..01bc742f0e25 100644
--- a/ucb/source/ucp/webdav-curl/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
@@ -3813,6 +3813,25 @@ Content::ResourceType Content::getResourceType(
         {
             rResAccess->resetUri();
 
+            // first check if the cached error can be mapped to 
DAVException::DAV_HTTP_TIMEOUT or mapped to DAVException::DAV_HTTP_CONNECT
+            if ( aDAVOptions.getHttpResponseStatusCode() == 
USC_CONNECTION_TIMED_OUT )
+            {
+                // behave same as DAVException::DAV_HTTP_TIMEOUT or 
DAVException::DAV_HTTP_CONNECT was thrown
+                try
+                {
+                    // extract host name and connection port
+                    CurlUri   theUri( rResAccess->getURL() );
+                    OUString  aHostName  = theUri.GetHost();
+                    sal_Int32 nPort      = theUri.GetPort();
+                    throw DAVException( DAVException::DAV_HTTP_TIMEOUT,
+                                        ConnectionEndPointString(aHostName, 
nPort) );
+                }
+                catch ( DAVException& exp )
+                {
+                    cancelCommandExecution( exp, xEnv );
+                }
+            }
+
             if ( aDAVOptions.getHttpResponseStatusCode() != SC_NOT_FOUND &&
                  aDAVOptions.getHttpResponseStatusCode() != SC_GONE ) // the 
cached OPTIONS can have SC_GONE
             {
@@ -3941,6 +3960,12 @@ void Content::getResourceOptions(
                     // probably a new bit stating 'timed out' should be added 
to opts var?
                     // in any case abort the command
                     SAL_WARN( "ucb.ucp.webdav", "OPTIONS - DAVException: 
DAV_HTTP_TIMEOUT or DAV_HTTP_CONNECT for URL <" << 
m_xIdentifier->getContentIdentifier() << ">" );
+                    // cache the internal unofficial status code
+
+                    aDAVOptions.setHttpResponseStatusCode( 
USC_CONNECTION_TIMED_OUT );
+                    // used only internally, so the text doesn't really 
matter..
+                    aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
+                                                          
m_nOptsCacheLifeNotFound );
                     cancelCommandExecution( e, xEnv );
                     // unreachable
                 }

Reply via email to