diff options
Diffstat (limited to 'weed/s3api/s3api_bucket_handlers.go')
| -rw-r--r-- | weed/s3api/s3api_bucket_handlers.go | 97 |
1 files changed, 68 insertions, 29 deletions
diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go index 52470e7df..e5d1ec6ad 100644 --- a/weed/s3api/s3api_bucket_handlers.go +++ b/weed/s3api/s3api_bucket_handlers.go @@ -552,25 +552,17 @@ func (s3a *S3ApiServer) PutBucketOwnershipControls(w http.ResponseWriter, r *htt return } - bucketEntry, err := s3a.getEntry(s3a.option.BucketsPath, bucket) - if err != nil { - if err == filer_pb.ErrNotFound { - s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucket) - return - } - s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) + // Check if ownership needs to be updated + currentOwnership, errCode := s3a.getBucketOwnership(bucket) + if errCode != s3err.ErrNone { + s3err.WriteErrorResponse(w, r, errCode) return } - oldOwnership, ok := bucketEntry.Extended[s3_constants.ExtOwnershipKey] - if !ok || string(oldOwnership) != ownership { - if bucketEntry.Extended == nil { - bucketEntry.Extended = make(map[string][]byte) - } - bucketEntry.Extended[s3_constants.ExtOwnershipKey] = []byte(ownership) - err = s3a.updateEntry(s3a.option.BucketsPath, bucketEntry) - if err != nil { - s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) + if currentOwnership != ownership { + errCode = s3a.setBucketOwnership(bucket, ownership) + if errCode != s3err.ErrNone { + s3err.WriteErrorResponse(w, r, errCode) return } } @@ -596,22 +588,15 @@ func (s3a *S3ApiServer) GetBucketOwnershipControls(w http.ResponseWriter, r *htt return } - bucketEntry, err := s3a.getEntry(s3a.option.BucketsPath, bucket) - if err != nil { - if err == filer_pb.ErrNotFound { - s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucket) - return - } - s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) + // Get ownership using new bucket config system + ownership, errCode := s3a.getBucketOwnership(bucket) + if errCode == s3err.ErrNoSuchBucket { + s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucket) return - } - - v, ok := bucketEntry.Extended[s3_constants.ExtOwnershipKey] - if !ok { + } else if errCode != s3err.ErrNone { s3err.WriteErrorResponse(w, r, s3err.OwnershipControlsNotFoundError) return } - ownership := string(v) result := &s3.PutBucketOwnershipControlsInput{ OwnershipControls: &s3.OwnershipControls{ @@ -677,9 +662,63 @@ func (s3a *S3ApiServer) GetBucketVersioningHandler(w http.ResponseWriter, r *htt return } + // Get versioning status using new bucket config system + versioningStatus, errCode := s3a.getBucketVersioningStatus(bucket) + if errCode != s3err.ErrNone { + s3err.WriteErrorResponse(w, r, errCode) + return + } + s3err.WriteAwsXMLResponse(w, r, http.StatusOK, &s3.PutBucketVersioningInput{ VersioningConfiguration: &s3.VersioningConfiguration{ - Status: aws.String(s3.BucketVersioningStatusSuspended), + Status: aws.String(versioningStatus), }, }) } + +// PutBucketVersioningHandler Put bucket Versioning +// https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html +func (s3a *S3ApiServer) PutBucketVersioningHandler(w http.ResponseWriter, r *http.Request) { + bucket, _ := s3_constants.GetBucketAndObject(r) + glog.V(3).Infof("PutBucketVersioning %s", bucket) + + if err := s3a.checkBucket(r, bucket); err != s3err.ErrNone { + s3err.WriteErrorResponse(w, r, err) + return + } + + if r.Body == nil || r.Body == http.NoBody { + s3err.WriteErrorResponse(w, r, s3err.ErrInvalidRequest) + return + } + + var versioningConfig s3.VersioningConfiguration + defer util_http.CloseRequest(r) + + err := xmlutil.UnmarshalXML(&versioningConfig, xml.NewDecoder(r.Body), "") + if err != nil { + glog.Warningf("PutBucketVersioningHandler xml decode: %s", err) + s3err.WriteErrorResponse(w, r, s3err.ErrMalformedXML) + return + } + + if versioningConfig.Status == nil { + s3err.WriteErrorResponse(w, r, s3err.ErrInvalidRequest) + return + } + + status := *versioningConfig.Status + if status != "Enabled" && status != "Suspended" { + s3err.WriteErrorResponse(w, r, s3err.ErrInvalidRequest) + return + } + + // Update bucket versioning configuration using new bucket config system + if errCode := s3a.setBucketVersioningStatus(bucket, status); errCode != s3err.ErrNone { + glog.Errorf("PutBucketVersioningHandler save config: %d", errCode) + s3err.WriteErrorResponse(w, r, errCode) + return + } + + writeSuccessResponseEmpty(w, r) +} |
