aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api
diff options
context:
space:
mode:
Diffstat (limited to 'weed/s3api')
-rw-r--r--weed/s3api/s3api_object_handlers_put.go3
-rw-r--r--weed/s3api/s3api_object_handlers_put_test.go46
-rw-r--r--weed/s3api/s3err/s3-error.go4
-rw-r--r--weed/s3api/s3err/s3api_errors.go8
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",