[#648] fix: Pass tags during PostObject request
Signed-off-by: Nikita Zinkevich <n.zinkevich@yadro.com>
This commit is contained in:
parent
f8852c7626
commit
955608c3ca
2 changed files with 25 additions and 5 deletions
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue