summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiuseppe Castagno <giuseppe.castagno@acca-esse.eu>2016-10-13 09:34:19 +0200
committerGiuseppe Castagno <giuseppe.castagno@acca-esse.eu>2016-10-13 12:26:43 +0000
commit97cc70d7285526ae2ee3b3bac425eb031c4c0321 (patch)
tree04f018daef7b01600ba5be3257ea747c780beadc
parent162569e8c28d6519b73ccb4638cbd732103c8ef4 (diff)
tdf#102499 (7): Caching connect timeout or cannot connect.
An unofficial HTTP response status code is defined and used internally in LibreOffice WebDAV ucp provider in order to catch either the DAVException::DAV_HTTP_TIMEOUT state or the DAVException::DAV_HTTP_CONNECT state. Change-Id: Iec4927d18ace5384fed16a7ec2a2620dc8305c5b Reviewed-on: https://gerrit.libreoffice.org/29757 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Giuseppe Castagno <giuseppe.castagno@acca-esse.eu>
-rw-r--r--ucb/source/ucp/webdav-neon/DAVException.hxx4
-rw-r--r--ucb/source/ucp/webdav-neon/webdavcontent.cxx26
2 files changed, 30 insertions, 0 deletions
diff --git a/ucb/source/ucp/webdav-neon/DAVException.hxx b/ucb/source/ucp/webdav-neon/DAVException.hxx
index 424445c46fd1..a7e57caa3603 100644
--- a/ucb/source/ucp/webdav-neon/DAVException.hxx
+++ b/ucb/source/ucp/webdav-neon/DAVException.hxx
@@ -101,6 +101,10 @@ const sal_uInt16 SC_HTTP_VERSION_NOT_SUPPORTED = 505;
// DAV extensions (<https://tools.ietf.org/html/rfc4918#section-11>)
const sal_uInt16 SC_INSUFFICIENT_STORAGE = 507;
+// unofficial status codes only used internally by LO
+// used to cache the connection time out event
+const sal_uInt16 USC_CONNECTION_TIMED_OUT = 908;
+
class DAVException : public std::exception
{
diff --git a/ucb/source/ucp/webdav-neon/webdavcontent.cxx b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
index a2921283b9c3..cd32145c1206 100644
--- a/ucb/source/ucp/webdav-neon/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-neon/webdavcontent.cxx
@@ -3943,6 +3943,26 @@ Content::ResourceType Content::getResourceType(
{
rResAccess->resetUri();
+ // first check if the cached error can be mapped to DAVException::DAV_HTTP_TIMEOUT or mapped to DAVException::DAV_HTTP_CONNECT
+ if ( aDAVOptions.getHttpResponseStatusCode() == USC_CONNECTION_TIMED_OUT )
+ {
+ // behave same as DAVException::DAV_HTTP_TIMEOUT or DAVException::DAV_HTTP_CONNECT was thrown
+ try
+ {
+ // extract host name and connection port
+ NeonUri theUri( rURL );
+ OUString aHostName = theUri.GetHost();
+ sal_Int32 nPort = theUri.GetPort();
+ throw DAVException( DAVException::DAV_HTTP_TIMEOUT,
+ NeonUri::makeConnectionEndPointString( aHostName,
+ nPort ) );
+ }
+ catch ( DAVException& exp )
+ {
+ cancelCommandExecution( exp, xEnv );
+ }
+ }
+
if ( aDAVOptions.getHttpResponseStatusCode() != SC_NOT_FOUND &&
aDAVOptions.getHttpResponseStatusCode() != SC_GONE ) // the cached OPTIONS can have SC_GONE
{
@@ -4045,6 +4065,12 @@ void Content::getResourceOptions(
// probably a new bit stating 'timed out' should be added to opts var?
// in any case abort the command
SAL_WARN( "ucb.ucp.webdav", "OPTIONS - DAVException: DAV_HTTP_TIMEOUT or DAV_HTTP_CONNECT for URL <" << m_xIdentifier->getContentIdentifier() << ">" );
+ // cache the internal unofficial status code
+
+ aDAVOptions.setHttpResponseStatusCode( USC_CONNECTION_TIMED_OUT );
+ // used only internally, so the text doesn't really matter..
+ aStaticDAVOptionsCache.addDAVOptions( aDAVOptions,
+ m_nOptsCacheLifeNotFound );
cancelCommandExecution( e, xEnv );
// unreachable
}