func TestPresignHandler(t *testing.T) { svc := s3.New(unit.Session) req, _ := svc.PutObjectRequest(&s3.PutObjectInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), ContentDisposition: aws.String("a+b c$d"), ACL: aws.String("public-read"), }) req.Time = time.Unix(0, 0) urlstr, err := req.Presign(5 * time.Minute) assert.NoError(t, err) expectedDate := "19700101T000000Z" expectedHeaders := "host;x-amz-acl" expectedSig := "7edcb4e3a1bf12f4989018d75acbe3a7f03df24bd6f3112602d59fc551f0e4e2" expectedCred := "AKID/19700101/mock-region/s3/aws4_request" u, _ := url.Parse(urlstr) urlQ := u.Query() assert.Equal(t, expectedSig, urlQ.Get("X-Amz-Signature")) assert.Equal(t, expectedCred, urlQ.Get("X-Amz-Credential")) assert.Equal(t, expectedHeaders, urlQ.Get("X-Amz-SignedHeaders")) assert.Equal(t, expectedDate, urlQ.Get("X-Amz-Date")) assert.Equal(t, "300", urlQ.Get("X-Amz-Expires")) assert.NotContains(t, urlstr, "+") // + encoded as %20 }
func TestUploadFailCleanup(t *testing.T) { svc := s3.New(session.New()) // Break checksum on 2nd part so it fails part := 0 svc.Handlers.Build.PushBack(func(r *request.Request) { if r.Operation.Name == "UploadPart" { if part == 1 { r.HTTPRequest.Header.Set("X-Amz-Content-Sha256", "000") } part++ } }) key := "12mb-leave" mgr := s3manager.NewUploaderWithClient(svc, func(u *s3manager.Uploader) { u.LeavePartsOnError = false }) _, err := mgr.Upload(&s3manager.UploadInput{ Bucket: bucketName, Key: &key, Body: bytes.NewReader(integBuf12MB), }) assert.Error(t, err) uploadID := "" if merr, ok := err.(s3manager.MultiUploadFailure); ok { uploadID = merr.UploadID() } assert.NotEmpty(t, uploadID) _, err = svc.ListParts(&s3.ListPartsInput{ Bucket: bucketName, Key: &key, UploadId: &uploadID}) assert.Error(t, err) }
func ExampleS3_HeadObject() { svc := s3.New(session.New()) params := &s3.HeadObjectInput{ Bucket: aws.String("BucketName"), // Required Key: aws.String("ObjectKey"), // Required IfMatch: aws.String("IfMatch"), IfModifiedSince: aws.Time(time.Now()), IfNoneMatch: aws.String("IfNoneMatch"), IfUnmodifiedSince: aws.Time(time.Now()), Range: aws.String("Range"), RequestPayer: aws.String("RequestPayer"), SSECustomerAlgorithm: aws.String("SSECustomerAlgorithm"), SSECustomerKey: aws.String("SSECustomerKey"), SSECustomerKeyMD5: aws.String("SSECustomerKeyMD5"), VersionId: aws.String("ObjectVersionId"), } resp, err := svc.HeadObject(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_UploadPartCopy() { svc := s3.New(session.New()) params := &s3.UploadPartCopyInput{ Bucket: aws.String("BucketName"), // Required CopySource: aws.String("CopySource"), // Required Key: aws.String("ObjectKey"), // Required PartNumber: aws.Int64(1), // Required UploadId: aws.String("MultipartUploadId"), // Required CopySourceIfMatch: aws.String("CopySourceIfMatch"), CopySourceIfModifiedSince: aws.Time(time.Now()), CopySourceIfNoneMatch: aws.String("CopySourceIfNoneMatch"), CopySourceIfUnmodifiedSince: aws.Time(time.Now()), CopySourceRange: aws.String("CopySourceRange"), CopySourceSSECustomerAlgorithm: aws.String("CopySourceSSECustomerAlgorithm"), CopySourceSSECustomerKey: aws.String("CopySourceSSECustomerKey"), CopySourceSSECustomerKeyMD5: aws.String("CopySourceSSECustomerKeyMD5"), RequestPayer: aws.String("RequestPayer"), SSECustomerAlgorithm: aws.String("SSECustomerAlgorithm"), SSECustomerKey: aws.String("SSECustomerKey"), SSECustomerKeyMD5: aws.String("SSECustomerKeyMD5"), } resp, err := svc.UploadPartCopy(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_DeleteObjects() { svc := s3.New(session.New()) params := &s3.DeleteObjectsInput{ Bucket: aws.String("BucketName"), // Required Delete: &s3.Delete{ // Required Objects: []*s3.ObjectIdentifier{ // Required { // Required Key: aws.String("ObjectKey"), // Required VersionId: aws.String("ObjectVersionId"), }, // More values... }, Quiet: aws.Bool(true), }, MFA: aws.String("MFA"), RequestPayer: aws.String("RequestPayer"), } resp, err := svc.DeleteObjects(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_PutBucketTagging() { svc := s3.New(session.New()) params := &s3.PutBucketTaggingInput{ Bucket: aws.String("BucketName"), // Required Tagging: &s3.Tagging{ // Required TagSet: []*s3.Tag{ // Required { // Required Key: aws.String("ObjectKey"), // Required Value: aws.String("Value"), // Required }, // More values... }, }, } resp, err := svc.PutBucketTagging(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_UploadPart() { svc := s3.New(session.New()) params := &s3.UploadPartInput{ Bucket: aws.String("BucketName"), // Required Key: aws.String("ObjectKey"), // Required PartNumber: aws.Int64(1), // Required UploadId: aws.String("MultipartUploadId"), // Required Body: bytes.NewReader([]byte("PAYLOAD")), ContentLength: aws.Int64(1), RequestPayer: aws.String("RequestPayer"), SSECustomerAlgorithm: aws.String("SSECustomerAlgorithm"), SSECustomerKey: aws.String("SSECustomerKey"), SSECustomerKeyMD5: aws.String("SSECustomerKeyMD5"), } resp, err := svc.UploadPart(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_PutBucketReplication() { svc := s3.New(session.New()) params := &s3.PutBucketReplicationInput{ Bucket: aws.String("BucketName"), // Required ReplicationConfiguration: &s3.ReplicationConfiguration{ // Required Role: aws.String("Role"), // Required Rules: []*s3.ReplicationRule{ // Required { // Required Destination: &s3.Destination{ // Required Bucket: aws.String("BucketName"), // Required StorageClass: aws.String("StorageClass"), }, Prefix: aws.String("Prefix"), // Required Status: aws.String("ReplicationRuleStatus"), // Required ID: aws.String("ID"), }, // More values... }, }, } resp, err := svc.PutBucketReplication(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_CreateBucket() { svc := s3.New(session.New()) params := &s3.CreateBucketInput{ Bucket: aws.String("BucketName"), // Required ACL: aws.String("BucketCannedACL"), CreateBucketConfiguration: &s3.CreateBucketConfiguration{ LocationConstraint: aws.String("BucketLocationConstraint"), }, GrantFullControl: aws.String("GrantFullControl"), GrantRead: aws.String("GrantRead"), GrantReadACP: aws.String("GrantReadACP"), GrantWrite: aws.String("GrantWrite"), GrantWriteACP: aws.String("GrantWriteACP"), } resp, err := svc.CreateBucket(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func Test200WithErrorUnmarshalError(t *testing.T) { s := s3.New(unit.Session) s.Handlers.Send.Clear() s.Handlers.Send.PushBack(func(r *request.Request) { r.HTTPResponse = &http.Response{ StatusCode: 200, Header: http.Header{"X-Amz-Request-Id": []string{"abc123"}}, Body: ioutil.NopCloser(strings.NewReader(completeMultiErrResp)), ContentLength: -1, } r.HTTPResponse.Status = http.StatusText(r.HTTPResponse.StatusCode) }) _, err := s.CompleteMultipartUpload(&s3.CompleteMultipartUploadInput{ Bucket: aws.String("bucket"), Key: aws.String("key"), UploadId: aws.String("id"), MultipartUpload: &s3.CompletedMultipartUpload{Parts: []*s3.CompletedPart{ {ETag: aws.String("etag"), PartNumber: aws.Int64(1)}, }}, }) assert.Error(t, err) assert.Equal(t, "SomeException", err.(awserr.Error).Code()) assert.Equal(t, "Exception message", err.(awserr.Error).Message()) assert.Equal(t, "abc123", err.(awserr.RequestFailure).RequestID()) }
func ExampleS3_CompleteMultipartUpload() { svc := s3.New(session.New()) params := &s3.CompleteMultipartUploadInput{ Bucket: aws.String("BucketName"), // Required Key: aws.String("ObjectKey"), // Required UploadId: aws.String("MultipartUploadId"), // Required MultipartUpload: &s3.CompletedMultipartUpload{ Parts: []*s3.CompletedPart{ { // Required ETag: aws.String("ETag"), PartNumber: aws.Int64(1), }, // More values... }, }, RequestPayer: aws.String("RequestPayer"), } resp, err := svc.CompleteMultipartUpload(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func TestMD5InPutBucketPolicy(t *testing.T) { svc := s3.New(unit.Session) req, _ := svc.PutBucketPolicyRequest(&s3.PutBucketPolicyInput{ Bucket: aws.String("bucketname"), Policy: aws.String("{}"), }) assertMD5(t, req) }
func TestNoPopulateLocationConstraintIfClassic(t *testing.T) { s := s3.New(unit.Session, &aws.Config{Region: aws.String("us-east-1")}) req, _ := s.CreateBucketRequest(&s3.CreateBucketInput{ Bucket: aws.String("bucket"), }) err := req.Build() assert.NoError(t, err) v, _ := awsutil.ValuesAtPath(req.Params, "CreateBucketConfiguration.LocationConstraint") assert.Equal(t, 0, len(v)) }
func newCopyTestSvc(errMsg string) *s3.S3 { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, errMsg, http.StatusOK) })) return s3.New(unit.Session, aws.NewConfig(). WithEndpoint(server.URL). WithDisableSSL(true). WithMaxRetries(0). WithS3ForcePathStyle(true)) }
func TestMD5InPutBucketTagging(t *testing.T) { svc := s3.New(unit.Session) req, _ := svc.PutBucketTaggingRequest(&s3.PutBucketTaggingInput{ Bucket: aws.String("bucketname"), Tagging: &s3.Tagging{ TagSet: []*s3.Tag{ {Key: aws.String("KEY"), Value: aws.String("VALUE")}, }, }, }) assertMD5(t, req) }
func TestPopulateLocationConstraint(t *testing.T) { s := s3.New(unit.Session) in := &s3.CreateBucketInput{ Bucket: aws.String("bucket"), } req, _ := s.CreateBucketRequest(in) err := req.Build() assert.NoError(t, err) v, _ := awsutil.ValuesAtPath(req.Params, "CreateBucketConfiguration.LocationConstraint") assert.Equal(t, "mock-region", *(v[0].(*string))) assert.Nil(t, in.CreateBucketConfiguration) // don't modify original params }
func TestMD5InDeleteObjects(t *testing.T) { svc := s3.New(unit.Session) req, _ := svc.DeleteObjectsRequest(&s3.DeleteObjectsInput{ Bucket: aws.String("bucketname"), Delete: &s3.Delete{ Objects: []*s3.ObjectIdentifier{ {Key: aws.String("key")}, }, }, }) assertMD5(t, req) }
func TestHostStyleBucketGetBucketLocation(t *testing.T) { s := s3.New(unit.Session) req, _ := s.GetBucketLocationRequest(&s3.GetBucketLocationInput{ Bucket: aws.String("bucket"), }) req.Build() require.NoError(t, req.Error) u, _ := url.Parse(req.HTTPRequest.URL.String()) assert.NotContains(t, u.Host, "bucket") assert.Contains(t, u.Path, "bucket") }
func TestMD5InPutBucketLifecycleConfiguration(t *testing.T) { svc := s3.New(unit.Session) req, _ := svc.PutBucketLifecycleConfigurationRequest(&s3.PutBucketLifecycleConfigurationInput{ Bucket: aws.String("bucketname"), LifecycleConfiguration: &s3.BucketLifecycleConfiguration{ Rules: []*s3.LifecycleRule{ {Prefix: aws.String("prefix"), Status: aws.String(s3.ExpirationStatusEnabled)}, }, }, }) assertMD5(t, req) }
// NewDownloader creates a new Downloader instance to downloads objects from // S3 in concurrent chunks. Pass in additional functional options to customize // the downloader behavior. Requires a client.ConfigProvider in order to create // a S3 service client. The session.Session satisfies the client.ConfigProvider // interface. // // Example: // // The session the S3 Downloader will use // sess := session.New() // // // Create a downloader with the session and default options // downloader := s3manager.NewDownloader(sess) // // // Create a downloader with the session and custom options // downloader := s3manager.NewDownloader(sess, func(d *s3manager.Uploader) { // d.PartSize = 64 * 1024 * 1024 // 64MB per part // }) func NewDownloader(c client.ConfigProvider, options ...func(*Downloader)) *Downloader { d := &Downloader{ S3: s3.New(c), PartSize: DefaultDownloadPartSize, Concurrency: DefaultDownloadConcurrency, } for _, option := range options { option(d) } return d }
func getAccountBuckets(sess *session.Session, bucketCh chan<- *Bucket, owner string) error { svc := s3.New(sess) buckets, err := listBuckets(svc) if err != nil { return fmt.Errorf("failed to list buckets, %v", err) } for _, bucket := range buckets { bucket.Owner = owner if bucket.Error != nil { continue } bckSvc := s3.New(sess, &aws.Config{ Region: aws.String(bucket.Region), Credentials: svc.Config.Credentials, }) bucketDetails(bckSvc, bucket) bucketCh <- bucket } return nil }
func ExampleS3_CopyObject() { svc := s3.New(session.New()) params := &s3.CopyObjectInput{ Bucket: aws.String("BucketName"), // Required CopySource: aws.String("CopySource"), // Required Key: aws.String("ObjectKey"), // Required ACL: aws.String("ObjectCannedACL"), CacheControl: aws.String("CacheControl"), ContentDisposition: aws.String("ContentDisposition"), ContentEncoding: aws.String("ContentEncoding"), ContentLanguage: aws.String("ContentLanguage"), ContentType: aws.String("ContentType"), CopySourceIfMatch: aws.String("CopySourceIfMatch"), CopySourceIfModifiedSince: aws.Time(time.Now()), CopySourceIfNoneMatch: aws.String("CopySourceIfNoneMatch"), CopySourceIfUnmodifiedSince: aws.Time(time.Now()), CopySourceSSECustomerAlgorithm: aws.String("CopySourceSSECustomerAlgorithm"), CopySourceSSECustomerKey: aws.String("CopySourceSSECustomerKey"), CopySourceSSECustomerKeyMD5: aws.String("CopySourceSSECustomerKeyMD5"), Expires: aws.Time(time.Now()), GrantFullControl: aws.String("GrantFullControl"), GrantRead: aws.String("GrantRead"), GrantReadACP: aws.String("GrantReadACP"), GrantWriteACP: aws.String("GrantWriteACP"), Metadata: map[string]*string{ "Key": aws.String("MetadataValue"), // Required // More values... }, MetadataDirective: aws.String("MetadataDirective"), RequestPayer: aws.String("RequestPayer"), SSECustomerAlgorithm: aws.String("SSECustomerAlgorithm"), SSECustomerKey: aws.String("SSECustomerKey"), SSECustomerKeyMD5: aws.String("SSECustomerKeyMD5"), SSEKMSKeyId: aws.String("SSEKMSKeyId"), ServerSideEncryption: aws.String("ServerSideEncryption"), StorageClass: aws.String("StorageClass"), WebsiteRedirectLocation: aws.String("WebsiteRedirectLocation"), } resp, err := svc.CopyObject(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_PutBucketLifecycleConfiguration() { svc := s3.New(session.New()) params := &s3.PutBucketLifecycleConfigurationInput{ Bucket: aws.String("BucketName"), // Required LifecycleConfiguration: &s3.BucketLifecycleConfiguration{ Rules: []*s3.LifecycleRule{ // Required { // Required Prefix: aws.String("Prefix"), // Required Status: aws.String("ExpirationStatus"), // Required Expiration: &s3.LifecycleExpiration{ Date: aws.Time(time.Now()), Days: aws.Int64(1), }, ID: aws.String("ID"), NoncurrentVersionExpiration: &s3.NoncurrentVersionExpiration{ NoncurrentDays: aws.Int64(1), }, NoncurrentVersionTransitions: []*s3.NoncurrentVersionTransition{ { // Required NoncurrentDays: aws.Int64(1), StorageClass: aws.String("TransitionStorageClass"), }, // More values... }, Transitions: []*s3.Transition{ { // Required Date: aws.Time(time.Now()), Days: aws.Int64(1), StorageClass: aws.String("TransitionStorageClass"), }, // More values... }, }, // More values... }, }, } resp, err := svc.PutBucketLifecycleConfiguration(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func TestCopySourceSSECustomerKeyOverHTTPError(t *testing.T) { s := s3.New(unit.Session, &aws.Config{DisableSSL: aws.Bool(true)}) req, _ := s.CopyObjectRequest(&s3.CopyObjectInput{ Bucket: aws.String("bucket"), CopySource: aws.String("bucket/source"), Key: aws.String("dest"), CopySourceSSECustomerKey: aws.String("key"), }) err := req.Build() assert.Error(t, err) assert.Equal(t, "ConfigError", err.(awserr.Error).Code()) assert.Contains(t, err.(awserr.Error).Message(), "cannot send SSE keys over HTTP") }
// NewUploader creates a new Uploader instance to upload objects to S3. Pass In // additional functional options to customize the uploader's behavior. Requires a // client.ConfigProvider in order to create a S3 service client. The session.Session // satisfies the client.ConfigProvider interface. // // Example: // // The session the S3 Uploader will use // sess := session.New() // // // Create an uploader with the session and default options // uploader := s3manager.NewUploader(sess) // // // Create an uploader with the session and custom options // uploader := s3manager.NewUploader(session, func(u *s3manager.Uploader) { // u.PartSize = 64 * 1024 * 1024 // 64MB per part // }) func NewUploader(c client.ConfigProvider, options ...func(*Uploader)) *Uploader { u := &Uploader{ S3: s3.New(c), PartSize: DefaultUploadPartSize, Concurrency: DefaultUploadConcurrency, LeavePartsOnError: false, MaxUploadParts: MaxUploadParts, } for _, option := range options { option(u) } return u }
func TestMD5InPutBucketCors(t *testing.T) { svc := s3.New(unit.Session) req, _ := svc.PutBucketCorsRequest(&s3.PutBucketCorsInput{ Bucket: aws.String("bucketname"), CORSConfiguration: &s3.CORSConfiguration{ CORSRules: []*s3.CORSRule{ { AllowedMethods: []*string{aws.String("GET")}, AllowedOrigins: []*string{aws.String("*")}, }, }, }, }) assertMD5(t, req) }
func ExampleS3_PutBucketNotification() { svc := s3.New(session.New()) params := &s3.PutBucketNotificationInput{ Bucket: aws.String("BucketName"), // Required NotificationConfiguration: &s3.NotificationConfigurationDeprecated{ // Required CloudFunctionConfiguration: &s3.CloudFunctionConfiguration{ CloudFunction: aws.String("CloudFunction"), Event: aws.String("Event"), Events: []*string{ aws.String("Event"), // Required // More values... }, Id: aws.String("NotificationId"), InvocationRole: aws.String("CloudFunctionInvocationRole"), }, QueueConfiguration: &s3.QueueConfigurationDeprecated{ Event: aws.String("Event"), Events: []*string{ aws.String("Event"), // Required // More values... }, Id: aws.String("NotificationId"), Queue: aws.String("QueueArn"), }, TopicConfiguration: &s3.TopicConfigurationDeprecated{ Event: aws.String("Event"), Events: []*string{ aws.String("Event"), // Required // More values... }, Id: aws.String("NotificationId"), Topic: aws.String("TopicArn"), }, }, } resp, err := svc.PutBucketNotification(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func ExampleS3_ListBuckets() { svc := s3.New(session.New()) var params *s3.ListBucketsInput resp, err := svc.ListBuckets(params) if err != nil { // Print the error, cast err to awserr.Error to get the Code and // Message from an error. fmt.Println(err.Error()) return } // Pretty-print the response data. fmt.Println(resp) }
func TestMD5InPutBucketLifecycle(t *testing.T) { svc := s3.New(unit.Session) req, _ := svc.PutBucketLifecycleRequest(&s3.PutBucketLifecycleInput{ Bucket: aws.String("bucketname"), LifecycleConfiguration: &s3.LifecycleConfiguration{ Rules: []*s3.Rule{ { ID: aws.String("ID"), Prefix: aws.String("Prefix"), Status: aws.String("Enabled"), }, }, }, }) assertMD5(t, req) }
func dlLoggingSvcContentRangeTotalAny(data []byte, states []int) (*s3.S3, *[]string) { var m sync.Mutex names := []string{} ranges := []string{} var index int = 0 svc := s3.New(unit.Session) svc.Handlers.Send.Clear() svc.Handlers.Send.PushBack(func(r *request.Request) { m.Lock() defer m.Unlock() names = append(names, r.Operation.Name) ranges = append(ranges, *r.Params.(*s3.GetObjectInput).Range) rerng := regexp.MustCompile(`bytes=(\d+)-(\d+)`) rng := rerng.FindStringSubmatch(r.HTTPRequest.Header.Get("Range")) start, _ := strconv.ParseInt(rng[1], 10, 64) fin, _ := strconv.ParseInt(rng[2], 10, 64) fin++ if fin >= int64(len(data)) { fin = int64(len(data)) } // Setting start and finish to 0 because this state of 1 is suppose to // be an error state of 416 if index == len(states)-1 { start = 0 fin = 0 } bodyBytes := data[start:fin] r.HTTPResponse = &http.Response{ StatusCode: states[index], Body: ioutil.NopCloser(bytes.NewReader(bodyBytes)), Header: http.Header{}, } r.HTTPResponse.Header.Set("Content-Range", fmt.Sprintf("bytes %d-%d/*", start, fin-1)) index++ }) return svc, &names }