Created
June 27, 2020 22:23
-
-
Save charleswhchan/31516dd54b41986a4a90e1772d0c9db1 to your computer and use it in GitHub Desktop.
Program to reproduce localstack issue #2562
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"bytes" | |
"crypto/md5" | |
"encoding/base64" | |
"fmt" | |
"github.com/aws/aws-sdk-go/aws" | |
"github.com/aws/aws-sdk-go/aws/session" | |
"github.com/aws/aws-sdk-go/service/s3" | |
) | |
func testS3MultipartError() error { | |
fmt.Println("NewSession ...") | |
region := "us-east-1" | |
endpoint := "http://localhost:4566" | |
forcePathStyle := true | |
session, err := session.NewSession(&aws.Config{ | |
Endpoint: aws.String(endpoint), | |
Region: aws.String(region), | |
S3ForcePathStyle: aws.Bool(forcePathStyle), | |
}) | |
if err != nil { | |
return err | |
} | |
svc := s3.New(session) | |
bucket := "my-bucket" | |
key := "my-key" | |
data := make([]byte, 1) | |
partNumber := 1 | |
fmt.Printf(" region: %v\n", region) | |
fmt.Printf(" bucket: %v\n", bucket) | |
fmt.Printf(" key: %v\n", key) | |
fmt.Println("CreateBucket ...") | |
_, err = svc.CreateBucket(&s3.CreateBucketInput{ | |
Bucket: aws.String(bucket), | |
}) | |
fmt.Println("CreateMultipartUploadInput ...") | |
createMultipartUploadInput := &s3.CreateMultipartUploadInput{ | |
Bucket: aws.String(bucket), | |
Key: aws.String(key), | |
} | |
fmt.Println("CreateMultipartUpload ...") | |
result, err := svc.CreateMultipartUpload(createMultipartUploadInput) | |
if err != nil { | |
return err | |
} | |
uploadID := *result.UploadId | |
fmt.Println("UploadPartInput ...") | |
fmt.Println("Test #1: BadDigest ---------------------------------------") | |
badChecksum := md5.Sum([]byte("BadDigest")) | |
contentMD5 := base64.StdEncoding.EncodeToString(badChecksum[:]) | |
uploadPartInput := &s3.UploadPartInput{ | |
Body: aws.ReadSeekCloser(bytes.NewReader(data)), | |
Bucket: aws.String(bucket), | |
Key: aws.String(key), | |
ContentMD5: aws.String(contentMD5), | |
PartNumber: aws.Int64(int64(partNumber)), | |
UploadId: aws.String(uploadID), | |
} | |
fmt.Println("UploadPart ...") | |
_, err = svc.UploadPart(uploadPartInput) | |
fmt.Printf("expect BadDigest; actual %+v\n", err) | |
fmt.Println("Test #2: InvalidDigest ---------------------------------------") | |
contentMD5 = "InvalidDigest" | |
uploadPartInput = &s3.UploadPartInput{ | |
Body: aws.ReadSeekCloser(bytes.NewReader(data)), | |
Bucket: aws.String(bucket), | |
Key: aws.String(key), | |
ContentMD5: aws.String(contentMD5), | |
PartNumber: aws.Int64(int64(partNumber)), | |
UploadId: aws.String(uploadID), | |
} | |
fmt.Println("UploadPart ...") | |
_, err = svc.UploadPart(uploadPartInput) | |
fmt.Printf("expect InvalidDigest; actual %+v\n", err) | |
fmt.Println("Test #3: InvalidDigest ---------------------------------------") | |
contentMD5 = "not base64 encoded checksum" | |
uploadPartInput = &s3.UploadPartInput{ | |
Body: aws.ReadSeekCloser(bytes.NewReader(data)), | |
Bucket: aws.String(bucket), | |
Key: aws.String(key), | |
ContentMD5: aws.String(contentMD5), | |
PartNumber: aws.Int64(int64(partNumber)), | |
UploadId: aws.String(uploadID), | |
} | |
fmt.Println("UploadPart ...") | |
_, err = svc.UploadPart(uploadPartInput) | |
fmt.Printf("expect InvalidDigest; actual %+v\n", err) | |
return nil | |
} | |
func main() { | |
err := testS3MultipartError() | |
fmt.Println(err) | |
} | |
/* | |
Output | |
====== | |
$ go run main.go | |
NewSession ... | |
region: us-east-1 | |
bucket: my-bucket | |
key: my-key | |
CreateBucket ... | |
CreateMultipartUploadInput ... | |
CreateMultipartUpload ... | |
UploadPartInput ... | |
Test #1: BadDigest --------------------------------------- | |
UploadPart ... | |
expect BadDigest; actual BadDigest: The Content-MD5 you specified did not match what we received. | |
Test #2: InvalidDigest --------------------------------------- | |
UploadPart ... | |
expect InvalidDigest; actual InvalidDigest: The Content-MD5 you specified is not valid. | |
Test #3: InvalidDigest --------------------------------------- | |
UploadPart ... | |
expect InvalidDigest; actual BadDigest: The Content-MD5 you specified did not match what we received. | |
<nil> | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment