Kaydet (Commit) 7f32fddb authored tarafından Giuseppe Castagno's avatar Giuseppe Castagno

tdf#101094 (19) OPTIONS: Add mechanism to manage not found Web URL: GET

Change-Id: Ie3da55d230631c50968b00cdea176f30051abf37
Reviewed-on: https://gerrit.libreoffice.org/27699Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarGiuseppe Castagno <giuseppe.castagno@acca-esse.eu>
üst a3e57b44
...@@ -145,4 +145,33 @@ void DAVOptionsCache::addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32 ...@@ -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: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */
...@@ -158,6 +158,21 @@ namespace webdav_ucp ...@@ -158,6 +158,21 @@ namespace webdav_ucp
void removeDAVOptions( const OUString & rURL ); void removeDAVOptions( const OUString & rURL );
void addDAVOptions( DAVOptions & rDAVOptions, const sal_uInt32 nLifeTime ); 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: private:
/// remove the last '/' in aUrl, if it exists /// remove the last '/' in aUrl, if it exists
......
...@@ -2126,26 +2126,50 @@ uno::Any Content::open( ...@@ -2126,26 +2126,50 @@ uno::Any Content::open(
DAVResource aResource; DAVResource aResource;
std::vector< OUString > aHeaders; std::vector< OUString > aHeaders;
uno::Reference< io::XInputStream > xIn // check if the resource was present on the server
= xResAccess->GET( aHeaders, aResource, xEnv ); if( aStaticDAVOptionsCache.isResourceFound( aTargetURL ) )
m_bDidGetOrHead = true;
{ {
osl::MutexGuard aGuard( m_aMutex ); uno::Reference< io::XInputStream > xIn
= xResAccess->GET( aHeaders, aResource, xEnv );
m_bDidGetOrHead = true;
// cache headers. {
if ( !m_xCachedProps.get()) osl::MutexGuard aGuard( m_aMutex );
m_xCachedProps.reset(
new CachableContentProperties( ContentProperties( aResource ) ) );
else
m_xCachedProps->addProperties(
aResource.properties );
m_xResAccess.reset( // cache headers.
new DAVResourceAccess( *xResAccess.get() ) ); 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 ) catch ( DAVException const & e )
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment