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: */
|
||||
|
@@ -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
|
||||
|
@@ -2126,6 +2126,9 @@ uno::Any Content::open(
|
||||
DAVResource aResource;
|
||||
std::vector< OUString > aHeaders;
|
||||
|
||||
// check if the resource was present on the server
|
||||
if( aStaticDAVOptionsCache.isResourceFound( aTargetURL ) )
|
||||
{
|
||||
uno::Reference< io::XInputStream > xIn
|
||||
= xResAccess->GET( aHeaders, aResource, xEnv );
|
||||
m_bDidGetOrHead = true;
|
||||
@@ -2147,6 +2150,27 @@ uno::Any Content::open(
|
||||
|
||||
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);
|
||||
|
||||
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 )
|
||||
{
|
||||
// check if error is SC_NOT_FOUND
|
||||
|
Reference in New Issue
Block a user