[Libreoffice-commits] core.git: ucb/qa ucb/source

Giuseppe Castagno giuseppe.castagno at acca-esse.eu
Wed Oct 12 19:24:05 UTC 2016


 ucb/qa/cppunit/webdav/webdav_options.cxx     |   33 +++++++++++++++++++
 ucb/source/ucp/webdav-neon/DAVTypes.cxx      |   46 +++++++--------------------
 ucb/source/ucp/webdav-neon/DAVTypes.hxx      |    7 ++--
 ucb/source/ucp/webdav-neon/webdavcontent.cxx |    6 +--
 4 files changed, 54 insertions(+), 38 deletions(-)

New commits:
commit 1ca68d386bc0345240bf288bec023faaba2e07af
Author: Giuseppe Castagno <giuseppe.castagno at acca-esse.eu>
Date:   Tue Oct 11 15:21:23 2016 +0200

    tdf#102499 (6): Cache OPTIONS if not present or if lifetime different
    
    Add the OPTIONS information and response status code into the cache:
    - if the OPTIONS information is already cached, update the cache only
      if the lifetime is different;
    - if the OPTIONS information is not cached, cache it.
    
    Add some new functions in DAVOptions to support the change and remove
    a function no longer used.
    
    Change-Id: I2f28f0ee793ec7d898caa61cc0a4962334e6e068
    Reviewed-on: https://gerrit.libreoffice.org/29733
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Giuseppe Castagno <giuseppe.castagno at acca-esse.eu>

diff --git a/ucb/qa/cppunit/webdav/webdav_options.cxx b/ucb/qa/cppunit/webdav/webdav_options.cxx
index 0dad7f8..ce3aba7 100644
--- a/ucb/qa/cppunit/webdav/webdav_options.cxx
+++ b/ucb/qa/cppunit/webdav/webdav_options.cxx
@@ -65,6 +65,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( true, aDavType.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavType.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavType.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavType.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavType.getHttpResponseStatusCode() );
         CPPUNIT_ASSERT_EQUAL( true, aDavType.getHttpResponseStatusText().isEmpty() );
     }
@@ -83,6 +84,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -97,6 +99,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -111,6 +114,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -125,6 +129,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -142,6 +147,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( aAllowedMethods, aDavOpt.getAllowedMethods() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -158,6 +164,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( aAllowedMethods, aDavOpt.getAllowedMethods() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -173,6 +180,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 12345678 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -180,6 +188,22 @@ namespace
 
         aDavOpt.setStaleTime( 0 );
 
+        aDavOpt.setRequestedTimeLife( 300 );
+        CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isClass1() );
+        CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isClass2() );
+        CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isClass3() );
+        CPPUNIT_ASSERT_EQUAL( true, aDavOpt.isHeadAllowed() );
+        CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
+        CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 300 ), aDavOpt.getRequestedTimeLife() );
+        CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
+        CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
+        CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getHttpResponseStatusText().isEmpty() );
+
+        aDavOpt.setRequestedTimeLife( 0 );
+
         OUString aHTTPResponseStatusText = "522 Origin Connection Time-out";
         aDavOpt.setHttpResponseStatusCode( 522 );
         aDavOpt.setHttpResponseStatusText( aHTTPResponseStatusText );
@@ -191,6 +215,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( true , aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 522 ), aDavOpt.getHttpResponseStatusCode() );
         CPPUNIT_ASSERT_EQUAL( aHTTPResponseStatusText, aDavOpt.getHttpResponseStatusText() );
 
@@ -207,6 +232,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( aURL, aDavOpt.getURL() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getRedirectedURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -223,6 +249,7 @@ namespace
         CPPUNIT_ASSERT_EQUAL( false, aDavOpt.isLockAllowed() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getAllowedMethods().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getStaleTime() );
+        CPPUNIT_ASSERT_EQUAL( sal_uInt32( 0 ), aDavOpt.getRequestedTimeLife() );
         CPPUNIT_ASSERT_EQUAL( true, aDavOpt.getURL().isEmpty() );
         CPPUNIT_ASSERT_EQUAL( aURL, aDavOpt.getRedirectedURL() );
         CPPUNIT_ASSERT_EQUAL( sal_uInt16( 0 ), aDavOpt.getHttpResponseStatusCode() );
@@ -239,6 +266,7 @@ namespace
         aDavOpt.setLocked();
         aDavOpt.setAllowedMethods( aAllowedMethods );
         aDavOpt.setStaleTime( 1234567 );
+        aDavOpt.setRequestedTimeLife( 300 );
         aDavOpt.setURL( aURL );
         aDavOpt.setRedirectedURL( aURL );
         aDavOpt.setHttpResponseStatusCode( 404 );
@@ -280,6 +308,11 @@ namespace
         aDavOpt.setStaleTime( 0 );
         CPPUNIT_ASSERT_EQUAL( true , aDavOpt == aDavOptTarget );
 
+        aDavOpt.setRequestedTimeLife( 1234567 );
+        CPPUNIT_ASSERT_EQUAL( false , aDavOpt == aDavOptTarget );
+        aDavOpt.setRequestedTimeLife( 0 );
+        CPPUNIT_ASSERT_EQUAL( true , aDavOpt == aDavOptTarget );
+
         aDavOpt.setHttpResponseStatusCode( 404 );
         CPPUNIT_ASSERT_EQUAL( false , aDavOpt == aDavOptTarget );
         aDavOpt.setHttpResponseStatusCode( 0 );
diff --git a/ucb/source/ucp/webdav-neon/DAVTypes.cxx b/ucb/source/ucp/webdav-neon/DAVTypes.cxx
index 1990289..5c1844d 100644
--- a/ucb/source/ucp/webdav-neon/DAVTypes.cxx
+++ b/ucb/source/ucp/webdav-neon/DAVTypes.cxx
@@ -27,6 +27,7 @@ DAVOptions::DAVOptions() :
     m_isLocked( false ),
     m_aAllowedMethods(),
     m_nStaleTime( 0 ),
+    m_nRequestedTimeLife( 0 ),
     m_sURL(),
     m_sRedirectedURL(),
     m_nHttpResponseStatusCode( 0 ),
@@ -42,6 +43,7 @@ DAVOptions::DAVOptions( const DAVOptions & rOther ) :
     m_isLocked( rOther.m_isLocked ),
     m_aAllowedMethods( rOther.m_aAllowedMethods ),
     m_nStaleTime( rOther.m_nStaleTime ),
+    m_nRequestedTimeLife( rOther.m_nRequestedTimeLife ),
     m_sURL( rOther.m_sURL ),
     m_sRedirectedURL( rOther.m_sRedirectedURL),
     m_nHttpResponseStatusCode( rOther.m_nHttpResponseStatusCode ),
@@ -62,6 +64,7 @@ DAVOptions & DAVOptions::operator=( const DAVOptions& rOpts )
     m_isHeadAllowed = rOpts.m_isHeadAllowed;
     m_aAllowedMethods = rOpts.m_aAllowedMethods;
     m_nStaleTime = rOpts.m_nStaleTime;
+    m_nRequestedTimeLife = rOpts.m_nRequestedTimeLife;
     m_sURL = rOpts.m_sURL;
     m_sRedirectedURL = rOpts.m_sRedirectedURL;
     m_nHttpResponseStatusCode = rOpts.m_nHttpResponseStatusCode;
@@ -79,6 +82,7 @@ bool DAVOptions::operator==( const DAVOptions& rOpts ) const
         m_isHeadAllowed == rOpts.m_isHeadAllowed &&
         m_aAllowedMethods == rOpts.m_aAllowedMethods &&
         m_nStaleTime == rOpts.m_nStaleTime &&
+        m_nRequestedTimeLife == rOpts.m_nRequestedTimeLife &&
         m_sURL == rOpts.m_sURL &&
         m_sRedirectedURL == rOpts.m_sRedirectedURL &&
         m_nHttpResponseStatusCode == rOpts.m_nHttpResponseStatusCode &&
@@ -151,44 +155,20 @@ void DAVOptionsCache::addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32
     OUString aRedirURL( rDAVOptions.getRedirectedURL() );
     rDAVOptions.setRedirectedURL( aRedirURL );
 
-    TimeValue t1;
-    osl_getSystemTime( &t1 );
-    rDAVOptions.setStaleTime( t1.Seconds + nLifeTime );
-
-    m_aTheCache[ aEncodedUrl ] = rDAVOptions;
-}
-
-void DAVOptionsCache::updateCachedOption( DAVOptions & rDAVOptions, const sal_uInt32 nLifeTime )
-{
-    osl::MutexGuard aGuard( m_aMutex );
-    OUString aURL( rDAVOptions.getURL() );
-
-    OUString aEncodedUrl( ucb_impl::urihelper::encodeURI( NeonUri::unescape( aURL ) ) );
-    normalizeURLLastChar( aEncodedUrl );
-    rDAVOptions.setURL( aEncodedUrl );
-
-// unchanged, it may be used to access a server
-    OUString aRedirURL( rDAVOptions.getRedirectedURL() );
-    rDAVOptions.setRedirectedURL( aRedirURL );
-
     // check if already cached
     DAVOptionsMap::iterator it;
     it = m_aTheCache.find( aEncodedUrl );
     if ( it != m_aTheCache.end() )
-    {
-        DAVOptions &opts = (*it).second;
-        // exists, set new staletime, only if remaining time is higher
-        TimeValue t1;
-        osl_getSystemTime( &t1 );
-
-        if ( ( opts.getStaleTime() - t1.Seconds ) > nLifeTime )
-        {
-            opts.setStaleTime( t1.Seconds + nLifeTime );
-        }
-        // update relevant fields
-        opts.setHttpResponseStatusCode( rDAVOptions.getHttpResponseStatusCode() );
-        opts.setHttpResponseStatusText( rDAVOptions.getHttpResponseStatusText() );
+    { // already in cache, check LifeTime
+        if ( (*it).second.getRequestedTimeLife() == nLifeTime )
+            return; // same lifetime, do nothing
     }
+    // not in cache, add it
+    TimeValue t1;
+    osl_getSystemTime( &t1 );
+    rDAVOptions.setStaleTime( t1.Seconds + nLifeTime );
+
+    m_aTheCache[ aEncodedUrl ] = rDAVOptions;
 }
 
 sal_uInt16 DAVOptionsCache::getHttpResponseStatusCode( const OUString & rURL, OUString & rHttpResponseStatusText )
diff --git a/ucb/source/ucp/webdav-neon/DAVTypes.hxx b/ucb/source/ucp/webdav-neon/DAVTypes.hxx
index 723ccb4..c7c3715 100644
--- a/ucb/source/ucp/webdav-neon/DAVTypes.hxx
+++ b/ucb/source/ucp/webdav-neon/DAVTypes.hxx
@@ -89,6 +89,7 @@ namespace webdav_ucp
 
         /// target time when this capability becomes stale
         sal_uInt32 m_nStaleTime;
+        sal_uInt32 m_nRequestedTimeLife;
         OUString  m_sURL;
         OUString  m_sRedirectedURL;
 
@@ -119,6 +120,9 @@ namespace webdav_ucp
         sal_uInt32 getStaleTime() { return m_nStaleTime ; };
         void setStaleTime( const sal_uInt32 nStaleTime ) { m_nStaleTime = nStaleTime; };
 
+        sal_uInt32 getRequestedTimeLife() { return m_nRequestedTimeLife; };
+        void setRequestedTimeLife( const sal_uInt32 nRequestedTimeLife ) { m_nRequestedTimeLife = nRequestedTimeLife; };
+
         const OUString & getURL() { return m_sURL; };
         void setURL( const OUString & sURL ) { m_sURL = sURL; };
 
@@ -146,6 +150,7 @@ namespace webdav_ucp
             m_isLocked = false;
             m_aAllowedMethods.clear();
             m_nStaleTime = 0;
+            m_nRequestedTimeLife = 0;
             m_sURL.clear();
             m_sRedirectedURL.clear();
             m_nHttpResponseStatusCode = 0;
@@ -175,8 +180,6 @@ namespace webdav_ucp
         void removeDAVOptions( const OUString & rURL );
         void addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32 nLifeTime );
 
-        void updateCachedOption( DAVOptions & rDAVOptions, const sal_uInt32 nLifeTime );
-
         /** return the cached value of HTTP response status code
             If the cached value is found stale, it is removed.
 
diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.cxx b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
index 1937c73c..a292128 100644
--- a/ucb/source/ucp/webdav-neon/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
@@ -1595,7 +1595,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
                         if ( aDAVOptions.getHttpResponseStatusCode() != SC_GONE &&
                              !aDAVOptions.isHeadAllowed() )
                         {
-                            throw DAVException( DAVException::DAV_HTTP_ERROR, "405 Not Implemented", 405 );
+                            throw DAVException( DAVException::DAV_HTTP_ERROR, "405 Not Implemented", SC_METHOD_NOT_ALLOWED );
                         }
                         // if HEAD is enabled on this site
                         // check if there is a relevant HTTP response status code cached
@@ -1680,8 +1680,8 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
                                 aLastException.getStatus();
                             aDAVOptionsException.setHttpResponseStatusCode( ResponseStatusCode );
                             aDAVOptionsException.setHttpResponseStatusText( aLastException.getData() );
-                            aStaticDAVOptionsCache.updateCachedOption( aDAVOptionsException,
-                                                                       m_nOptsCacheLifeNotFound );
+                            aStaticDAVOptionsCache.addDAVOptions( aDAVOptionsException,
+                                                                  m_nOptsCacheLifeNotFound );
 
                             if ( !shouldAccessNetworkAfterException( aLastException ) )
                             {


More information about the Libreoffice-commits mailing list