URL Encode X-Amz-Copy-Source as per the spec (#2114)

The documents for COPY state that the X-Amz-Copy-Source must be URL encoded.

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html
master
Nick Craig-Wood 9 years ago committed by Harshavardhana
parent a51bb1d728
commit 8c767218a4
  1. 2
      api-router.go
  2. 9
      object-handlers.go
  3. 3
      server_test.go

@ -48,7 +48,7 @@ func registerAPIRouter(mux *router.Router, api objectAPIHandlers) {
// GetObject
bucket.Methods("GET").Path("/{object:.+}").HandlerFunc(api.GetObjectHandler)
// CopyObject
bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/).*?").HandlerFunc(api.CopyObjectHandler)
bucket.Methods("PUT").Path("/{object:.+}").HeadersRegexp("X-Amz-Copy-Source", ".*?(\\/|%2F).*?").HandlerFunc(api.CopyObjectHandler)
// PutObject
bucket.Methods("PUT").Path("/{object:.+}").HandlerFunc(api.PutObjectHandler)
// DeleteObject

@ -337,11 +337,14 @@ func (api objectAPIHandlers) CopyObjectHandler(w http.ResponseWriter, r *http.Re
}
}
// TODO: Reject requests where body/payload is present, for now we
// don't even read it.
// TODO: Reject requests where body/payload is present, for now we don't even read it.
// objectSource
objectSource := r.Header.Get("X-Amz-Copy-Source")
objectSource, err := url.QueryUnescape(r.Header.Get("X-Amz-Copy-Source"))
if err != nil {
// Save unescaped string as is.
objectSource = r.Header.Get("X-Amz-Copy-Source")
}
// Skip the first element if it is '/', split the rest.
if strings.HasPrefix(objectSource, "/") {

@ -27,6 +27,7 @@ import (
"io/ioutil"
"math/rand"
"net/http"
"net/url"
"sync"
"time"
@ -689,7 +690,7 @@ func (s *TestSuiteCommon) TestCopyObject(c *C) {
request, err = newTestRequest("PUT", getPutObjectURL(s.endPoint, bucketName, objectName2),
0, nil, s.accessKey, s.secretKey)
// setting the "X-Amz-Copy-Source" to allow copying the content of previously uploaded object.
request.Header.Set("X-Amz-Copy-Source", "/"+bucketName+"/"+objectName)
request.Header.Set("X-Amz-Copy-Source", url.QueryEscape("/"+bucketName+"/"+objectName))
c.Assert(err, IsNil)
// execute the HTTP request.
// the content is expected to have the content of previous disk.

Loading…
Cancel
Save