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@libreoffice.org> Reviewed-by: Giuseppe Castagno <giuseppe.castagno@acca-esse.eu>
This commit is contained in:
@@ -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
|
|||||||
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(
|
|||||||
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 )
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user