From ee344a0abe08ab6d484ea23fd704fec65fbed56c Mon Sep 17 00:00:00 2001 From: Victor Mozgin Date: Mon, 6 Mar 2023 11:02:42 -0500 Subject: [PATCH 1/2] OneDrive sometimes generates spurious 400 errors, these are perfectly fine to retry on instead of failing the whole run. --- src/duplicacy_oneclient.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/duplicacy_oneclient.go b/src/duplicacy_oneclient.go index 0f25bb91..e9824e90 100644 --- a/src/duplicacy_oneclient.go +++ b/src/duplicacy_oneclient.go @@ -201,7 +201,7 @@ func (client *OneDriveClient) call(url string, method string, input interface{}, continue } else if response.StatusCode == 409 { return nil, 0, OneDriveError{Status: response.StatusCode, Message: "Conflict"} - } else if response.StatusCode > 401 && response.StatusCode != 404 { + } else if response.StatusCode >= 400 && response.StatusCode != 404 { delay := int((rand.Float32() * 0.5 + 0.5) * 1000.0 * float32(backoff)) if backoffList, found := response.Header["Retry-After"]; found && len(backoffList) > 0 { retryAfter, _ := strconv.Atoi(backoffList[0]) From 405661820489aadb692cc5b097dc46528abc73e7 Mon Sep 17 00:00:00 2001 From: Victor Mozgin Date: Fri, 14 Apr 2023 19:32:58 -0400 Subject: [PATCH 2/2] Fixed 400 error processing for MoveFile/PATCH (in this case there are valid 400 errors that designate non-existent target directory) --- src/duplicacy_oneclient.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/duplicacy_oneclient.go b/src/duplicacy_oneclient.go index e9824e90..dfec3284 100644 --- a/src/duplicacy_oneclient.go +++ b/src/duplicacy_oneclient.go @@ -201,7 +201,12 @@ func (client *OneDriveClient) call(url string, method string, input interface{}, continue } else if response.StatusCode == 409 { return nil, 0, OneDriveError{Status: response.StatusCode, Message: "Conflict"} - } else if response.StatusCode >= 400 && response.StatusCode != 404 { + } else if response.StatusCode >= 400 && response.StatusCode != 404 && !( + method == "PATCH" && response.StatusCode == 400) { + // MoveFile uses PATCH method, and it unfortunately relies on + // processing 400 errors for detecting non-existent target + // folders. So in this case we bubble up 400 errors to be handled + // in MoveFile delay := int((rand.Float32() * 0.5 + 0.5) * 1000.0 * float32(backoff)) if backoffList, found := response.Header["Retry-After"]; found && len(backoffList) > 0 { retryAfter, _ := strconv.Atoi(backoffList[0])