From 2c0a032966bb940b83a2aa7cb2307f34884a5409 Mon Sep 17 00:00:00 2001 From: Nikita Zinkevich Date: Fri, 21 Feb 2025 13:52:13 +0300 Subject: [PATCH] [#648] fix: Pass tags during PostObject request Signed-off-by: Nikita Zinkevich --- api/handler/put.go | 1 + api/handler/put_test.go | 29 ++++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/api/handler/put.go b/api/handler/put.go index 03083f61..7ef524dd 100644 --- a/api/handler/put.go +++ b/api/handler/put.go @@ -602,6 +602,7 @@ func (h *handler) PostObject(w http.ResponseWriter, r *http.Request) { ObjectName: objInfo.Name, VersionID: objInfo.VersionID(), }, + TagSet: tagSet, NodeVersion: extendedObjInfo.NodeVersion, } diff --git a/api/handler/put_test.go b/api/handler/put_test.go index bc4a063f..4067f6fc 100644 --- a/api/handler/put_test.go +++ b/api/handler/put_test.go @@ -9,6 +9,7 @@ import ( "encoding/base64" "encoding/hex" "encoding/json" + "encoding/xml" "errors" "fmt" "hash/crc32" @@ -148,8 +149,16 @@ func TestPostObject(t *testing.T) { filename string content string objName string + tagging string err bool }{ + { + key: "user/user1/${filename}", + filename: "object", + content: "content", + objName: "user/user1/object", + tagging: "EnvironmentProduction", + }, { key: "user/user1/${filename}", filename: "object", @@ -207,7 +216,7 @@ func TestPostObject(t *testing.T) { }, } { t.Run(tc.key+";"+tc.filename, func(t *testing.T) { - w := postObjectBase(hc, ns, bktName, tc.key, tc.filename, tc.content) + w := postObjectBase(hc, ns, bktName, tc.key, tc.filename, tc.content, tc.tagging) if tc.err { assertS3Error(hc.t, w, apierr.GetAPIError(apierr.ErrInternalError)) return @@ -215,6 +224,13 @@ func TestPostObject(t *testing.T) { assertStatus(hc.t, w, http.StatusNoContent) content, _ := getObject(hc, bktName, tc.objName) require.Equal(t, tc.content, string(content)) + + if tc.tagging != "" { + tagging := getObjectTagging(t, hc, bktName, tc.objName, "") + strtags, err := xml.Marshal(tagging) + require.NoError(t, err) + require.Equal(t, tc.tagging, string(strtags)) + } }) } } @@ -1332,8 +1348,8 @@ func prepareRequestForEncryption(hc *handlerContext, algo, key, md5, tlsTerminat return r } -func postObjectBase(hc *handlerContext, ns, bktName, key, filename, content string) *httptest.ResponseRecorder { - policy := "eyJleHBpcmF0aW9uIjogIjIwMjUtMTItMDFUMTI6MDA6MDAuMDAwWiIsImNvbmRpdGlvbnMiOiBbCiBbInN0YXJ0cy13aXRoIiwgIiR4LWFtei1jcmVkZW50aWFsIiwgIiJdLAogWyJzdGFydHMtd2l0aCIsICIkeC1hbXotZGF0ZSIsICIiXSwKIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICIiXQpdfQ==" +func postObjectBase(hc *handlerContext, ns, bktName, key, filename, content, tagging string) *httptest.ResponseRecorder { + policy := "eyJleHBpcmF0aW9uIjogIjIwMjUtMTItMDFUMTI6MDA6MDAuMDAwWiIsImNvbmRpdGlvbnMiOiBbCiBbInN0YXJ0cy13aXRoIiwgIiR4LWFtei1jcmVkZW50aWFsIiwgIiJdLAogWyJzdGFydHMtd2l0aCIsICIkeC1hbXotZGF0ZSIsICIiXSwKIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICIiXSwKIFsic3RhcnRzLXdpdGgiLCAiJHRhZ2dpbmciLCAiIl0KXX0K" timeToSign := time.Now() timeToSignStr := timeToSign.Format("20060102T150405Z") @@ -1346,7 +1362,7 @@ func postObjectBase(hc *handlerContext, ns, bktName, key, filename, content stri creds := getCredsStr(accessKeyID, timeToSignStr, region, service) sign := auth.SignStr(secretKey, service, region, timeToSign, policy) - body, contentType, err := getMultipartFormBody(policy, creds, timeToSignStr, sign, key, filename, content) + body, contentType, err := getMultipartFormBody(policy, creds, timeToSignStr, sign, key, filename, content, tagging) require.NoError(hc.t, err) w, r := prepareTestPostRequest(hc, bktName, body) @@ -1364,7 +1380,7 @@ func getCredsStr(accessKeyID, timeToSign, region, service string) string { return accessKeyID + "/" + timeToSign + "/" + region + "/" + service + "/aws4_request" } -func getMultipartFormBody(policy, creds, date, sign, key, filename, content string) (io.Reader, string, error) { +func getMultipartFormBody(policy, creds, date, sign, key, filename, content, tagging string) (io.Reader, string, error) { body := &bytes.Buffer{} writer := multipart.NewWriter(body) defer writer.Close() @@ -1385,6 +1401,9 @@ func getMultipartFormBody(policy, creds, date, sign, key, filename, content stri if err := writer.WriteField(strings.ToLower(auth.AmzSignature), sign); err != nil { return nil, "", err } + if err := writer.WriteField("tagging", tagging); err != nil { + return nil, "", err + } file, err := writer.CreateFormFile("file", filename) if err != nil {