mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-05-05 14:17:50 +08:00
add back "/" prefix if it is missing in object
fix https://github.com/seaweedfs/seaweedfs/issues/3737
This commit is contained in:
parent
0d9f2f9e7a
commit
8b9957d461
@ -157,7 +157,7 @@ func (s3a *S3ApiServer) completeMultipartUpload(input *s3.CompleteMultipartUploa
|
|||||||
|
|
||||||
output = &CompleteMultipartUploadResult{
|
output = &CompleteMultipartUploadResult{
|
||||||
CompleteMultipartUploadOutput: s3.CompleteMultipartUploadOutput{
|
CompleteMultipartUploadOutput: s3.CompleteMultipartUploadOutput{
|
||||||
Location: aws.String(fmt.Sprintf("http://%s%s/%s", s3a.option.Filer.ToHttpAddress(), urlPathEscape(dirName), urlPathEscape(entryName))),
|
Location: aws.String(fmt.Sprintf("http://%s%s/%s", s3a.option.Filer.ToHttpAddress(), urlEscapeObject(dirName), urlPathEscape(entryName))),
|
||||||
Bucket: input.Bucket,
|
Bucket: input.Bucket,
|
||||||
ETag: aws.String("\"" + filer.ETagChunks(finalParts) + "\""),
|
ETag: aws.String("\"" + filer.ETagChunks(finalParts) + "\""),
|
||||||
Key: objectKey(input.Key),
|
Key: objectKey(input.Key),
|
||||||
|
@ -81,9 +81,9 @@ func (s3a *S3ApiServer) CopyObjectHandler(w http.ResponseWriter, r *http.Request
|
|||||||
}
|
}
|
||||||
|
|
||||||
dstUrl := fmt.Sprintf("http://%s%s/%s%s",
|
dstUrl := fmt.Sprintf("http://%s%s/%s%s",
|
||||||
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, dstBucket, urlPathEscape(dstObject))
|
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, dstBucket, urlEscapeObject(dstObject))
|
||||||
srcUrl := fmt.Sprintf("http://%s%s/%s%s",
|
srcUrl := fmt.Sprintf("http://%s%s/%s%s",
|
||||||
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, srcBucket, urlPathEscape(srcObject))
|
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, srcBucket, urlEscapeObject(srcObject))
|
||||||
|
|
||||||
_, _, resp, err := util.DownloadFile(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false))
|
_, _, resp, err := util.DownloadFile(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -172,7 +172,7 @@ func (s3a *S3ApiServer) CopyObjectPartHandler(w http.ResponseWriter, r *http.Req
|
|||||||
dstUrl := fmt.Sprintf("http://%s%s/%s/%04d.part",
|
dstUrl := fmt.Sprintf("http://%s%s/%s/%04d.part",
|
||||||
s3a.option.Filer.ToHttpAddress(), s3a.genUploadsFolder(dstBucket), uploadID, partID)
|
s3a.option.Filer.ToHttpAddress(), s3a.genUploadsFolder(dstBucket), uploadID, partID)
|
||||||
srcUrl := fmt.Sprintf("http://%s%s/%s%s",
|
srcUrl := fmt.Sprintf("http://%s%s/%s%s",
|
||||||
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, srcBucket, urlPathEscape(srcObject))
|
s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, srcBucket, urlEscapeObject(srcObject))
|
||||||
|
|
||||||
resp, dataReader, err := util.ReadUrlAsReaderCloser(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false), rangeHeader)
|
resp, dataReader, err := util.ReadUrlAsReaderCloser(srcUrl, s3a.maybeGetFilerJwtAuthorizationToken(false), rangeHeader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -125,6 +125,14 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request)
|
|||||||
writeSuccessResponseEmpty(w, r)
|
writeSuccessResponseEmpty(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func urlEscapeObject(object string) string {
|
||||||
|
t := urlPathEscape(removeDuplicateSlashes(object))
|
||||||
|
if strings.HasPrefix(t, "/") {
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
return "/" + t
|
||||||
|
}
|
||||||
|
|
||||||
func urlPathEscape(object string) string {
|
func urlPathEscape(object string) string {
|
||||||
var escapedParts []string
|
var escapedParts []string
|
||||||
for _, part := range strings.Split(object, "/") {
|
for _, part := range strings.Split(object, "/") {
|
||||||
@ -419,7 +427,7 @@ func setUserMetadataKeyToLowercase(resp *http.Response) {
|
|||||||
for key, value := range resp.Header {
|
for key, value := range resp.Header {
|
||||||
if strings.HasPrefix(key, s3_constants.AmzUserMetaPrefix) {
|
if strings.HasPrefix(key, s3_constants.AmzUserMetaPrefix) {
|
||||||
resp.Header[strings.ToLower(key)] = value
|
resp.Header[strings.ToLower(key)] = value
|
||||||
delete(resp.Header,key)
|
delete(resp.Header, key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,7 +113,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uploadUrl := fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, bucket, urlPathEscape(object))
|
uploadUrl := fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer.ToHttpAddress(), s3a.option.BucketsPath, bucket, urlEscapeObject(object))
|
||||||
|
|
||||||
etag, errCode := s3a.putToFiler(r, uploadUrl, fileBody, "")
|
etag, errCode := s3a.putToFiler(r, uploadUrl, fileBody, "")
|
||||||
|
|
||||||
|
@ -46,3 +46,37 @@ func TestRemoveDuplicateSlashes(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestS3ApiServer_toFilerUrl(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args string
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
"simple",
|
||||||
|
"/uploads/eaf10b3b-3b3a-4dcd-92a7-edf2a512276e/67b8b9bf-7cca-4cb6-9b34-22fcb4d6e27d/Bildschirmfoto 2022-09-19 um 21.38.37.png",
|
||||||
|
"/uploads/eaf10b3b-3b3a-4dcd-92a7-edf2a512276e/67b8b9bf-7cca-4cb6-9b34-22fcb4d6e27d/Bildschirmfoto%202022-09-19%20um%2021.38.37.png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"double prefix",
|
||||||
|
"//uploads/t.png",
|
||||||
|
"/uploads/t.png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"triple prefix",
|
||||||
|
"///uploads/t.png",
|
||||||
|
"/uploads/t.png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"empty prefix",
|
||||||
|
"uploads/t.png",
|
||||||
|
"/uploads/t.png",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
assert.Equalf(t, tt.want, urlEscapeObject(tt.args), "clean %v", tt.args)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user