Skip to content

Commit 08b8ef9

Browse files
wip
1 parent d99b5fa commit 08b8ef9

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

aws/awss3/awss3.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,3 +621,23 @@ func SelectCSVHeaders(ctx context.Context, region awsconfig.Region, bucketName B
621621
}
622622
return headers, nil
623623
}
624+
625+
func PresignPutObject(ctx context.Context, region awsconfig.Region, bucketName BucketName, key Key, opts ...s3presigned.OptionS3Presigned) (string, error) {
626+
c := s3presigned.GetS3PresignedConf(opts...)
627+
client, err := GetClient(ctx, region) // nolint:typecheck
628+
if err != nil {
629+
return "", err
630+
}
631+
input := &s3.PutObjectInput{
632+
Bucket: bucketName.AWSString(),
633+
Key: key.AWSString(),
634+
}
635+
ps := s3.NewPresignClient(client)
636+
resp, err := ps.PresignPutObject(ctx, input, func(o *s3.PresignOptions) {
637+
o.Expires = c.PresignExpires
638+
})
639+
if err != nil {
640+
return "", err
641+
}
642+
return resp.URL, nil
643+
}

aws/awss3/awss3_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/csv"
77
"errors"
88
"fmt"
9+
"net/http"
910
"os"
1011
"path/filepath"
1112
"strings"
@@ -994,3 +995,53 @@ func TestSelectCSVHeaders(t *testing.T) {
994995
assert.Error(t, err)
995996
})
996997
}
998+
999+
func TestPresignPutObject(t *testing.T) {
1000+
t.Parallel()
1001+
ctx := ctxawslocal.WithContext(
1002+
context.Background(),
1003+
ctxawslocal.WithS3Endpoint("http://127.0.0.1:29000"), // use Minio
1004+
ctxawslocal.WithAccessKey("DUMMYACCESSKEYEXAMPLE"),
1005+
ctxawslocal.WithSecretAccessKey("DUMMYSECRETKEYEXAMPLE"),
1006+
)
1007+
1008+
uploadTxtByPresignedPutObjectURL := func(presignedURL string) error {
1009+
content := []byte("Hello World")
1010+
req, err := http.NewRequest(http.MethodPut, presignedURL, bytes.NewReader(content))
1011+
if err != nil {
1012+
return err
1013+
}
1014+
1015+
req.Header.Set("Content-Type", "text/plain")
1016+
resp, err := http.DefaultClient.Do(req)
1017+
if err != nil {
1018+
return err
1019+
}
1020+
1021+
defer resp.Body.Close()
1022+
1023+
if resp.StatusCode != http.StatusOK {
1024+
return fmt.Errorf("failed to upload file, status code: %d", resp.StatusCode)
1025+
}
1026+
1027+
return nil
1028+
}
1029+
1030+
confirmedUploadedObject := func(ctx context.Context, key awss3.Key) error {
1031+
_, err := awss3.HeadObject(ctx, TestRegion, TestBucket, key)
1032+
return err
1033+
}
1034+
1035+
t.Run("Presign", func(t *testing.T) {
1036+
t.Parallel()
1037+
key := awss3.Key("test_presign_put_object_01.txt")
1038+
pURL, err := awss3.PresignPutObject(ctx, TestRegion, TestBucket, key)
1039+
assert.NoError(t, err)
1040+
assert.NotEmpty(t, pURL)
1041+
1042+
err = uploadTxtByPresignedPutObjectURL(pURL)
1043+
assert.NoError(t, err)
1044+
err = confirmedUploadedObject(ctx, key)
1045+
assert.NoError(t, err)
1046+
})
1047+
}

0 commit comments

Comments
 (0)