[Libreoffice-commits] core.git: ucb/source
Giuseppe Castagno
giuseppe.castagno at acca-esse.eu
Fri Jul 29 21:34:22 UTC 2016
ucb/source/ucp/webdav-neon/DAVTypes.cxx | 29 ++++++++++++++
ucb/source/ucp/webdav-neon/DAVTypes.hxx | 15 +++++++
ucb/source/ucp/webdav-neon/webdavcontent.cxx | 54 +++++++++++++++++++--------
3 files changed, 83 insertions(+), 15 deletions(-)
New commits:
commit 7f32fddb445ef1c1e17f9028f252c21dd83e03af
Author: Giuseppe Castagno <giuseppe.castagno at acca-esse.eu>
Date: Tue Jul 26 11:36:24 2016 +0200
tdf#101094 (19) OPTIONS: Add mechanism to manage not found Web URL: GET
Change-Id: Ie3da55d230631c50968b00cdea176f30051abf37
Reviewed-on: https://gerrit.libreoffice.org/27699
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Giuseppe Castagno <giuseppe.castagno at acca-esse.eu>
diff --git a/ucb/source/ucp/webdav-neon/DAVTypes.cxx b/ucb/source/ucp/webdav-neon/DAVTypes.cxx
index 2f4feb3..8613bda 100644
--- a/ucb/source/ucp/webdav-neon/DAVTypes.cxx
+++ b/ucb/source/ucp/webdav-neon/DAVTypes.cxx
@@ -145,4 +145,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( NeonUri::unescape( 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-neon/DAVTypes.hxx b/ucb/source/ucp/webdav-neon/DAVTypes.hxx
index 6dbdd20..b1a97c2 100644
--- a/ucb/source/ucp/webdav-neon/DAVTypes.hxx
+++ b/ucb/source/ucp/webdav-neon/DAVTypes.hxx
@@ -158,6 +158,21 @@ namespace webdav_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-neon/webdavcontent.cxx b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
index 01eba4e..902bc76 100644
--- a/ucb/source/ucp/webdav-neon/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
@@ -2126,26 +2126,50 @@ 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.get())
- m_xCachedProps.reset(
- new CachableContentProperties( ContentProperties( aResource ) ) );
- else
- m_xCachedProps->addProperties(
- aResource.properties );
+ {
+ osl::MutexGuard aGuard( m_aMutex );
- m_xResAccess.reset(
- new DAVResourceAccess( *xResAccess.get() ) );
+ // cache headers.
+ if ( !m_xCachedProps.get())
+ m_xCachedProps.reset(
+ new CachableContentProperties( ContentProperties( aResource ) ) );
+ else
+ m_xCachedProps->addProperties(
+ aResource.properties );
+
+ m_xResAccess.reset(
+ new DAVResourceAccess( *xResAccess.get() ) );
+ }
+
+ xDataSink->setInputStream( xIn );
}
+ else
+ {
+ // return exception as if the resource was not found
+ uno::Sequence< uno::Any > aArgs( 1 );
+ aArgs[ 0 ] <<= beans::PropertyValue(
+ OUString("Uri"), -1,
+ uno::makeAny(aTargetURL),
+ beans::PropertyState_DIRECT_VALUE);
- xDataSink->setInputStream( xIn );
+ ucbhelper::cancelCommandExecution(
+ uno::makeAny(
+ ucb::InteractiveAugmentedIOException(
+ OUString("Not found!"),
+ static_cast< cppu::OWeakObject * >( this ),
+ task::InteractionClassification_ERROR,
+ ucb::IOErrorCode_NOT_EXISTING,
+ aArgs ) ),
+ xEnv );
+ // Unreachable
+ }
}
catch ( DAVException const & e )
{
More information about the Libreoffice-commits
mailing list