From 0acd13ec38fad1a63b86d2428299e469227a9069 Mon Sep 17 00:00:00 2001 From: Giuseppe Castagno Date: Sat, 30 Jul 2016 15:53:27 +0200 Subject: tdf#101094 (20) OPTIONS: Add mechanism to manage not found Web URL: HEAD Change-Id: Ia941cfb68924140c3ab171d4ed2c4e8675947ca3 Reviewed-on: https://gerrit.libreoffice.org/27724 Tested-by: Jenkins Reviewed-by: Giuseppe Castagno --- ucb/source/ucp/webdav-neon/webdavcontent.cxx | 41 ++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'ucb') diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.cxx b/ucb/source/ucp/webdav-neon/webdavcontent.cxx index 902bc7671cf2..42e3335b02d6 100644 --- a/ucb/source/ucp/webdav-neon/webdavcontent.cxx +++ b/ucb/source/ucp/webdav-neon/webdavcontent.cxx @@ -1287,12 +1287,39 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues( // Obtain values from server... + // save original target URL (not redirected) + OUString aTargetURL( xResAccess->getURL() ); // First, identify whether resource is DAV or not bool bNetworkAccessAllowed = true; ResourceType eType = getResourceType( xEnv, xResAccess, &bNetworkAccessAllowed ); + // check if the resource was not found in a former try + // the result is cached for a time of 'OptsCacheLifeNotFound' seconds, + // normally a short time + if ( !aStaticDAVOptionsCache.isResourceFound( aTargetURL ) ) + { + // file was not found during a previous access + // return exception as if the resource was not found + SAL_WARN( "ucb.ucp.webdav", " URL <" << aTargetURL << "> was not found prevoiusly (was cached)" ); + 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 ); + } + if ( eType == DAV ) { // cache lookup... getResourceType may fill the props cache via @@ -1483,6 +1510,20 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues( bNetworkAccessAllowed = shouldAccessNetworkAfterException( e ); + // check if error is SC_NOT_FOUND + // if URL resource not found, set the corresponding resource + // element in option cache and update the cache lifetime accordingly + if( e.getStatus() == SC_NOT_FOUND ) + { + DAVOptions aDAVOptions; + if( aStaticDAVOptionsCache.getDAVOptions( aTargetURL, aDAVOptions ) ) + { + aDAVOptions.setResourceFound( false ); + aStaticDAVOptionsCache.addDAVOptions( aDAVOptions, + m_nOptsCacheLifeNotFound ); + } + } + if ( !bNetworkAccessAllowed ) { cancelCommandExecution( e, xEnv ); -- cgit