summaryrefslogtreecommitdiff
path: root/ucb
diff options
context:
space:
mode:
authorGiuseppe Castagno <giuseppe.castagno@acca-esse.eu>2016-07-30 15:53:27 +0200
committerGiuseppe Castagno <giuseppe.castagno@acca-esse.eu>2016-07-30 16:33:46 +0000
commit0acd13ec38fad1a63b86d2428299e469227a9069 (patch)
tree100e30ffb5940ec06b706925955ce5b3d30c865f /ucb
parentb6a698b093f78dc90836d502db3d0276f335fbfe (diff)
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 <ci@libreoffice.org> Reviewed-by: Giuseppe Castagno <giuseppe.castagno@acca-esse.eu>
Diffstat (limited to 'ucb')
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontent.cxx41
1 files changed, 41 insertions, 0 deletions
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 );