ucb: webdav-curl: tdf#101094 (36): Fix behaviour of GET in fetching Headers only
Implement a better way to GET only headers, as HEAD method
substitute.
Wrote a new version of GET, specifically for 'no payload' service
because sometimes neon was returning an internal error about:
'Compressed response was truncated' but without a specific error
state.
[ port of commit f7697a633cd56003fcb1d86bee7eb658020af506
- omit the actual change in NeonSession because it's not obvious
if it is needed/was a neon-specific problem ]
Change-Id: Ic6afe37d0e010745091301fd9647fc1b3b9e378d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123495
Tested-by: Michael Stahl <michael.stahl@allotropia.de>
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
diff --git a/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx b/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx
index e76e6ae..291f0d5 100644
--- a/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx
+++ b/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx
@@ -483,7 +483,8 @@ uno::Reference< io::XInputStream > DAVResourceAccess::GET(
}
uno::Reference< io::XInputStream > DAVResourceAccess::GET(
// used as HEAD substitute when HEAD is not implemented on server
void DAVResourceAccess::GET0(
DAVRequestHeaders &rRequestHeaders,
const std::vector< OUString > & rHeaderNames,
DAVResource & rResource,
@@ -504,14 +505,14 @@ uno::Reference< io::XInputStream > DAVResourceAccess::GET(
ucb::WebDAVHTTPMethod_GET,
rRequestHeaders );
xStream = m_xSession->GET( getRequestURI(),
rHeaderNames,
rResource,
DAVRequestEnvironment(
getRequestURI(),
new DAVAuthListener_Impl(
xEnv, m_aURL ),
rRequestHeaders, xEnv ) );
m_xSession->GET( getRequestURI(),
rHeaderNames,
rResource,
DAVRequestEnvironment(
getRequestURI(),
new DAVAuthListener_Impl(
xEnv, m_aURL ),
rRequestHeaders, xEnv ) );
}
catch (DAVException const& e)
{
@@ -522,8 +523,6 @@ uno::Reference< io::XInputStream > DAVResourceAccess::GET(
}
}
while ( bRetry );
return xStream;
}
diff --git a/ucb/source/ucp/webdav-curl/DAVResourceAccess.hxx b/ucb/source/ucp/webdav-curl/DAVResourceAccess.hxx
index 6139531..1abde0f 100644
--- a/ucb/source/ucp/webdav-curl/DAVResourceAccess.hxx
+++ b/ucb/source/ucp/webdav-curl/DAVResourceAccess.hxx
@@ -125,12 +125,13 @@ public:
DAVResource & rResource,
const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
/// used as HEAD substitute when HEAD is not implemented on server
/// @throws DAVException
css::uno::Reference< css::io::XInputStream >
GET( DAVRequestHeaders & rRequestHeaders,
const std::vector< OUString > & rHeaderNames, // empty == 'all'
DAVResource & rResource,
const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
void
GET0( DAVRequestHeaders & rRequestHeaders,
const std::vector< OUString > & rHeaderNames, // empty == 'all'
DAVResource & rResource,
const css::uno::Reference< css::ucb::XCommandEnvironment > & xEnv );
/// @throws DAVException
void
diff --git a/ucb/source/ucp/webdav-curl/webdavcontent.cxx b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
index d421d9a..4698f70 100644
--- a/ucb/source/ucp/webdav-curl/webdavcontent.cxx
+++ b/ucb/source/ucp/webdav-curl/webdavcontent.cxx
@@ -115,10 +115,7 @@ void lcl_sendPartialGETRequest( bool &bError,
}
try
{
uno::Reference< io::XInputStream > xIn = xResAccess->GET( aPartialGet,
aHeaderNames,
aResource,
xEnv );
xResAccess->GET0( aPartialGet, aHeaderNames, aResource, xEnv );
bError = false;
if ( bIsRequestSize )
@@ -1462,7 +1459,7 @@ uno::Reference< sdbc::XRow > Content::getPropertyValues(
removeCachedPropertyNames( xResAccess->getURL() );
// test if HEAD allowed, if not, throw, will be catched immediately
if ( !aStaticDAVOptionsCache.isHeadAllowed( xResAccess->getURL() ) )
throw DAVException( DAVException::DAV_HTTP_ERROR, "405 Not Implemented" );
throw DAVException( DAVException::DAV_HTTP_ERROR, "405 Not Implemented", 405 );
xResAccess->HEAD( aHeaderNames, resource, xEnv );
m_bDidGetOrHead = true;
@@ -4056,10 +4053,10 @@ bool Content::isResourceAvailable( const css::uno::Reference< css::ucb::XCommand
OUString( "Range" ),
OUString( "bytes=0-0" )));
rResAccess->GET( aPartialGet,
aHeaderNames,
aResource,
xEnv );
rResAccess->GET0( aPartialGet,
aHeaderNames,
aResource,
xEnv );
return true;
}
catch (...)