From e1ea2fa6b8997625062c318e70d2bc3244b5c7f5 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Thu, 17 Oct 2024 15:19:06 +0200 Subject: [PATCH] Allow item status 425 "too early" for items when changing metadata Fixes the upload behavior with ownCloud Infinite Scale --- backend/webdav/api/types.go | 31 +++++++++++++++++++++---------- backend/webdav/webdav.go | 3 ++- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/backend/webdav/api/types.go b/backend/webdav/api/types.go index 6f2657b12..cef1cd701 100644 --- a/backend/webdav/api/types.go +++ b/backend/webdav/api/types.go @@ -82,26 +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 } - // allow status 425 "too early" for files still in postprocessing - if code == 425 { - return true - } - 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 eed6f79ad..c33718de5 100644 --- a/backend/webdav/webdav.go +++ b/backend/webdav/webdav.go @@ -356,7 +356,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) {