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:
Giuseppe Castagno
2016-07-26 11:36:24 +02:00
parent a3e57b44b2
commit 7f32fddb44
3 changed files with 83 additions and 15 deletions

View File

@@ -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: */

View File

@@ -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

View File

@@ -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