aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api/s3api_bucket_handlers.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/s3api/s3api_bucket_handlers.go')
-rw-r--r--weed/s3api/s3api_bucket_handlers.go97
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)
+}