diff --git a/changelog/unreleased/pull-4400 b/changelog/unreleased/pull-4400 new file mode 100644 index 000000000..a9aaf6284 --- /dev/null +++ b/changelog/unreleased/pull-4400 @@ -0,0 +1,8 @@ +Bugfix: Ignore missing folders in REST backend + +If a repository accessed via the REST backend was missing folders, then restic +would fail with an error while trying to list the data in the repository. This +has been fixed. + +https://github.com/restic/restic/pull/4400 +https://github.com/restic/rest-server/issues/235 diff --git a/internal/backend/rest/rest.go b/internal/backend/rest/rest.go index 8391df681..f8670280d 100644 --- a/internal/backend/rest/rest.go +++ b/internal/backend/rest/rest.go @@ -147,7 +147,7 @@ func (b *Backend) Save(ctx context.Context, h restic.Handle, rd restic.RewindRea return errors.WithStack(err) } - if resp.StatusCode != 200 { + if resp.StatusCode != http.StatusOK { return errors.Errorf("server response unexpected: %v (%v)", resp.Status, resp.StatusCode) } @@ -229,7 +229,7 @@ func (b *Backend) openReader(ctx context.Context, h restic.Handle, length int, o return nil, ¬ExistError{h} } - if resp.StatusCode != 200 && resp.StatusCode != 206 { + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent { _ = resp.Body.Close() return nil, errors.Errorf("unexpected HTTP response (%v): %v", resp.StatusCode, resp.Status) } @@ -260,7 +260,7 @@ func (b *Backend) Stat(ctx context.Context, h restic.Handle) (restic.FileInfo, e return restic.FileInfo{}, ¬ExistError{h} } - if resp.StatusCode != 200 { + if resp.StatusCode != http.StatusOK { return restic.FileInfo{}, errors.Errorf("unexpected HTTP response (%v): %v", resp.StatusCode, resp.Status) } @@ -295,7 +295,7 @@ func (b *Backend) Remove(ctx context.Context, h restic.Handle) error { return ¬ExistError{h} } - if resp.StatusCode != 200 { + if resp.StatusCode != http.StatusOK { return errors.Errorf("blob not removed, server response: %v (%v)", resp.Status, resp.StatusCode) } @@ -327,7 +327,12 @@ func (b *Backend) List(ctx context.Context, t restic.FileType, fn func(restic.Fi return errors.Wrap(err, "List") } - if resp.StatusCode != 200 { + if resp.StatusCode == http.StatusNotFound { + // ignore missing directories + return nil + } + + if resp.StatusCode != http.StatusOK { return errors.Errorf("List failed, server response: %v (%v)", resp.Status, resp.StatusCode) }