[#648] fix: Pass tags during PostObject request

Signed-off-by: Nikita Zinkevich <n.zinkevich@yadro.com>
This commit is contained in:
Nikita Zinkevich 2025-02-21 13:52:13 +03:00
parent f8852c7626
commit 955608c3ca
2 changed files with 25 additions and 5 deletions

View file

@ -602,6 +602,7 @@ func (h *handler) PostObject(w http.ResponseWriter, r *http.Request) {
ObjectName: objInfo.Name, ObjectName: objInfo.Name,
VersionID: objInfo.VersionID(), VersionID: objInfo.VersionID(),
}, },
TagSet: tagSet,
NodeVersion: extendedObjInfo.NodeVersion, NodeVersion: extendedObjInfo.NodeVersion,
} }

View file

@ -9,6 +9,7 @@ import (
"encoding/base64" "encoding/base64"
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"encoding/xml"
"errors" "errors"
"fmt" "fmt"
"hash/crc32" "hash/crc32"
@ -148,8 +149,16 @@ func TestPostObject(t *testing.T) {
filename string filename string
content string content string
objName string objName string
tagging string
err bool err bool
}{ }{
{
key: "user/user1/${filename}",
filename: "object",
content: "content",
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>",
},
{ {
key: "user/user1/${filename}", key: "user/user1/${filename}",
filename: "object", filename: "object",
@ -207,7 +216,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) 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)) assertS3Error(hc.t, w, apierr.GetAPIError(apierr.ErrInternalError))
return return
@ -215,6 +224,13 @@ func TestPostObject(t *testing.T) {
assertStatus(hc.t, w, http.StatusNoContent) assertStatus(hc.t, w, http.StatusNoContent)
content, _ := getObject(hc, bktName, tc.objName) content, _ := getObject(hc, bktName, tc.objName)
require.Equal(t, tc.content, string(content)) 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 return r
} }
func postObjectBase(hc *handlerContext, ns, bktName, key, filename, content string) *httptest.ResponseRecorder { func postObjectBase(hc *handlerContext, ns, bktName, key, filename, content, tagging string) *httptest.ResponseRecorder {
policy := "eyJleHBpcmF0aW9uIjogIjIwMjUtMTItMDFUMTI6MDA6MDAuMDAwWiIsImNvbmRpdGlvbnMiOiBbCiBbInN0YXJ0cy13aXRoIiwgIiR4LWFtei1jcmVkZW50aWFsIiwgIiJdLAogWyJzdGFydHMtd2l0aCIsICIkeC1hbXotZGF0ZSIsICIiXSwKIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICIiXQpdfQ==" policy := "eyJleHBpcmF0aW9uIjogIjIwMjUtMTItMDFUMTI6MDA6MDAuMDAwWiIsImNvbmRpdGlvbnMiOiBbCiBbInN0YXJ0cy13aXRoIiwgIiR4LWFtei1jcmVkZW50aWFsIiwgIiJdLAogWyJzdGFydHMtd2l0aCIsICIkeC1hbXotZGF0ZSIsICIiXSwKIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICIiXSwKIFsic3RhcnRzLXdpdGgiLCAiJHRhZ2dpbmciLCAiIl0KXX0K"
timeToSign := time.Now() timeToSign := time.Now()
timeToSignStr := timeToSign.Format("20060102T150405Z") timeToSignStr := timeToSign.Format("20060102T150405Z")
@ -1346,7 +1362,7 @@ func postObjectBase(hc *handlerContext, ns, bktName, key, filename, content stri
creds := getCredsStr(accessKeyID, timeToSignStr, region, service) creds := getCredsStr(accessKeyID, timeToSignStr, region, service)
sign := auth.SignStr(secretKey, service, region, timeToSign, policy) 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) require.NoError(hc.t, err)
w, r := prepareTestPostRequest(hc, bktName, body) 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" 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{} body := &bytes.Buffer{}
writer := multipart.NewWriter(body) writer := multipart.NewWriter(body)
defer writer.Close() 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 { if err := writer.WriteField(strings.ToLower(auth.AmzSignature), sign); err != nil {
return nil, "", err return nil, "", err
} }
if err := writer.WriteField("tagging", tagging); err != nil {
return nil, "", err
}
file, err := writer.CreateFormFile("file", filename) file, err := writer.CreateFormFile("file", filename)
if err != nil { if err != nil {