From f0e2f3ae36786e5e69f34fdaff106223ddba6082 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sat, 18 Jul 2020 16:57:21 -0700 Subject: [PATCH] fix: removing lifecycle properly (#1344) --- .github/workflows/go-windows.yml | 2 +- .github/workflows/go.yml | 2 +- api-bucket-lifecycle.go | 8 ++++---- api-bucket-notification.go | 4 ++-- api-bucket-policy.go | 6 +++--- api-bucket-replication.go | 2 +- api-bucket-versioning.go | 2 +- api-compose-object.go | 6 +++--- api-get-object-acl.go | 2 +- api-get-object.go | 2 +- api-list.go | 12 ++++++------ api-object-legal-hold.go | 4 ++-- api-object-lock.go | 4 ++-- api-object-retention.go | 4 ++-- api-object-tagging.go | 6 +++--- api-presigned.go | 6 +++--- api-put-bucket.go | 2 +- api-put-object-multipart.go | 6 +++--- api-put-object-streaming.go | 2 +- api-remove.go | 6 +++--- api-select.go | 2 +- api-stat.go | 4 ++-- api.go | 6 +++--- bucket-cache.go | 2 +- bucket-cache_test.go | 2 +- pkg/credentials/assume_role.go | 2 +- pkg/credentials/iam_aws.go | 6 +++--- pkg/credentials/sts_client_grants.go | 2 +- pkg/credentials/sts_ldap_identity.go | 2 +- pkg/credentials/sts_web_identity.go | 2 +- pkg/lifecycle/lifecycle.go | 8 ++++++++ pkg/signer/request-signature-streaming_test.go | 7 ++++--- pkg/signer/request-signature-v4_test.go | 2 +- pkg/signer/request-signature_test.go | 4 ++-- pkg/signer/test-utils_test.go | 4 ++-- 35 files changed, 76 insertions(+), 67 deletions(-) diff --git a/.github/workflows/go-windows.yml b/.github/workflows/go-windows.yml index 91d240691..7a592ce14 100644 --- a/.github/workflows/go-windows.yml +++ b/.github/workflows/go-windows.yml @@ -39,7 +39,7 @@ jobs: run: | New-Item -ItemType Directory -Path "$env:temp/certs-dir" Copy-Item -Path testcerts\* -Destination "$env:temp/certs-dir" - Invoke-WebRequest -Uri https://dl.minio.io/server/minio/release/windows-amd64/minio.exe -OutFile $HOME/minio.exe + Invoke-WebRequest -Uri https://dl.minio.io/server/minio/release/windows-amd64/archive/minio.RELEASE.2020-07-14T19-14-30Z -OutFile $HOME/minio.exe Start-Process -NoNewWindow -FilePath "$HOME/minio.exe" -ArgumentList "-S", "$env:temp/certs-dir", "server", "$env:temp/fs{1...4}" $env:SSL_CERT_FILE = "$env:temp/certs-dir/public.crt" go run functional_tests.go diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index ccc2a235c..04d8ee408 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -39,7 +39,7 @@ jobs: SSL_CERT_FILE: /tmp/certs-dir/public.crt run: | sudo apt-get install devscripts - wget -O /tmp/minio https://dl.min.io/server/minio/release/linux-amd64/minio + wget -O /tmp/minio https://dl.minio.io/server/minio/release/linux-amd64/archive/minio.RELEASE.2020-07-14T19-14-30Z chmod +x /tmp/minio mkdir -p /tmp/certs-dir cp testcerts/* /tmp/certs-dir diff --git a/api-bucket-lifecycle.go b/api-bucket-lifecycle.go index daaceb52f..e1fac813c 100644 --- a/api-bucket-lifecycle.go +++ b/api-bucket-lifecycle.go @@ -37,7 +37,7 @@ func (c Client) SetBucketLifecycle(ctx context.Context, bucketName string, confi } // If lifecycle is empty then delete it. - if config == nil { + if config.Empty() { return c.removeBucketLifecycle(ctx, bucketName) } @@ -67,7 +67,7 @@ func (c Client) putBucketLifecycle(ctx context.Context, bucketName string, buf [ } // Execute PUT to upload a new bucket lifecycle. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err @@ -88,7 +88,7 @@ func (c Client) removeBucketLifecycle(ctx context.Context, bucketName string) er urlValues.Set("lifecycle", "") // Execute DELETE on objectName. - resp, err := c.executeMethod(ctx, "DELETE", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, @@ -127,7 +127,7 @@ func (c Client) getBucketLifecycle(ctx context.Context, bucketName string) ([]by urlValues.Set("lifecycle", "") // Execute GET on bucket to get lifecycle. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, }) diff --git a/api-bucket-notification.go b/api-bucket-notification.go index 1053cbae5..76787ecab 100644 --- a/api-bucket-notification.go +++ b/api-bucket-notification.go @@ -59,7 +59,7 @@ func (c Client) SetBucketNotification(ctx context.Context, bucketName string, co } // Execute PUT to upload a new bucket notification. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err @@ -92,7 +92,7 @@ func (c Client) getBucketNotification(ctx context.Context, bucketName string) (n urlValues.Set("notification", "") // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, diff --git a/api-bucket-policy.go b/api-bucket-policy.go index 8b3a20034..72676f344 100644 --- a/api-bucket-policy.go +++ b/api-bucket-policy.go @@ -57,7 +57,7 @@ func (c Client) putBucketPolicy(ctx context.Context, bucketName, policy string) } // Execute PUT to upload a new bucket policy. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err @@ -78,7 +78,7 @@ func (c Client) removeBucketPolicy(ctx context.Context, bucketName string) error urlValues.Set("policy", "") // Execute DELETE on objectName. - resp, err := c.executeMethod(ctx, "DELETE", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, @@ -115,7 +115,7 @@ func (c Client) getBucketPolicy(ctx context.Context, bucketName string) (string, urlValues.Set("policy", "") // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, diff --git a/api-bucket-replication.go b/api-bucket-replication.go index 116a17ee1..bfd5ea436 100644 --- a/api-bucket-replication.go +++ b/api-bucket-replication.go @@ -127,7 +127,7 @@ func (c Client) getBucketReplication(ctx context.Context, bucketName string) (cf urlValues.Set("replication", "") // Execute GET on bucket to get replication config. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, }) diff --git a/api-bucket-versioning.go b/api-bucket-versioning.go index c521e4870..0889d43b0 100644 --- a/api-bucket-versioning.go +++ b/api-bucket-versioning.go @@ -53,7 +53,7 @@ func (c Client) SetBucketVersioning(ctx context.Context, bucketName string, conf } // Execute PUT to set a bucket versioning. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err diff --git a/api-compose-object.go b/api-compose-object.go index 421850a1d..cb2e899e5 100644 --- a/api-compose-object.go +++ b/api-compose-object.go @@ -215,7 +215,7 @@ func (c Client) copyObjectDo(ctx context.Context, srcBucket, srcObject, destBuck headers.Set("x-amz-copy-source", s3utils.EncodePath(srcBucket+"/"+srcObject)) // Send upload-part-copy request - resp, err := c.executeMethod(ctx, "PUT", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodPut, requestMetadata{ bucketName: destBucket, objectName: destObject, customHeader: headers, @@ -268,7 +268,7 @@ func (c Client) copyObjectPartDo(ctx context.Context, srcBucket, srcObject, dest queryValues.Set("partNumber", strconv.Itoa(partID)) queryValues.Set("uploadId", uploadID) - resp, err := c.executeMethod(ctx, "PUT", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodPut, requestMetadata{ bucketName: destBucket, objectName: destObject, customHeader: headers, @@ -306,7 +306,7 @@ func (c Client) uploadPartCopy(ctx context.Context, bucket, object, uploadID str urlValues.Set("uploadId", uploadID) // Send upload-part-copy request - resp, err := c.executeMethod(ctx, "PUT", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodPut, requestMetadata{ bucketName: bucket, objectName: object, customHeader: headers, diff --git a/api-get-object-acl.go b/api-get-object-acl.go index 86a30bb73..afa53079d 100644 --- a/api-get-object-acl.go +++ b/api-get-object-acl.go @@ -42,7 +42,7 @@ type accessControlPolicy struct { // GetObjectACL get object ACLs func (c Client) GetObjectACL(ctx context.Context, bucketName, objectName string) (*ObjectInfo, error) { - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: url.Values{ diff --git a/api-get-object.go b/api-get-object.go index 78147a97a..ac9bbdbe0 100644 --- a/api-get-object.go +++ b/api-get-object.go @@ -619,7 +619,7 @@ func (c Client) getObject(ctx context.Context, bucketName, objectName string, op } // Execute GET on objectName. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api-list.go b/api-list.go index 784542416..7996c11e9 100644 --- a/api-list.go +++ b/api-list.go @@ -38,7 +38,7 @@ import ( // func (c Client) ListBuckets(ctx context.Context) ([]BucketInfo, error) { // Execute GET on service. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{contentSHA256Hex: emptySHA256Hex}) + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{contentSHA256Hex: emptySHA256Hex}) defer closeResponse(resp) if err != nil { return nil, err @@ -198,7 +198,7 @@ func (c Client) listObjectsV2Query(ctx context.Context, bucketName, objectPrefix } // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, @@ -479,7 +479,7 @@ func (c Client) listObjectVersionsQuery(ctx context.Context, bucketName, prefix, urlValues.Set("encoding-type", "url") // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, @@ -567,7 +567,7 @@ func (c Client) listObjectsQuery(ctx context.Context, bucketName, objectPrefix, urlValues.Set("encoding-type", "url") // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, @@ -795,7 +795,7 @@ func (c Client) listMultipartUploadsQuery(ctx context.Context, bucketName, keyMa } // Execute GET on bucketName to list multipart uploads. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, @@ -915,7 +915,7 @@ func (c Client) listObjectPartsQuery(ctx context.Context, bucketName, objectName } // Execute GET on objectName to get list of parts. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api-object-legal-hold.go b/api-object-legal-hold.go index 8dbf4b04c..b139c1687 100644 --- a/api-object-legal-hold.go +++ b/api-object-legal-hold.go @@ -121,7 +121,7 @@ func (c Client) PutObjectLegalHold(ctx context.Context, bucketName, objectName s } // Execute PUT Object Legal Hold. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err @@ -152,7 +152,7 @@ func (c Client) GetObjectLegalHold(ctx context.Context, bucketName, objectName s } // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api-object-lock.go b/api-object-lock.go index 4b5f72dc2..29f52b054 100644 --- a/api-object-lock.go +++ b/api-object-lock.go @@ -170,7 +170,7 @@ func (c Client) SetBucketObjectLockConfig(ctx context.Context, bucketName string } // Execute PUT bucket object lock configuration. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err @@ -194,7 +194,7 @@ func (c Client) GetObjectLockConfig(ctx context.Context, bucketName string) (obj urlValues.Set("object-lock", "") // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, queryValues: urlValues, contentSHA256Hex: emptySHA256Hex, diff --git a/api-object-retention.go b/api-object-retention.go index 0b85b6d27..54f2762de 100644 --- a/api-object-retention.go +++ b/api-object-retention.go @@ -112,7 +112,7 @@ func (c Client) PutObjectRetention(ctx context.Context, bucketName, objectName s } // Execute PUT Object Retention. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err @@ -141,7 +141,7 @@ func (c Client) GetObjectRetention(ctx context.Context, bucketName, objectName, urlValues.Set("versionId", versionID) } // Execute GET on bucket to list objects. - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api-object-tagging.go b/api-object-tagging.go index ad0775870..2709efcd1 100644 --- a/api-object-tagging.go +++ b/api-object-tagging.go @@ -66,7 +66,7 @@ func (c Client) PutObjectTagging(ctx context.Context, bucketName, objectName str } // Execute PUT to set a object tagging. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err @@ -98,7 +98,7 @@ func (c Client) GetObjectTagging(ctx context.Context, bucketName, objectName str } // Execute GET on object to get object tag(s) - resp, err := c.executeMethod(ctx, "GET", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodGet, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, @@ -136,7 +136,7 @@ func (c Client) RemoveObjectTagging(ctx context.Context, bucketName, objectName } // Execute DELETE on object to remove object tag(s) - resp, err := c.executeMethod(ctx, "DELETE", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api-presigned.go b/api-presigned.go index c06a4fe7d..80c363da5 100644 --- a/api-presigned.go +++ b/api-presigned.go @@ -69,7 +69,7 @@ func (c Client) PresignedGetObject(ctx context.Context, bucketName string, objec if err = s3utils.CheckValidObjectName(objectName); err != nil { return nil, err } - return c.presignURL(ctx, "GET", bucketName, objectName, expires, reqParams) + return c.presignURL(ctx, http.MethodGet, bucketName, objectName, expires, reqParams) } // PresignedHeadObject - Returns a presigned URL to access @@ -80,7 +80,7 @@ func (c Client) PresignedHeadObject(ctx context.Context, bucketName string, obje if err = s3utils.CheckValidObjectName(objectName); err != nil { return nil, err } - return c.presignURL(ctx, "HEAD", bucketName, objectName, expires, reqParams) + return c.presignURL(ctx, http.MethodHead, bucketName, objectName, expires, reqParams) } // PresignedPutObject - Returns a presigned URL to upload an object @@ -90,7 +90,7 @@ func (c Client) PresignedPutObject(ctx context.Context, bucketName string, objec if err = s3utils.CheckValidObjectName(objectName); err != nil { return nil, err } - return c.presignURL(ctx, "PUT", bucketName, objectName, expires, nil) + return c.presignURL(ctx, http.MethodPut, bucketName, objectName, expires, nil) } // Presign - returns a presigned URL for any http method of your choice diff --git a/api-put-bucket.go b/api-put-bucket.go index d8b644328..df9fe98af 100644 --- a/api-put-bucket.go +++ b/api-put-bucket.go @@ -87,7 +87,7 @@ func (c Client) doMakeBucket(ctx context.Context, bucketName string, location st } // Execute PUT to create a new bucket. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return err diff --git a/api-put-object-multipart.go b/api-put-object-multipart.go index 5d8da15a8..25e633fcf 100644 --- a/api-put-object-multipart.go +++ b/api-put-object-multipart.go @@ -208,7 +208,7 @@ func (c Client) initiateMultipartUpload(ctx context.Context, bucketName, objectN } // Execute POST on an objectName to initiate multipart upload. - resp, err := c.executeMethod(ctx, "POST", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPost, reqMetadata) defer closeResponse(resp) if err != nil { return initiateMultipartUploadResult{}, err @@ -279,7 +279,7 @@ func (c Client) uploadPart(ctx context.Context, bucketName, objectName, uploadID } // Execute PUT on each part. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return ObjectPart{}, err @@ -330,7 +330,7 @@ func (c Client) completeMultipartUpload(ctx context.Context, bucketName, objectN } // Execute POST to complete multipart upload for an objectName. - resp, err := c.executeMethod(ctx, "POST", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPost, reqMetadata) defer closeResponse(resp) if err != nil { return UploadInfo{}, err diff --git a/api-put-object-streaming.go b/api-put-object-streaming.go index 98c289d7b..144dbb67e 100644 --- a/api-put-object-streaming.go +++ b/api-put-object-streaming.go @@ -443,7 +443,7 @@ func (c Client) putObjectDo(ctx context.Context, bucketName, objectName string, reqMetadata.queryValues = urlValues } // Execute PUT an objectName. - resp, err := c.executeMethod(ctx, "PUT", reqMetadata) + resp, err := c.executeMethod(ctx, http.MethodPut, reqMetadata) defer closeResponse(resp) if err != nil { return UploadInfo{}, err diff --git a/api-remove.go b/api-remove.go index 681b3fc55..6c2ab7802 100644 --- a/api-remove.go +++ b/api-remove.go @@ -38,7 +38,7 @@ func (c Client) RemoveBucket(ctx context.Context, bucketName string) error { return err } // Execute DELETE on bucket. - resp, err := c.executeMethod(ctx, "DELETE", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ bucketName: bucketName, contentSHA256Hex: emptySHA256Hex, }) @@ -90,7 +90,7 @@ func (c Client) RemoveObject(ctx context.Context, bucketName, objectName string, headers.Set(amzBypassGovernance, "true") } // Execute DELETE on objectName. - resp, err := c.executeMethod(ctx, "DELETE", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ bucketName: bucketName, objectName: objectName, contentSHA256Hex: emptySHA256Hex, @@ -308,7 +308,7 @@ func (c Client) abortMultipartUpload(ctx context.Context, bucketName, objectName urlValues.Set("uploadId", uploadID) // Execute DELETE on multipart upload. - resp, err := c.executeMethod(ctx, "DELETE", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodDelete, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api-select.go b/api-select.go index be74fa353..340fa5299 100644 --- a/api-select.go +++ b/api-select.go @@ -450,7 +450,7 @@ func (c Client) SelectObjectContent(ctx context.Context, bucketName, objectName urlValues.Set("select-type", "2") // Execute POST on bucket/object. - resp, err := c.executeMethod(ctx, "POST", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodPost, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api-stat.go b/api-stat.go index 0cdac7e71..ea9c30970 100644 --- a/api-stat.go +++ b/api-stat.go @@ -34,7 +34,7 @@ func (c Client) BucketExists(ctx context.Context, bucketName string) (bool, erro } // Execute HEAD on bucketName. - resp, err := c.executeMethod(ctx, "HEAD", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodHead, requestMetadata{ bucketName: bucketName, contentSHA256Hex: emptySHA256Hex, }) @@ -85,7 +85,7 @@ func (c Client) statObject(ctx context.Context, bucketName, objectName string, o } // Execute HEAD on objectName. - resp, err := c.executeMethod(ctx, "HEAD", requestMetadata{ + resp, err := c.executeMethod(ctx, http.MethodHead, requestMetadata{ bucketName: bucketName, objectName: objectName, queryValues: urlValues, diff --git a/api.go b/api.go index cd14a5fda..f3d9929fc 100644 --- a/api.go +++ b/api.go @@ -679,7 +679,7 @@ func (c Client) executeMethod(ctx context.Context, method string, metadata reque func (c Client) newRequest(ctx context.Context, method string, metadata requestMetadata) (req *http.Request, err error) { // If no method is supplied default to 'POST'. if method == "" { - method = "POST" + method = http.MethodPost } location := metadata.bucketLocation @@ -699,7 +699,7 @@ func (c Client) newRequest(ctx context.Context, method string, metadata requestM // Look if target url supports virtual host. // We explicitly disallow MakeBucket calls to not use virtual DNS style, // since the resolution may fail. - isMakeBucket := (metadata.objectName == "" && method == "PUT" && len(metadata.queryValues) == 0) + isMakeBucket := (metadata.objectName == "" && method == http.MethodPut && len(metadata.queryValues) == 0) isVirtualHost := c.isVirtualHostStyleRequest(*c.endpointURL, metadata.bucketName) && !isMakeBucket // Construct a new target URL. @@ -793,7 +793,7 @@ func (c Client) newRequest(ctx context.Context, method string, metadata requestM case signerType.IsV2(): // Add signature version '2' authorization header. req = signer.SignV2(*req, accessKeyID, secretAccessKey, isVirtualHost) - case metadata.objectName != "" && metadata.queryValues == nil && method == "PUT" && metadata.customHeader.Get("X-Amz-Copy-Source") == "" && !c.secure: + case metadata.objectName != "" && metadata.queryValues == nil && method == http.MethodPut && metadata.customHeader.Get("X-Amz-Copy-Source") == "" && !c.secure: // Streaming signature is used by default for a PUT object request. Additionally we also // look if the initialized client is secure, if yes then we don't need to perform // streaming signature. diff --git a/bucket-cache.go b/bucket-cache.go index d60994424..7d485a6b1 100644 --- a/bucket-cache.go +++ b/bucket-cache.go @@ -198,7 +198,7 @@ func (c Client) getBucketLocationRequest(bucketName string) (*http.Request, erro } // Get a new HTTP request for the method. - req, err := http.NewRequest("GET", urlStr, nil) + req, err := http.NewRequest(http.MethodGet, urlStr, nil) if err != nil { return nil, err } diff --git a/bucket-cache_test.go b/bucket-cache_test.go index d70a08515..b95857b36 100644 --- a/bucket-cache_test.go +++ b/bucket-cache_test.go @@ -78,7 +78,7 @@ func TestGetBucketLocationRequest(t *testing.T) { targetURL.RawQuery = urlValues.Encode() // Get a new HTTP request for the method. - req, err := http.NewRequest("GET", targetURL.String(), nil) + req, err := http.NewRequest(http.MethodGet, targetURL.String(), nil) if err != nil { return nil, err } diff --git a/pkg/credentials/assume_role.go b/pkg/credentials/assume_role.go index 7456211e7..cc88a9ab6 100644 --- a/pkg/credentials/assume_role.go +++ b/pkg/credentials/assume_role.go @@ -170,7 +170,7 @@ func getAssumeRoleCredentials(clnt *http.Client, endpoint string, opts STSAssume } postBody.Seek(0, 0) - req, err := http.NewRequest("POST", u.String(), postBody) + req, err := http.NewRequest(http.MethodPost, u.String(), postBody) if err != nil { return AssumeRoleResponse{}, err } diff --git a/pkg/credentials/iam_aws.go b/pkg/credentials/iam_aws.go index 25135e2c9..ceeab84dd 100644 --- a/pkg/credentials/iam_aws.go +++ b/pkg/credentials/iam_aws.go @@ -190,7 +190,7 @@ func getIAMRoleURL(endpoint string) (*url.URL, error) { // or there is an error making or receiving the request. // http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html func listRoleNames(client *http.Client, u *url.URL) ([]string, error) { - req, err := http.NewRequest("GET", u.String(), nil) + req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return nil, err } @@ -217,7 +217,7 @@ func listRoleNames(client *http.Client, u *url.URL) ([]string, error) { } func getEcsTaskCredentials(client *http.Client, endpoint string) (ec2RoleCredRespBody, error) { - req, err := http.NewRequest("GET", endpoint, nil) + req, err := http.NewRequest(http.MethodGet, endpoint, nil) if err != nil { return ec2RoleCredRespBody{}, err } @@ -273,7 +273,7 @@ func getCredentials(client *http.Client, endpoint string) (ec2RoleCredRespBody, // $ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access // u.Path = path.Join(u.Path, roleName) - req, err := http.NewRequest("GET", u.String(), nil) + req, err := http.NewRequest(http.MethodGet, u.String(), nil) if err != nil { return ec2RoleCredRespBody{}, err } diff --git a/pkg/credentials/sts_client_grants.go b/pkg/credentials/sts_client_grants.go index 03134c3d2..e89d5d4d8 100644 --- a/pkg/credentials/sts_client_grants.go +++ b/pkg/credentials/sts_client_grants.go @@ -122,7 +122,7 @@ func getClientGrantsCredentials(clnt *http.Client, endpoint string, } u.RawQuery = v.Encode() - req, err := http.NewRequest("POST", u.String(), nil) + req, err := http.NewRequest(http.MethodPost, u.String(), nil) if err != nil { return AssumeRoleWithClientGrantsResponse{}, err } diff --git a/pkg/credentials/sts_ldap_identity.go b/pkg/credentials/sts_ldap_identity.go index b72ac061c..abbf61641 100644 --- a/pkg/credentials/sts_ldap_identity.go +++ b/pkg/credentials/sts_ldap_identity.go @@ -85,7 +85,7 @@ func (k *LDAPIdentity) Retrieve() (value Value, err error) { u.RawQuery = v.Encode() - req, kerr := http.NewRequest("POST", u.String(), nil) + req, kerr := http.NewRequest(http.MethodPost, u.String(), nil) if kerr != nil { err = kerr return diff --git a/pkg/credentials/sts_web_identity.go b/pkg/credentials/sts_web_identity.go index a197161a3..5a5f6405e 100644 --- a/pkg/credentials/sts_web_identity.go +++ b/pkg/credentials/sts_web_identity.go @@ -133,7 +133,7 @@ func getWebIdentityCredentials(clnt *http.Client, endpoint, roleARN, roleSession u.RawQuery = v.Encode() - req, err := http.NewRequest("POST", u.String(), nil) + req, err := http.NewRequest(http.MethodPost, u.String(), nil) if err != nil { return AssumeRoleWithWebIdentityResponse{}, err } diff --git a/pkg/lifecycle/lifecycle.go b/pkg/lifecycle/lifecycle.go index 0a6f822af..4dfa110e6 100644 --- a/pkg/lifecycle/lifecycle.go +++ b/pkg/lifecycle/lifecycle.go @@ -266,6 +266,14 @@ type Configuration struct { Rules []Rule `xml:"Rule"` } +// Empty check if lifecycle configuration is empty +func (c *Configuration) Empty() bool { + if c == nil { + return true + } + return len(c.Rules) == 0 +} + // NewConfiguration initializes a fresh lifecycle configuration // for manipulation, such as setting and removing lifecycle rules // and filters. diff --git a/pkg/signer/request-signature-streaming_test.go b/pkg/signer/request-signature-streaming_test.go index 4ee08b4a0..43b614ee8 100644 --- a/pkg/signer/request-signature-streaming_test.go +++ b/pkg/signer/request-signature-streaming_test.go @@ -20,6 +20,7 @@ package signer import ( "bytes" "io/ioutil" + "net/http" "testing" "time" ) @@ -31,7 +32,7 @@ func TestGetSeedSignature(t *testing.T) { data := bytes.Repeat([]byte("a"), dataLen) body := ioutil.NopCloser(bytes.NewReader(data)) - req := NewRequest("PUT", "/examplebucket/chunkObject.txt", body) + req := NewRequest(http.MethodPut, "/examplebucket/chunkObject.txt", body) req.Header.Set("x-amz-storage-class", "REDUCED_REDUNDANCY") req.Host = "s3.amazonaws.com" @@ -67,7 +68,7 @@ func TestSetStreamingAuthorization(t *testing.T) { secretAccessKeyID := "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" accessKeyID := "AKIAIOSFODNN7EXAMPLE" - req := NewRequest("PUT", "/examplebucket/chunkObject.txt", nil) + req := NewRequest(http.MethodPut, "/examplebucket/chunkObject.txt", nil) req.Header.Set("x-amz-storage-class", "REDUCED_REDUNDANCY") req.Host = "" req.URL.Host = "s3.amazonaws.com" @@ -91,7 +92,7 @@ func TestStreamingReader(t *testing.T) { accessKeyID := "AKIAIOSFODNN7EXAMPLE" dataLen := int64(65 * 1024) - req := NewRequest("PUT", "/examplebucket/chunkObject.txt", nil) + req := NewRequest(http.MethodPut, "/examplebucket/chunkObject.txt", nil) req.Header.Set("x-amz-storage-class", "REDUCED_REDUNDANCY") req.ContentLength = 65 * 1024 req.Host = "" diff --git a/pkg/signer/request-signature-v4_test.go b/pkg/signer/request-signature-v4_test.go index 96e33286f..c67a47230 100644 --- a/pkg/signer/request-signature-v4_test.go +++ b/pkg/signer/request-signature-v4_test.go @@ -38,7 +38,7 @@ func TestRequestHost(t *testing.T) { func buildRequest(serviceName, region, body string) (*http.Request, io.ReadSeeker) { endpoint := "https://" + serviceName + "." + region + ".amazonaws.com" reader := strings.NewReader(body) - req, _ := http.NewRequest("POST", endpoint, reader) + req, _ := http.NewRequest(http.MethodPost, endpoint, reader) req.URL.Opaque = "//example.org/bucket/key-._~,!@#$%^&*()" req.Header.Add("X-Amz-Target", "prefix.Operation") req.Header.Add("Content-Type", "application/x-amz-json-1.0") diff --git a/pkg/signer/request-signature_test.go b/pkg/signer/request-signature_test.go index cc14bc4c9..3709160a3 100644 --- a/pkg/signer/request-signature_test.go +++ b/pkg/signer/request-signature_test.go @@ -25,7 +25,7 @@ import ( // Tests signature calculation. func TestSignatureCalculationV4(t *testing.T) { - req, err := http.NewRequest("GET", "https://s3.amazonaws.com", nil) + req, err := http.NewRequest(http.MethodGet, "https://s3.amazonaws.com", nil) if err != nil { t.Fatal("Error:", err) } @@ -61,7 +61,7 @@ func TestSignatureCalculationV2(t *testing.T) { } for i, testCase := range testCases { - req, err := http.NewRequest("GET", testCase.endpointURL, nil) + req, err := http.NewRequest(http.MethodGet, testCase.endpointURL, nil) if err != nil { t.Fatalf("Test %d, Error: %v", i+1, err) } diff --git a/pkg/signer/test-utils_test.go b/pkg/signer/test-utils_test.go index 56ba5727b..c39ab83bc 100644 --- a/pkg/signer/test-utils_test.go +++ b/pkg/signer/test-utils_test.go @@ -43,7 +43,7 @@ import ( // // The Request.Proto is always HTTP/1.1. // -// An empty method means "GET". +// An empty method means http.MethodGet. // // The provided body may be nil. If the body is of type *bytes.Reader, // *strings.Reader, or *bytes.Buffer, the Request.ContentLength is @@ -53,7 +53,7 @@ import ( // panic is acceptable. func NewRequest(method, target string, body io.Reader) *http.Request { if method == "" { - method = "GET" + method = http.MethodGet } req, err := http.ReadRequest(bufio.NewReader(strings.NewReader(method + " " + target + " HTTP/1.0\r\n\r\n"))) if err != nil {