diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 9871db8506..04d5100615 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -641,7 +641,11 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) entry, err = s3a.getSpecificObjectVersion(bucket, object, versionId) if err != nil { glog.Errorf("Failed to get specific version %s: %v", versionId, err) - s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) + if errors.Is(err, filer_pb.ErrNotFound) { + s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchVersion) + } else { + s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) + } return } targetVersionId = versionId @@ -2149,7 +2153,11 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request entry, err = s3a.getSpecificObjectVersion(bucket, object, versionId) if err != nil { glog.Errorf("Failed to get specific version %s for %s/%s: %v", versionId, bucket, object, err) - s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) + if errors.Is(err, filer_pb.ErrNotFound) { + s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchVersion) + } else { + s3err.WriteErrorResponse(w, r, s3err.ErrInternalError) + } return } targetVersionId = versionId diff --git a/weed/s3api/s3api_object_versioning.go b/weed/s3api/s3api_object_versioning.go index 43d268b85c..36a7415841 100644 --- a/weed/s3api/s3api_object_versioning.go +++ b/weed/s3api/s3api_object_versioning.go @@ -984,7 +984,7 @@ func (s3a *S3ApiServer) getSpecificObjectVersion(bucket, object, versionId strin bucketDir := s3a.bucketDir(bucket) entry, err := s3a.getEntry(bucketDir, normalizedObject) if err != nil { - return nil, fmt.Errorf("null version object %s not found: %v", normalizedObject, err) + return nil, fmt.Errorf("null version object %s not found: %w", normalizedObject, err) } return entry, nil } @@ -995,7 +995,7 @@ func (s3a *S3ApiServer) getSpecificObjectVersion(bucket, object, versionId strin entry, err := s3a.getEntry(versionsDir, versionFile) if err != nil { - return nil, fmt.Errorf("version %s not found: %v", versionId, err) + return nil, fmt.Errorf("version %s not found: %w", versionId, err) } return entry, nil diff --git a/weed/s3api/s3err/s3api_errors.go b/weed/s3api/s3err/s3api_errors.go index dcc8a2b84f..76cd810759 100644 --- a/weed/s3api/s3err/s3api_errors.go +++ b/weed/s3api/s3err/s3api_errors.go @@ -57,6 +57,7 @@ const ( ErrNoSuchCORSConfiguration ErrNoSuchLifecycleConfiguration ErrNoSuchKey + ErrNoSuchVersion ErrNoSuchUpload ErrInvalidBucketName ErrInvalidBucketState @@ -281,6 +282,11 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "The specified key does not exist.", HTTPStatusCode: http.StatusNotFound, }, + ErrNoSuchVersion: { + Code: "NoSuchVersion", + Description: "The specified version does not exist.", + HTTPStatusCode: http.StatusNotFound, + }, ErrNoSuchUpload: { Code: "NoSuchUpload", Description: "The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed.",