Browse Source

better errors

pull/7481/head
chrislu 1 month ago
parent
commit
dcef3da8e5
  1. 22
      weed/s3api/s3api_bucket_policy_handlers.go

22
weed/s3api/s3api_bucket_policy_handlers.go

@ -19,6 +19,12 @@ import (
// Bucket policy metadata key for storing policies in filer // Bucket policy metadata key for storing policies in filer
const BUCKET_POLICY_METADATA_KEY = "s3-bucket-policy" const BUCKET_POLICY_METADATA_KEY = "s3-bucket-policy"
// Sentinel errors for bucket policy operations
var (
ErrPolicyNotFound = errors.New("bucket policy not found")
ErrBucketNotFound = errors.New("bucket not found")
)
// GetBucketPolicyHandler handles GET bucket?policy requests // GetBucketPolicyHandler handles GET bucket?policy requests
func (s3a *S3ApiServer) GetBucketPolicyHandler(w http.ResponseWriter, r *http.Request) { func (s3a *S3ApiServer) GetBucketPolicyHandler(w http.ResponseWriter, r *http.Request) {
bucket, _ := s3_constants.GetBucketAndObject(r) bucket, _ := s3_constants.GetBucketAndObject(r)
@ -40,8 +46,10 @@ func (s3a *S3ApiServer) GetBucketPolicyHandler(w http.ResponseWriter, r *http.Re
// Get bucket policy from filer metadata // Get bucket policy from filer metadata
policyDocument, err := s3a.getBucketPolicy(bucket) policyDocument, err := s3a.getBucketPolicy(bucket)
if err != nil { if err != nil {
if strings.Contains(err.Error(), "policy not found") {
if errors.Is(err, ErrPolicyNotFound) {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucketPolicy) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucketPolicy)
} else if errors.Is(err, ErrBucketNotFound) {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucket)
} else { } else {
glog.Errorf("Failed to get bucket policy for %s: %v", bucket, err) glog.Errorf("Failed to get bucket policy for %s: %v", bucket, err)
s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
@ -142,8 +150,10 @@ func (s3a *S3ApiServer) DeleteBucketPolicyHandler(w http.ResponseWriter, r *http
// Check if bucket policy exists // Check if bucket policy exists
if _, err := s3a.getBucketPolicy(bucket); err != nil { if _, err := s3a.getBucketPolicy(bucket); err != nil {
if strings.Contains(err.Error(), "policy not found") {
if errors.Is(err, ErrPolicyNotFound) {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucketPolicy) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucketPolicy)
} else if errors.Is(err, ErrBucketNotFound) {
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchBucket)
} else { } else {
s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) s3err.WriteErrorResponse(w, r, s3err.ErrInternalError)
} }
@ -189,17 +199,17 @@ func (s3a *S3ApiServer) getBucketPolicy(bucket string) (*policy.PolicyDocument,
Name: bucket, Name: bucket,
}) })
if err != nil { if err != nil {
// Note: callers should check bucket existence separately
return fmt.Errorf("failed to lookup bucket: %v", err)
// Return sentinel error for bucket not found
return fmt.Errorf("%w: %v", ErrBucketNotFound, err)
} }
if resp.Entry == nil { if resp.Entry == nil {
return fmt.Errorf("bucket policy not found: no entry")
return ErrPolicyNotFound
} }
policyJSON, exists := resp.Entry.Extended[BUCKET_POLICY_METADATA_KEY] policyJSON, exists := resp.Entry.Extended[BUCKET_POLICY_METADATA_KEY]
if !exists || len(policyJSON) == 0 { if !exists || len(policyJSON) == 0 {
return fmt.Errorf("bucket policy not found: no policy metadata")
return ErrPolicyNotFound
} }
if err := json.Unmarshal(policyJSON, &policyDoc); err != nil { if err := json.Unmarshal(policyJSON, &policyDoc); err != nil {

Loading…
Cancel
Save