[#XX] fix: Prevent InternalError response in PostObject handler
Some checks failed
/ DCO (pull_request) Failing after 31s
/ Vulncheck (pull_request) Successful in 1m2s
/ Builds (pull_request) Successful in 1m29s
/ Lint (pull_request) Successful in 2m1s
/ Tests (pull_request) Successful in 1m48s
/ OCI image (pull_request) Successful in 2m5s

Signed-off-by: Nikita Zinkevich <n.zinkevich@yadro.com>
This commit is contained in:
Nikita Zinkevich 2025-02-21 15:11:11 +03:00
parent 329b4c2697
commit 738b7fa3f7
2 changed files with 22 additions and 4 deletions

View file

@ -498,7 +498,8 @@ func (h *handler) PostObject(w http.ResponseWriter, r *http.Request) {
policy, err := checkPostPolicy(r, reqInfo, metadata) policy, err := checkPostPolicy(r, reqInfo, metadata)
if err != nil { if err != nil {
h.logAndSendError(ctx, w, "failed check policy", reqInfo, err) h.logAndSendError(ctx, w, "failed check policy", reqInfo,
fmt.Errorf("%w: %v", apierr.GetAPIError(apierr.ErrInvalidArgument), err))
return return
} }
@ -548,7 +549,8 @@ func (h *handler) PostObject(w http.ResponseWriter, r *http.Request) {
if reqInfo.ObjectName == "" || strings.Contains(reqInfo.ObjectName, "${filename}") { if reqInfo.ObjectName == "" || strings.Contains(reqInfo.ObjectName, "${filename}") {
_, head, err := r.FormFile("file") _, head, err := r.FormFile("file")
if err != nil { if err != nil {
h.logAndSendError(ctx, w, "could not parse file field", reqInfo, err) h.logAndSendError(ctx, w, "could not parse file field", reqInfo,
fmt.Errorf("%w: %v", apierr.GetAPIError(apierr.ErrInvalidArgument), err))
return return
} }
filename = head.Filename filename = head.Filename
@ -557,7 +559,8 @@ func (h *handler) PostObject(w http.ResponseWriter, r *http.Request) {
var head *multipart.FileHeader var head *multipart.FileHeader
contentReader, head, err = r.FormFile("file") contentReader, head, err = r.FormFile("file")
if err != nil { if err != nil {
h.logAndSendError(ctx, w, "could not parse file field", reqInfo, err) h.logAndSendError(ctx, w, "could not parse file field", reqInfo,
fmt.Errorf("%w: %v", apierr.GetAPIError(apierr.ErrInvalidArgument), err))
return return
} }
size = uint64(head.Size) size = uint64(head.Size)

View file

@ -159,6 +159,21 @@ func TestPostObject(t *testing.T) {
objName: "user/user1/object", objName: "user/user1/object",
tagging: "<Tagging xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"><TagSet><Tag><Key>Environment</Key><Value>Production</Value></Tag></TagSet></Tagging>", tagging: "<Tagging xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"><TagSet><Tag><Key>Environment</Key><Value>Production</Value></Tag></TagSet></Tagging>",
}, },
{
key: "user/user1/${filename}",
filename: "object",
content: "content",
objName: "user/user1/object",
tagging: "wrong tagging",
err: true,
},
{
key: "user/user1/${filename}",
filename: "object",
content: "content",
objName: "user/user1/object",
tagging: "<Tagging xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\"><TagSet></TagSet></Tagging>",
},
{ {
key: "user/user1/${filename}", key: "user/user1/${filename}",
filename: "object", filename: "object",
@ -218,7 +233,7 @@ func TestPostObject(t *testing.T) {
t.Run(tc.key+";"+tc.filename, func(t *testing.T) { t.Run(tc.key+";"+tc.filename, func(t *testing.T) {
w := postObjectBase(hc, ns, bktName, tc.key, tc.filename, tc.content, tc.tagging) w := postObjectBase(hc, ns, bktName, tc.key, tc.filename, tc.content, tc.tagging)
if tc.err { if tc.err {
assertS3Error(hc.t, w, apierr.GetAPIError(apierr.ErrInternalError)) assertStatus(hc.t, w, http.StatusBadRequest)
return return
} }
assertStatus(hc.t, w, http.StatusNoContent) assertStatus(hc.t, w, http.StatusNoContent)