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 (...)