From 839eef0db269333870dc04cb79d0dd0c95e5a418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Wed, 26 Mar 2025 13:51:04 +0100 Subject: [PATCH] webdav: retry propfind on 425 status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This retries propfind on 425 status In ownCloud Infinite Scale, files might be in that state if postprocessing is still ongoing. All metadata are available anyway Allow item status 425 "too early" for items when changing metadata Fixes the upload behavior with ownCloud Infinite Scale Signed-off-by: Jörn Friedrich Dreyer Co-authored-by: Klaas Freitag --- backend/webdav/api/types.go | 27 +++++++++++++++++++++------ backend/webdav/webdav.go | 4 +++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/backend/webdav/api/types.go b/backend/webdav/api/types.go index f26f40e65..cef1cd701 100644 --- a/backend/webdav/api/types.go +++ b/backend/webdav/api/types.go @@ -82,22 +82,37 @@ type Prop struct { // Parse a status of the form "HTTP/1.1 200 OK" or "HTTP/1.1 200" var parseStatus = regexp.MustCompile(`^HTTP/[0-9.]+\s+(\d+)`) -// StatusOK examines the Status and returns an OK flag -func (p *Prop) StatusOK() bool { - // Assume OK if no statuses received +// Code extracts the status code from the first status +func (p *Prop) Code() int { if len(p.Status) == 0 { - return true + return -1 } match := parseStatus.FindStringSubmatch(p.Status[0]) if len(match) < 2 { - return false + return 0 } code, err := strconv.Atoi(match[1]) if err != nil { + return 0 + } + return code +} + +// StatusOK examines the Status and returns an OK flag +func (p *Prop) StatusOK() bool { + // Fetch status code as int + c := p.Code() + + // Assume OK if no statuses received + if c == -1 { + return true + } + if c == 0 { return false } - if code >= 200 && code < 300 { + if c >= 200 && c < 300 { return true + } return false } diff --git a/backend/webdav/webdav.go b/backend/webdav/webdav.go index b8bd670c0..3624f4a8c 100644 --- a/backend/webdav/webdav.go +++ b/backend/webdav/webdav.go @@ -262,6 +262,7 @@ func (f *Fs) Features() *fs.Features { // retryErrorCodes is a slice of error codes that we will retry var retryErrorCodes = []int{ 423, // Locked + 425, // Too Early 429, // Too Many Requests. 500, // Internal Server Error 502, // Bad Gateway @@ -373,7 +374,8 @@ func (f *Fs) readMetaDataForPath(ctx context.Context, path string, depth string) return nil, fs.ErrorObjectNotFound } item := result.Responses[0] - if !item.Props.StatusOK() { + // status code 425 is accepted here as well + if !(item.Props.StatusOK() || item.Props.Code() == 425) { return nil, fs.ErrorObjectNotFound } if itemIsDir(&item) {