summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiuseppe Castagno <giuseppe.castagno@acca-esse.eu>2016-10-11 15:21:23 +0200
committerGiuseppe Castagno <giuseppe.castagno@acca-esse.eu>2016-10-12 19:20:59 +0000
commit1ca68d386bc0345240bf288bec023faaba2e07af (patch)
treeed42bd4aad86934efcf2d734dcfe477df7c8f4b0
parent16fd5a6e7dbf7dabc1d8c53cd3aa6c1a50ff7892 (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>
-rw-r--r--ucb/qa/cppunit/webdav/webdav_options.cxx33
-rw-r--r--ucb/source/ucp/webdav-neon/DAVTypes.cxx46
-rw-r--r--ucb/source/ucp/webdav-neon/DAVTypes.hxx7
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontent.cxx6
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 ) )
{