Fix issue with UNSIGNED payloads.

Additionally also fixes escaping slashes in
temporary multipart names
master
Remco Verhoef 7 years ago committed by Harshavardhana
parent 52b500cce9
commit bfff251e2a
  1. 42
      cmd/gateway-gcs.go
  2. 5
      cmd/gateway-handlers.go
  3. 1053
      cmd/gcs/gateway-gcs-url.go

@ -37,6 +37,12 @@ import (
"bytes"
// this package contains the url code of go 1.8
// due to compatibility with older versions
// copied it to our rep
"path/filepath"
minio "github.com/minio/minio-go"
"github.com/minio/minio-go/pkg/policy"
)
@ -589,9 +595,7 @@ func (l *gcsGateway) ListMultipartUploads(bucket string, prefix string, keyMarke
attrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
} else if err != nil {
return ListMultipartsInfo{}, gcsToObjectError(traceError(err), bucket)
}
@ -629,6 +633,9 @@ func (l *gcsGateway) ListMultipartUploads(bucket string, prefix string, keyMarke
}
func fromGCSMultipartKey(s string) (key, uploadID string, partID int, err error) {
// remove prefixes
s = filepath.Base(s)
parts := strings.Split(s, "-")
if parts[0] != "multipart" {
return "", "", 0, ErrNotValidMultipartIdentifier
@ -638,7 +645,8 @@ func fromGCSMultipartKey(s string) (key, uploadID string, partID int, err error)
return "", "", 0, ErrNotValidMultipartIdentifier
}
key = parts[1]
key = unescape(parts[1])
uploadID = parts[3]
partID, err = strconv.Atoi(parts[3])
@ -649,18 +657,32 @@ func fromGCSMultipartKey(s string) (key, uploadID string, partID int, err error)
return
}
func toGCSMultipartKey(key string, uploadID string, partID int) string {
// we don't use the etag within the key, because the amazon spec
// explicitly notes that uploaded parts with same number are being overwritten
func unescape(s string) string {
s = strings.Replace(s, "%2D", "-", -1)
s = strings.Replace(s, "%2F", "/", -1)
s = strings.Replace(s, "%25", "%", -1)
return s
}
func escape(s string) string {
s = strings.Replace(s, "%", "%25", -1)
s = strings.Replace(s, "/", "%2F", -1)
s = strings.Replace(s, "-", "%2D", -1)
return s
}
func toGCSMultipartKey(key string, uploadID string, partID int) string {
// parts are allowed to be numbered from 1 to 10,000 (inclusive)
return fmt.Sprintf("%s/multipart-%s-%s-%05d", ZZZZMinioPrefix, key, uploadID, partID)
// we need to encode the key because of possible slashes
return fmt.Sprintf("%s/multipart-%s-%s-%05d", ZZZZMinioPrefix, escape(key), uploadID, partID)
}
// NewMultipartUpload - upload object in multiple parts
func (l *gcsGateway) NewMultipartUpload(bucket string, key string, metadata map[string]string) (uploadID string, err error) {
// generate new uploadid
uploadID = mustGetUUID()
uploadID = strings.Replace(uploadID, "-", "", -1)
// generate name for part zero
partZeroKey := toGCSMultipartKey(key, uploadID, 0)
@ -769,9 +791,7 @@ func (l *gcsGateway) AbortMultipartUpload(bucket string, key string, uploadID st
attrs, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
} else if err != nil {
return gcsToObjectError(traceError(err), bucket, prefix)
}

@ -272,10 +272,9 @@ func (api gatewayAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Re
return
}
sha256sum := getContentSha256Cksum(r)
sha256sum := ""
if !skipContentSha256Cksum(r) {
sha256sum = r.Header.Get("X-Amz-Content-Sha256")
sha256sum = getContentSha256Cksum(r)
}
// Create object.

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save