Skip to content

Commit

Permalink
feat: support for metadata-directive (#12)
Browse files Browse the repository at this point in the history
* feat: extend metadata flags

* chore: update tests

* chore: remove debug print

* fix: remove unnecessary check
  • Loading branch information
denizsurmeli authored Sep 26, 2023
1 parent 1ca51e0 commit 48eeac9
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 5 deletions.
9 changes: 8 additions & 1 deletion gofakes3.go
Original file line number Diff line number Diff line change
Expand Up @@ -578,8 +578,15 @@ func (g *GoFakeS3) createObject(bucket, object string, w http.ResponseWriter, r
if err != nil {
return err
}
size = src.Size

if meta["X-Amz-Metadata-Directive"] == "COPY" {
meta = src.Metadata
}

// this is not actually a part of the metadata
delete(src.Metadata, "X-Amz-Metadata-Directive")

size = src.Size
body = src.Contents

} else {
Expand Down
59 changes: 55 additions & 4 deletions gofakes3_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -308,20 +308,23 @@ func TestCopyObject(t *testing.T) {
svc := ts.s3Client()

srcMeta := map[string]string{
"Content-Type": "text/plain",
"X-Amz-Meta-One": "src",
"X-Amz-Meta-Two": "src",
"Content-Type": "text/plain",
"X-Amz-Meta-One": "src",
"X-Amz-Meta-Two": "src",
"X-Amz-Meta-Three": "src",
}

ts.backendPutString(defaultBucket, "src-key", srcMeta, "content")

out, err := svc.CopyObject(&s3.CopyObjectInput{
Bucket: aws.String(defaultBucket),
Key: aws.String("dst-key"),
CopySource: aws.String("/" + defaultBucket + "/src-key"),
CopySource: aws.String(defaultBucket + "/src-key"),
Metadata: map[string]*string{
"Two": aws.String("dst"),
"Three": aws.String("dst"),
},
MetadataDirective: aws.String("COPY"),
})
ts.OK(err)

Expand All @@ -344,6 +347,54 @@ func TestCopyObject(t *testing.T) {
t.Fatalf("bad Content-Type: %q", v)
}

if v := obj.Metadata["X-Amz-Meta-Two"]; v != "src" {
t.Fatalf("bad Content-Encoding: %q", v)
}

if v := obj.Metadata["X-Amz-Meta-Three"]; v != "src" {
t.Fatalf("bad Content-Encoding: %q", v)
}
}

func TestCopyObjectWithReplaceDirective(t *testing.T) {
ts := newTestServer(t)
defer ts.Close()
svc := ts.s3Client()

srcMeta := map[string]string{
"Content-Type": "text/plain",
"X-Amz-Meta-One": "src",
"X-Amz-Meta-Two": "src",
}
ts.backendPutString(defaultBucket, "src-key", srcMeta, "content")

out, err := svc.CopyObject(&s3.CopyObjectInput{
Bucket: aws.String(defaultBucket),
Key: aws.String("dst-key"),
CopySource: aws.String(defaultBucket + "/src-key"),
Metadata: map[string]*string{
"Two": aws.String("dst"),
"Three": aws.String("dst"),
},
MetadataDirective: aws.String("REPLACE"),
})
ts.OK(err)

if *out.CopyObjectResult.ETag != `"9a0364b9e99bb480dd25e1f0284c8555"` { // md5("content")
ts.Fatal("bad etag", *out.CopyObjectResult.ETag)
}

obj, err := ts.backend.GetObject(defaultBucket, "dst-key", nil)
ts.OK(err)

defer obj.Contents.Close()
data, err := ioutil.ReadAll(obj.Contents)
ts.OK(err)

if string(data) != "content" {
t.Fatal("object copying failed")
}

if v := obj.Metadata["X-Amz-Meta-Two"]; v != "dst" {
t.Fatalf("bad Content-Encoding: %q", v)
}
Expand Down

0 comments on commit 48eeac9

Please sign in to comment.