diff options
Diffstat (limited to 'weed/s3api')
| -rw-r--r-- | weed/s3api/s3api_object_handlers_put.go | 3 | ||||
| -rw-r--r-- | weed/s3api/s3api_object_handlers_put_test.go | 46 | ||||
| -rw-r--r-- | weed/s3api/s3err/s3-error.go | 4 | ||||
| -rw-r--r-- | weed/s3api/s3err/s3api_errors.go | 8 |
4 files changed, 60 insertions, 1 deletions
diff --git a/weed/s3api/s3api_object_handlers_put.go b/weed/s3api/s3api_object_handlers_put.go index 17fceb8d2..cbd8da54f 100644 --- a/weed/s3api/s3api_object_handlers_put.go +++ b/weed/s3api/s3api_object_handlers_put.go @@ -20,6 +20,7 @@ import ( "github.com/seaweedfs/seaweedfs/weed/s3api/s3err" "github.com/seaweedfs/seaweedfs/weed/security" weed_server "github.com/seaweedfs/seaweedfs/weed/server" + "github.com/seaweedfs/seaweedfs/weed/util/constants" stats_collect "github.com/seaweedfs/seaweedfs/weed/stats" ) @@ -380,6 +381,8 @@ func setEtag(w http.ResponseWriter, etag string) { func filerErrorToS3Error(errString string) s3err.ErrorCode { switch { + case errString == constants.ErrMsgBadDigest: + return s3err.ErrBadDigest case strings.HasPrefix(errString, "existing ") && strings.HasSuffix(errString, "is a directory"): return s3err.ErrExistingObjectIsDirectory case strings.HasSuffix(errString, "is a file"): diff --git a/weed/s3api/s3api_object_handlers_put_test.go b/weed/s3api/s3api_object_handlers_put_test.go new file mode 100644 index 000000000..87b874e1f --- /dev/null +++ b/weed/s3api/s3api_object_handlers_put_test.go @@ -0,0 +1,46 @@ +package s3api + +import ( + "testing" + + "github.com/seaweedfs/seaweedfs/weed/s3api/s3err" + "github.com/seaweedfs/seaweedfs/weed/util/constants" +) + +func TestFilerErrorToS3Error(t *testing.T) { + tests := []struct { + name string + errString string + expectedErr s3err.ErrorCode + }{ + { + name: "MD5 mismatch error", + errString: constants.ErrMsgBadDigest, + expectedErr: s3err.ErrBadDigest, + }, + { + name: "Directory exists error", + errString: "existing /path/to/file is a directory", + expectedErr: s3err.ErrExistingObjectIsDirectory, + }, + { + name: "File exists error", + errString: "/path/to/file is a file", + expectedErr: s3err.ErrExistingObjectIsFile, + }, + { + name: "Unknown error", + errString: "some random error", + expectedErr: s3err.ErrInternalError, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := filerErrorToS3Error(tt.errString) + if result != tt.expectedErr { + t.Errorf("filerErrorToS3Error(%q) = %v, want %v", tt.errString, result, tt.expectedErr) + } + }) + } +} diff --git a/weed/s3api/s3err/s3-error.go b/weed/s3api/s3err/s3-error.go index b87764742..c5e515abd 100644 --- a/weed/s3api/s3err/s3-error.go +++ b/weed/s3api/s3err/s3-error.go @@ -1,5 +1,7 @@ package s3err +import "github.com/seaweedfs/seaweedfs/weed/util/constants" + /* * MinIO Go Library for Amazon S3 Compatible Cloud Storage * Copyright 2015-2017 MinIO, Inc. @@ -21,7 +23,7 @@ package s3err // http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html var s3ErrorResponseMap = map[string]string{ "AccessDenied": "Access Denied.", - "BadDigest": "The Content-Md5 you specified did not match what we received.", + "BadDigest": constants.ErrMsgBadDigest, "EntityTooSmall": "Your proposed upload is smaller than the minimum allowed object size.", "EntityTooLarge": "Your proposed upload exceeds the maximum allowed object size.", "IncompleteBody": "You did not provide the number of bytes specified by the Content-Length HTTP header.", diff --git a/weed/s3api/s3err/s3api_errors.go b/weed/s3api/s3err/s3api_errors.go index 3da79e817..24f8e1b56 100644 --- a/weed/s3api/s3err/s3api_errors.go +++ b/weed/s3api/s3err/s3api_errors.go @@ -4,6 +4,8 @@ import ( "encoding/xml" "fmt" "net/http" + + "github.com/seaweedfs/seaweedfs/weed/util/constants" ) // APIError structure @@ -59,6 +61,7 @@ const ( ErrInvalidBucketName ErrInvalidBucketState ErrInvalidDigest + ErrBadDigest ErrInvalidMaxKeys ErrInvalidMaxUploads ErrInvalidMaxParts @@ -187,6 +190,11 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "The Content-Md5 you specified is not valid.", HTTPStatusCode: http.StatusBadRequest, }, + ErrBadDigest: { + Code: "BadDigest", + Description: constants.ErrMsgBadDigest, + HTTPStatusCode: http.StatusBadRequest, + }, ErrInvalidMaxUploads: { Code: "InvalidArgument", Description: "Argument max-uploads must be an integer between 0 and 2147483647", |
