diff options
author | László Németh <nemeth@numbertext.org> | 2023-01-25 12:08:14 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2023-03-10 14:10:49 +0100 |
commit | 07078d715bca4b723d235b817f6e661248fee7b5 (patch) | |
tree | c2ac65edc5638e50f811a2d37decc1713ab5335f /ucb | |
parent | 9592458973fdaaeacaf261a07278baedcb7e8910 (diff) |
tdf#152493 ucb WebDAV: fix upload using HTTP 1.0 fallback
Fix broken libcurl upload to Vibe 4.0.6 WebDAV server
using HTTP 1.0 fallback.
Regression from commit 023ebf17898db4bca63129f079fd90b5cf76c1a9
"ucb: remove --with-webdav=neon" (Neon had no such upload
problem).
HTTP 1.0 fallback found by Pál Zoltán Kochis.
Fallback for CURLE_UNSUPPORTED_PROTOCOL
suggested by Michael Stahl. Thanks for their and
Attila Bakos' help.
Michael Stahl's comment: "'HTTP/0.9' in the [curl] error
message is very misleading: it simply means that a header
was expected but there was no header, so what is received
is interpreted as body.
Note: the HTTP/1.0 works because it does not use the
'Expect: 100-continue' so there should be no intermediate
100 Continue response from the server at all - instead
libcurl directly sends the XML document for the PROPFIND
and the server sends the response, and the problem does
not occur."
Co-authored-by: Michael Stahl <michael.stahl@allotropia.de>
Change-Id: I8bd79154de14b6425e0324f4d8f6e64512c08264
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146067
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
(cherry picked from commit 30ca48f4dc0e65a3798e6b21574bc80f6d4953fa)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146316
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'ucb')
-rw-r--r-- | ucb/source/ucp/webdav-curl/CurlSession.cxx | 24 | ||||
-rw-r--r-- | ucb/source/ucp/webdav-curl/DAVException.hxx | 1 |
2 files changed, 25 insertions, 0 deletions
diff --git a/ucb/source/ucp/webdav-curl/CurlSession.cxx b/ucb/source/ucp/webdav-curl/CurlSession.cxx index af465b223c59..25c1bdf6faaa 100644 --- a/ucb/source/ucp/webdav-curl/CurlSession.cxx +++ b/ucb/source/ucp/webdav-curl/CurlSession.cxx @@ -963,6 +963,8 @@ auto CurlProcessor::ProcessRequestImpl( "curl_easy_perform failed: " << GetErrorString(rc, rSession.m_ErrorBuffer)); switch (rc) { + case CURLE_UNSUPPORTED_PROTOCOL: + throw DAVException(DAVException::DAV_UNSUPPORTED); case CURLE_COULDNT_RESOLVE_PROXY: throw DAVException( DAVException::DAV_HTTP_LOOKUP, @@ -1249,6 +1251,7 @@ auto CurlProcessor::ProcessRequest( } } bool isRetry(false); + bool isFallbackHTTP10(false); int nAuthRequests(0); int nAuthRequestsProxy(0); @@ -1472,6 +1475,27 @@ auto CurlProcessor::ProcessRequest( } } } + else if (rException.getError() == DAVException::DAV_UNSUPPORTED) + { + // tdf#152493 libcurl can't handle "Transfer-Encoding: chunked" + // in HTTP/1.1 100 Continue response. + // workaround: if HTTP/1.1 didn't work, try HTTP/1.0 + // (but fallback only once - to prevent infinite loop) + if (isFallbackHTTP10) + { + throw DAVException(DAVException::DAV_HTTP_ERROR); + } + isFallbackHTTP10 = true; + // note: this is not reset - future requests to this URI use it! + auto rc = curl_easy_setopt(rSession.m_pCurl.get(), CURLOPT_HTTP_VERSION, + CURL_HTTP_VERSION_1_0); + if (rc != CURLE_OK) + { + throw DAVException(DAVException::DAV_HTTP_ERROR); + } + SAL_INFO("ucb.ucp.webdav.curl", "attempting fallback to HTTP/1.0"); + isRetry = true; + } if (!isRetry) { throw; // everything else: re-throw diff --git a/ucb/source/ucp/webdav-curl/DAVException.hxx b/ucb/source/ucp/webdav-curl/DAVException.hxx index 537b5a82fa2b..24f8349d3a31 100644 --- a/ucb/source/ucp/webdav-curl/DAVException.hxx +++ b/ucb/source/ucp/webdav-curl/DAVException.hxx @@ -129,6 +129,7 @@ class DAVException : public std::exception DAV_SESSION_CREATE, // session creation error, // mData = server[:port] DAV_INVALID_ARG, // invalid argument + DAV_UNSUPPORTED, // internal to CurlSession DAV_LOCK_EXPIRED, // DAV lock expired |