ucb/source/ucp/webdav-curl/DAVException.hxx | 4 +- ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx | 42 ++++++++++++++--------- 2 files changed, 29 insertions(+), 17 deletions(-)
New commits: commit b3fc6caf392809d844e84f6a36db6a0fe3111c39 Author: Michael Stahl <michael.st...@allotropia.de> AuthorDate: Mon Oct 11 20:39:39 2021 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Mon Nov 1 18:48:58 2021 +0100 ucb: webdav-curl: tdf#102499 (2): Refactor the WebDAV resource access retry [ port of commit ac060f97cc937787b4079e435c5b312f6894c277 ] Change-Id: Ib8cb79ddc67a486b067d3187a965ac55ae698fa4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123492 Tested-by: Michael Stahl <michael.st...@allotropia.de> Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/ucb/source/ucp/webdav-curl/DAVException.hxx b/ucb/source/ucp/webdav-curl/DAVException.hxx index ba121efa21c9..4da64420cc00 100644 --- a/ucb/source/ucp/webdav-curl/DAVException.hxx +++ b/ucb/source/ucp/webdav-curl/DAVException.hxx @@ -81,14 +81,14 @@ const sal_uInt16 SC_UNPROCESSABLE_ENTITY = 422; const sal_uInt16 SC_LOCKED = 423; const sal_uInt16 SC_FAILED_DEPENDENCY = 424; -//5xx (Server error) +//5xx (Server error, general <https://tools.ietf.org/html/rfc7231#section-6.6>) const sal_uInt16 SC_INTERNAL_SERVER_ERROR = 500; const sal_uInt16 SC_NOT_IMPLEMENTED = 501; const sal_uInt16 SC_BAD_GATEWAY = 502; const sal_uInt16 SC_SERVICE_UNAVAILABLE = 503; const sal_uInt16 SC_GATEWAY_TIMEOUT = 504; const sal_uInt16 SC_HTTP_VERSION_NOT_SUPPORTED = 505; -// DAV extensions +// DAV extensions (<https://tools.ietf.org/html/rfc4918#section-11>) const sal_uInt16 SC_INSUFFICIENT_STORAGE = 507; diff --git a/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx b/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx index cead9980b4a6..e76e6ae9d1fa 100644 --- a/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx +++ b/ucb/source/ucp/webdav-curl/DAVResourceAccess.cxx @@ -1045,7 +1045,7 @@ void DAVResourceAccess::initialize() return; } - // Own URI is needed for redirect cycle detection. + // Own URI is needed to redirect cycle detection. m_aRedirectURIs.push_back( aURI ); // Success. @@ -1147,23 +1147,35 @@ bool DAVResourceAccess::handleException(DAVException const& e, int const errorCo return true; } return false; - // --> tkr #67048# copy & paste images doesn't display. - // if we have a bad connection try again. Up to three times. + // i#67048 copy & paste images doesn't display. This bug refers + // to an old OOo problem about getting resources from sites with a bad connection. + // If we have a bad connection try again. Up to three times. case DAVException::DAV_HTTP_ERROR: - // retry up to three times, if not a client-side error. - // exception: error 501, server side error that - // tells us the used method is not implemented - // on the server, it's nonsense to insist... - if ( ( e.getStatus() < 400 || e.getStatus() >= 500 || - e.getStatus() == 413 ) && - ( e.getStatus() != 501 ) && - errorCount < 3 ) - { + // retry up to three times, if not a client-side error (4xx error codes) + if ( e.getStatus() < SC_BAD_REQUEST && errorCount < 3 ) return true; + // check the server side errors + switch( e.getStatus() ) + { + // the HTTP server side response status codes that can be retried + // [Serf TODO? i#119036] case SC_REQUEST_ENTITY_TOO_LARGE: + case SC_BAD_GATEWAY: // retry, can be an excessive load + case SC_GATEWAY_TIMEOUT: // retry, may be we get lucky + case SC_SERVICE_UNAVAILABLE: // retry, the service may become available + case SC_INSUFFICIENT_STORAGE: // space may be freed, retry + { + if ( errorCount < 3 ) + return true; + else + return false; + } + break; + // all the other HTTP server response status codes are NOT retry + default: + return false; } - return false; - // <-- - // --> tkr: if connection has said retry then retry! + break; + // if connection has said retry then retry! case DAVException::DAV_HTTP_RETRY: return true; // <--