From 7b4d4454a84a9ee40ca65c16b5a785721b970266 Mon Sep 17 00:00:00 2001 From: jyxjjj <773933146@qq.com> Date: Sun, 20 Sep 2026 01:01:01 +0800 Subject: [PATCH] fix(s3): return NoSuchKey for missing copy sources - Translate missing source errors during both CopyObject reads - Add regression coverage for copying a nonexistent source key Co-authored-by: Codex <267193182+codex@users.noreply.github.com> Signed-off-by: jyxjjj <16695261+jyxjjj@users.noreply.github.com> --- server/s3/backend.go | 6 ++++++ server/s3/copy_test.go | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 server/s3/copy_test.go diff --git a/server/s3/backend.go b/server/s3/backend.go index a79dd2285..7acf058d7 100644 --- a/server/s3/backend.go +++ b/server/s3/backend.go @@ -451,11 +451,17 @@ func (b *s3Backend) CopyObject(ctx context.Context, srcBucket, srcKey, dstBucket fmeta, _ := op.GetNearestMeta(srcFp) srcNode, err := fs.Get(context.WithValue(ctx, conf.MetaKey, fmeta), srcFp, &fs.GetArgs{}) if err != nil { + if errs.IsObjectNotFound(err) { + return result, gofakes3.KeyNotFound(srcKey) + } return result, err } c, err := b.GetObject(ctx, srcBucket, srcKey, nil) if err != nil { + if errs.IsObjectNotFound(err) { + return result, gofakes3.KeyNotFound(srcKey) + } return } defer func() { diff --git a/server/s3/copy_test.go b/server/s3/copy_test.go new file mode 100644 index 000000000..b9ba4dadb --- /dev/null +++ b/server/s3/copy_test.go @@ -0,0 +1,17 @@ +package s3 + +import ( + "context" + "testing" + + "github.com/OpenListTeam/gofakes3" +) + +func TestCopyObjectMissingSourceReturnsNoSuchKey(t *testing.T) { + b, _ := setupMultipartBackend(t) + + _, err := b.CopyObject(context.Background(), "mp", "missing.txt", "mp", "copy.txt", nil) + if code := s3ErrorCode(err); code != gofakes3.ErrNoSuchKey { + t.Fatalf("CopyObject() error = %v, want NoSuchKey", code) + } +}