diff options
author | Giuseppe Castagno <giuseppe.castagno@acca-esse.eu> | 2016-10-11 15:21:23 +0200 |
---|---|---|
committer | Giuseppe Castagno <giuseppe.castagno@acca-esse.eu> | 2016-10-12 19:20:59 +0000 |
commit | 1ca68d386bc0345240bf288bec023faaba2e07af (patch) | |
tree | ed42bd4aad86934efcf2d734dcfe477df7c8f4b0 /ucb | |
parent | 16fd5a6e7dbf7dabc1d8c53cd3aa6c1a50ff7892 (diff) |
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@libreoffice.org>
Reviewed-by: Giuseppe Castagno <giuseppe.castagno@acca-esse.eu>
Diffstat (limited to 'ucb')
-rw-r--r-- | ucb/qa/cppunit/webdav/webdav_options.cxx | 33 | ||||
-rw-r--r-- | ucb/source/ucp/webdav-neon/DAVTypes.cxx | 46 | ||||
-rw-r--r-- | ucb/source/ucp/webdav-neon/DAVTypes.hxx | 7 | ||||
-rw-r--r-- | ucb/source/ucp/webdav-neon/webdavcontent.cxx | 6 |
4 files changed, 54 insertions, 38 deletions
diff --git a/ucb/qa/cppunit/webdav/webdav_options.cxx b/ucb/qa/cppunit/webdav/webdav_options.cxx index 0dad7f8d155b..ce3aba7895e3 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 199028924d8d..5c1844d0f12d 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 723ccb497bc0..c7c37156bd4f 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 1937c73c1ca8..a2921283b9c3 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 ) ) { |