aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2021-03-10 13:19:28 -0800
committerChris Lu <chris.lu@gmail.com>2021-03-10 13:19:28 -0800
commitca546f47e173a33e0d6503ee0a5add97e2ba6d93 (patch)
tree176336288236ee299200c168c13edd710e871c1f
parent6d729fa74221485ee7d6cfae472c91e0065efbeb (diff)
downloadseaweedfs-ca546f47e173a33e0d6503ee0a5add97e2ba6d93.tar.xz
seaweedfs-ca546f47e173a33e0d6503ee0a5add97e2ba6d93.zip
s3: escape object key if containing special characters
fix https://github.com/chrislusf/seaweedfs/issues/1884
-rw-r--r--weed/s3api/s3api_object_handlers.go12
-rw-r--r--weed/s3api/s3api_object_handlers_postpolicy.go3
2 files changed, 12 insertions, 3 deletions
diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go
index 19d85c495..866d85822 100644
--- a/weed/s3api/s3api_object_handlers.go
+++ b/weed/s3api/s3api_object_handlers.go
@@ -8,6 +8,7 @@ import (
"io"
"io/ioutil"
"net/http"
+ "net/url"
"sort"
"strings"
@@ -69,7 +70,7 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request)
return
}
} else {
- uploadUrl := fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, object)
+ uploadUrl := s3a.buildUploadUrl(bucket, object)
etag, errCode := s3a.putToFiler(r, uploadUrl, dataReader)
@@ -84,6 +85,15 @@ func (s3a *S3ApiServer) PutObjectHandler(w http.ResponseWriter, r *http.Request)
writeSuccessResponseEmpty(w)
}
+func (s3a *S3ApiServer) buildUploadUrl(bucket string, object string) string {
+ var escapedParts []string
+ for _, part := range strings.Split(object, "/") {
+ escapedParts = append(escapedParts, url.PathEscape(part))
+ }
+ object = strings.Join(escapedParts, "/")
+ return fmt.Sprintf("http://%s%s/%s%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, object)
+}
+
func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) {
bucket, object := getBucketAndObject(r)
diff --git a/weed/s3api/s3api_object_handlers_postpolicy.go b/weed/s3api/s3api_object_handlers_postpolicy.go
index 044e732db..383eac943 100644
--- a/weed/s3api/s3api_object_handlers_postpolicy.go
+++ b/weed/s3api/s3api_object_handlers_postpolicy.go
@@ -4,7 +4,6 @@ import (
"bytes"
"encoding/base64"
"errors"
- "fmt"
"github.com/chrislusf/seaweedfs/weed/s3api/policy"
"github.com/chrislusf/seaweedfs/weed/s3api/s3err"
"github.com/dustin/go-humanize"
@@ -110,7 +109,7 @@ func (s3a *S3ApiServer) PostPolicyBucketHandler(w http.ResponseWriter, r *http.R
}
}
- uploadUrl := fmt.Sprintf("http://%s%s/%s/%s", s3a.option.Filer, s3a.option.BucketsPath, bucket, object)
+ uploadUrl := s3a.buildUploadUrl(bucket, object)
etag, errCode := s3a.putToFiler(r, uploadUrl, fileBody)