From 694d390710a14304750897c5282d5b1f324a9559 Mon Sep 17 00:00:00 2001 From: Jakub Gedeon Date: Tue, 23 Feb 2016 18:58:55 -0700 Subject: [PATCH] s3: Check if directory exists during Mkdir If you dont have privs to create a bucket in S3 but it exists, don't fail with an auth error, but detect that the mkdir was not needed and return successfully. --- s3/s3.go | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/s3/s3.go b/s3/s3.go index 5dbbd3470..53eabd3be 100644 --- a/s3/s3.go +++ b/s3/s3.go @@ -505,8 +505,29 @@ func (f *Fs) Put(in io.Reader, src fs.ObjectInfo) (fs.Object, error) { return fs, fs.Update(in, src) } +// Check if the bucket exists +func (f *Fs) dirExists() (bool, error) { + req := s3.HeadBucketInput{ + Bucket: &f.bucket, + } + _, err := f.c.HeadBucket(&req) + if err == nil { + return true, nil + } + if err, ok := err.(awserr.RequestFailure); ok { + if err.StatusCode() == http.StatusNotFound { + return false, nil + } + } + return false, err +} + // Mkdir creates the bucket if it doesn't exist func (f *Fs) Mkdir() error { + exists, err := f.dirExists() + if err != nil || exists { + return err + } req := s3.CreateBucketInput{ Bucket: &f.bucket, ACL: &f.perm, @@ -516,7 +537,7 @@ func (f *Fs) Mkdir() error { LocationConstraint: &f.locationConstraint, } } - _, err := f.c.CreateBucket(&req) + _, err = f.c.CreateBucket(&req) if err, ok := err.(awserr.Error); ok { if err.Code() == "BucketAlreadyOwnedByYou" { return nil