Skip to content

Instantly share code, notes, and snippets.

@charleswhchan
Created June 27, 2020 22:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save charleswhchan/31516dd54b41986a4a90e1772d0c9db1 to your computer and use it in GitHub Desktop.
Save charleswhchan/31516dd54b41986a4a90e1772d0c9db1 to your computer and use it in GitHub Desktop.
Program to reproduce localstack issue #2562
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