s3: report error to s3 when updating an object but it is already a directory

fix https://github.com/chrislusf/seaweedfs/issues/1545
This commit is contained in:
Chris Lu 2020-10-20 10:25:16 -07:00
parent 7fc98da709
commit b3aa2fab9a
2 changed files with 17 additions and 2 deletions

View file

@ -5,12 +5,13 @@ import (
"encoding/json"
"encoding/xml"
"fmt"
"github.com/chrislusf/seaweedfs/weed/s3api/s3err"
"io"
"io/ioutil"
"net/http"
"strings"
"github.com/chrislusf/seaweedfs/weed/s3api/s3err"
"github.com/gorilla/mux"
"github.com/chrislusf/seaweedfs/weed/glog"
@ -333,7 +334,7 @@ func (s3a *S3ApiServer) putToFiler(r *http.Request, uploadUrl string, dataReader
}
if ret.Error != "" {
glog.Errorf("upload to filer error: %v", ret.Error)
return "", s3err.ErrInternalError
return "", filerErrorToS3Error(ret.Error)
}
return etag, s3err.ErrNone
@ -359,3 +360,10 @@ func getBucketAndObject(r *http.Request) (bucket, object string) {
return
}
func filerErrorToS3Error(errString string) s3err.ErrorCode {
if strings.HasPrefix(errString, "existing ") && strings.HasSuffix(errString, "is a directory") {
return s3err.ErrExistingObjectIsDirectory
}
return s3err.ErrInternalError
}

View file

@ -92,6 +92,8 @@ const (
ErrMissingDateHeader
ErrInvalidRequest
ErrNotImplemented
ErrExistingObjectIsDirectory
)
// error code to APIError structure, these fields carry respective
@ -344,6 +346,11 @@ var errorCodeResponse = map[ErrorCode]APIError{
Description: "A header you provided implies functionality that is not implemented",
HTTPStatusCode: http.StatusNotImplemented,
},
ErrExistingObjectIsDirectory: {
Code: "ExistingObjectIsDirectory",
Description: "Existing Object is a directory.",
HTTPStatusCode: http.StatusConflict,
},
}
// GetAPIError provides API Error for input API error code.