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.casta...@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 <c...@libreoffice.org> Reviewed-by: Giuseppe Castagno <giuseppe.casta...@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 ) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits