diff options
| author | Konstantin Lebedev <lebedev_k@tochka.com> | 2021-05-24 16:59:44 +0500 |
|---|---|---|
| committer | Konstantin Lebedev <lebedev_k@tochka.com> | 2021-05-24 16:59:44 +0500 |
| commit | b612d5aebdb55767c2ac2afffedc96c2a27fd9db (patch) | |
| tree | 61c41ad2627d51ef5544b9a80dfb223e87344567 /weed | |
| parent | 9079ce0e7f9eebd10b33cbe27f030a6f4f584d04 (diff) | |
| download | seaweedfs-b612d5aebdb55767c2ac2afffedc96c2a27fd9db.tar.xz seaweedfs-b612d5aebdb55767c2ac2afffedc96c2a27fd9db.zip | |
s3 test get w/ If-Match: bogus ETag
Diffstat (limited to 'weed')
| -rw-r--r-- | weed/s3api/s3api_object_handlers.go | 5 | ||||
| -rw-r--r-- | weed/s3api/s3err/s3api_errors.go | 8 | ||||
| -rw-r--r-- | weed/server/filer_server_handlers_read.go | 9 |
3 files changed, 19 insertions, 3 deletions
diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index e6731e5be..e6140fd1a 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -333,6 +333,11 @@ func (s3a *S3ApiServer) proxyToFiler(w http.ResponseWriter, r *http.Request, des } defer util.CloseResponse(resp) + if resp.StatusCode == http.StatusPreconditionFailed { + writeErrorResponse(w, s3err.ErrPreconditionFailed, r.URL) + return + } + if (resp.ContentLength == -1 || resp.StatusCode == 404) && resp.StatusCode != 304 { if r.Method != "DELETE" { writeErrorResponse(w, s3err.ErrNoSuchKey, r.URL) diff --git a/weed/s3api/s3err/s3api_errors.go b/weed/s3api/s3err/s3api_errors.go index 258f21523..7f0ffdf86 100644 --- a/weed/s3api/s3err/s3api_errors.go +++ b/weed/s3api/s3err/s3api_errors.go @@ -93,6 +93,7 @@ const ( ErrInvalidRequest ErrAuthNotSetup ErrNotImplemented + ErrPreconditionFailed ErrExistingObjectIsDirectory ) @@ -342,7 +343,7 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "Invalid Request", HTTPStatusCode: http.StatusBadRequest, }, - ErrAuthNotSetup : { + ErrAuthNotSetup: { Code: "InvalidRequest", Description: "Signed request requires setting up SeaweedFS S3 authentication", HTTPStatusCode: http.StatusBadRequest, @@ -352,6 +353,11 @@ var errorCodeResponse = map[ErrorCode]APIError{ Description: "A header you provided implies functionality that is not implemented", HTTPStatusCode: http.StatusNotImplemented, }, + ErrPreconditionFailed: { + Code: "PreconditionFailed", + Description: "At least one of the pre-conditions you specified did not hold", + HTTPStatusCode: http.StatusPreconditionFailed, + }, ErrExistingObjectIsDirectory: { Code: "ExistingObjectIsDirectory", Description: "Existing Object is a directory.", diff --git a/weed/server/filer_server_handlers_read.go b/weed/server/filer_server_handlers_read.go index 286523098..ea0650ed8 100644 --- a/weed/server/filer_server_handlers_read.go +++ b/weed/server/filer_server_handlers_read.go @@ -61,6 +61,13 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, return } + // set etag + etag := filer.ETagEntry(entry) + if ifm := r.Header.Get("If-Match"); ifm != "" && ifm != "\""+etag+"\"" { + w.WriteHeader(http.StatusPreconditionFailed) + return + } + w.Header().Set("Accept-Ranges", "bytes") // mime type @@ -115,8 +122,6 @@ func (fs *FilerServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request, } } - // set etag - etag := filer.ETagEntry(entry) if inm := r.Header.Get("If-None-Match"); inm == "\""+etag+"\"" { w.WriteHeader(http.StatusNotModified) return |
