ucb: webdav-curl: tdf#101094 (19) OPTIONS: Add mechanism to manage not found Web URL: GET
[ port of commit 7f32fddb445ef1c1e17f9028f252c21dd83e03af ]
Change-Id: Ie1412f849df0b9da76ccc41309e8e587c8f36c7c
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123471
Tested-by: Michael Stahl <michael.stahl@allotropia.de>
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
diff --git a/ucb/source/ucp/webdav-curl/DAVTypes.cxx b/ucb/source/ucp/webdav-curl/DAVTypes.cxx
index 839b9e8..a786435 100644
--- a/ucb/source/ucp/webdav-curl/DAVTypes.cxx
+++ b/ucb/source/ucp/webdav-curl/DAVTypes.cxx
@@ -147,4 +147,33 @@ void DAVOptionsCache::addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32
}
bool DAVOptionsCache::isResourceFound( const OUString & rURL )
{
osl::MutexGuard aGuard( m_aMutex );
OUString aEncodedUrl( ucb_impl::urihelper::encodeURI( DecodeURI(rURL) ) );
normalizeURLLastChar( aEncodedUrl );
DAVOptionsMap::iterator it;
it = m_aTheCache.find( aEncodedUrl );
if ( it != m_aTheCache.end() )
{
// first check for stale
TimeValue t1;
osl_getSystemTime( &t1 );
if( (*it).second.getStaleTime() < t1.Seconds )
{
m_aTheCache.erase( it );
return true; // to force again OPTIONS method
}
// check if the resource was present on server
return (*it).second.isResourceFound();
}
// this value is needed because some web server don't implement
// OPTIONS method, so the resource is considered found,
// until detected otherwise
return true;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
diff --git a/ucb/source/ucp/webdav-curl/DAVTypes.hxx b/ucb/source/ucp/webdav-curl/DAVTypes.hxx
index d545329..b7bc700 100644
--- a/ucb/source/ucp/webdav-curl/DAVTypes.hxx
+++ b/ucb/source/ucp/webdav-curl/DAVTypes.hxx
@@ -149,6 +149,21 @@ namespace http_dav_ucp
void removeDAVOptions( const OUString & rURL );
void addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32 nLifeTime );
/** Check if the DAV options cached value was found
by the last OPTIONS method call.
If the cached value is found stale, it is removed.
@param OUString
the resource URL
@return bool
true if resource was found or if the Web resource DAV options
are not present (meaning the resource should be checked for
presence anyway)
false if resource was not found
*/
bool isResourceFound( const OUString & rURL );
private:
/// remove the last '/' in aUrl, if it exists
diff --git a/ucb/source/ucp/webdav-curl/webdavcontent.cxx b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
index 962d95f..483d409 100644
--- a/ucb/source/ucp/webdav-curl/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
@@ -2141,26 +2141,51 @@ uno::Any Content::open(
DAVResource aResource;
std::vector< OUString > aHeaders;
uno::Reference< io::XInputStream > xIn
= xResAccess->GET( aHeaders, aResource, xEnv );
m_bDidGetOrHead = true;
// check if the resource was present on the server
if( aStaticDAVOptionsCache.isResourceFound( aTargetURL ) )
{
osl::MutexGuard aGuard( m_aMutex );
uno::Reference< io::XInputStream > xIn
= xResAccess->GET( aHeaders, aResource, xEnv );
m_bDidGetOrHead = true;
// cache headers.
if (!m_xCachedProps)
m_xCachedProps.reset(
new CachableContentProperties( ContentProperties( aResource ) ) );
else
m_xCachedProps->addProperties(
aResource.properties );
{
osl::MutexGuard aGuard( m_aMutex );
m_xResAccess.reset(
new DAVResourceAccess( *xResAccess ) );
// cache headers.
if (!m_xCachedProps)
m_xCachedProps.reset(
new CachableContentProperties( ContentProperties( aResource ) ) );
else
m_xCachedProps->addProperties(
aResource.properties );
m_xResAccess.reset(
new DAVResourceAccess( *xResAccess ) );
}
xDataSink->setInputStream( xIn );
}
else
{
// return exception as if the resource was not found
uno::Sequence< uno::Any > aArgs( 1 );
aArgs[ 0 ] <<= beans::PropertyValue(
"Uri", -1,
uno::makeAny(aTargetURL),
beans::PropertyState_DIRECT_VALUE);
xDataSink->setInputStream( xIn );
ucbhelper::cancelCommandExecution(
uno::makeAny(
ucb::InteractiveAugmentedIOException(
"Not found!",
static_cast< cppu::OWeakObject * >( this ),
task::InteractionClassification_ERROR,
ucb::IOErrorCode_NOT_EXISTING,
aArgs ) ),
xEnv );
// Unreachable
}
}
catch ( DAVException const & e )
{