diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index ed6f32660..fef4f3c86 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -688,6 +688,17 @@ func (s3a *S3ApiServer) fetchObjectEntry(bucket, object string) (*filer_pb.Entry return fetchedEntry, nil } +// fetchObjectEntryRequired fetches the filer entry for an object +// Returns an error if the object is not found or any other error occurs +func (s3a *S3ApiServer) fetchObjectEntryRequired(bucket, object string) (*filer_pb.Entry, error) { + objectPath := fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object) + fetchedEntry, fetchErr := s3a.getEntry("", objectPath) + if fetchErr != nil { + return nil, fetchErr // Return error for both not-found and other errors + } + return fetchedEntry, nil +} + // copyResponseHeaders copies headers from proxy response to the response writer, // excluding internal SeaweedFS headers and optionally excluding body-related headers func copyResponseHeaders(w http.ResponseWriter, proxyResponse *http.Response, excludeBodyHeaders bool) { @@ -1285,10 +1296,9 @@ func (s3a *S3ApiServer) detectPrimarySSEType(entry *filer_pb.Entry) string { func (s3a *S3ApiServer) createMultipartSSEKMSDecryptedReader(r *http.Request, proxyResponse *http.Response) (io.Reader, error) { // Get the object path from the request bucket, object := s3_constants.GetBucketAndObject(r) - objectPath := fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object) // Get the object entry from filer to access chunk information - entry, err := s3a.getEntry("", objectPath) + entry, err := s3a.fetchObjectEntryRequired(bucket, object) if err != nil { return nil, fmt.Errorf("failed to get object entry for multipart SSE-KMS decryption: %v", err) } @@ -1551,10 +1561,9 @@ func (s3a *S3ApiServer) createMultipartSSECDecryptedReader(r *http.Request, prox // Get the object path from the request bucket, object := s3_constants.GetBucketAndObject(r) - objectPath := fmt.Sprintf("%s/%s%s", s3a.option.BucketsPath, bucket, object) // Get the object entry from filer to access chunk information - entry, err := s3a.getEntry("", objectPath) + entry, err := s3a.fetchObjectEntryRequired(bucket, object) if err != nil { return nil, fmt.Errorf("failed to get object entry for multipart SSE-C decryption: %v", err) } diff --git a/weed/s3api/s3api_object_handlers_acl.go b/weed/s3api/s3api_object_handlers_acl.go index 1b6f28916..e90d84603 100644 --- a/weed/s3api/s3api_object_handlers_acl.go +++ b/weed/s3api/s3api_object_handlers_acl.go @@ -68,8 +68,7 @@ func (s3a *S3ApiServer) GetObjectAclHandler(w http.ResponseWriter, r *http.Reque } } else { // Handle regular (non-versioned) object ACL retrieval - bucketDir := s3a.option.BucketsPath + "/" + bucket - entry, err = s3a.getEntry(bucketDir, object) + entry, err = s3a.fetchObjectEntryRequired(bucket, object) if err != nil { if errors.Is(err, filer_pb.ErrNotFound) { s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) @@ -212,8 +211,7 @@ func (s3a *S3ApiServer) PutObjectAclHandler(w http.ResponseWriter, r *http.Reque } } else { // Handle regular (non-versioned) object ACL modification - bucketDir := s3a.option.BucketsPath + "/" + bucket - entry, err = s3a.getEntry(bucketDir, object) + entry, err = s3a.fetchObjectEntryRequired(bucket, object) if err != nil { if errors.Is(err, filer_pb.ErrNotFound) { s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) diff --git a/weed/s3api/s3api_object_retention.go b/weed/s3api/s3api_object_retention.go index 93e04e7da..5bb2faf54 100644 --- a/weed/s3api/s3api_object_retention.go +++ b/weed/s3api/s3api_object_retention.go @@ -200,8 +200,7 @@ func (s3a *S3ApiServer) getObjectEntry(bucket, object, versionId string) (*filer if versioningEnabled { entry, err = s3a.getLatestObjectVersion(bucket, object) } else { - bucketDir := s3a.option.BucketsPath + "/" + bucket - entry, err = s3a.getEntry(bucketDir, object) + entry, err = s3a.fetchObjectEntryRequired(bucket, object) } } @@ -284,8 +283,7 @@ func (s3a *S3ApiServer) setObjectRetention(bucket, object, versionId string, ret } } } else { - bucketDir := s3a.option.BucketsPath + "/" + bucket - entry, err = s3a.getEntry(bucketDir, object) + entry, err = s3a.fetchObjectEntryRequired(bucket, object) if err != nil { return fmt.Errorf("failed to get object %s/%s: %w", bucket, object, ErrObjectNotFound) } @@ -426,8 +424,7 @@ func (s3a *S3ApiServer) setObjectLegalHold(bucket, object, versionId string, leg } } } else { - bucketDir := s3a.option.BucketsPath + "/" + bucket - entry, err = s3a.getEntry(bucketDir, object) + entry, err = s3a.fetchObjectEntryRequired(bucket, object) if err != nil { return fmt.Errorf("failed to get object %s/%s: %w", bucket, object, ErrObjectNotFound) }