summaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/goamz
diff options
context:
space:
mode:
Diffstat (limited to 'Godeps/_workspace/src/github.com/goamz')
-rw-r--r--Godeps/_workspace/src/github.com/goamz/goamz/aws/aws.go39
-rw-r--r--Godeps/_workspace/src/github.com/goamz/goamz/aws/regions.go11
-rw-r--r--Godeps/_workspace/src/github.com/goamz/goamz/s3/multi.go32
-rw-r--r--Godeps/_workspace/src/github.com/goamz/goamz/s3/multi_test.go4
-rw-r--r--Godeps/_workspace/src/github.com/goamz/goamz/s3/s3.go6
-rw-r--r--Godeps/_workspace/src/github.com/goamz/goamz/s3/s3test/server.go4
-rw-r--r--Godeps/_workspace/src/github.com/goamz/goamz/s3/sign.go43
7 files changed, 109 insertions, 30 deletions
diff --git a/Godeps/_workspace/src/github.com/goamz/goamz/aws/aws.go b/Godeps/_workspace/src/github.com/goamz/goamz/aws/aws.go
index cec40be7d..77bf563d6 100644
--- a/Godeps/_workspace/src/github.com/goamz/goamz/aws/aws.go
+++ b/Godeps/_workspace/src/github.com/goamz/goamz/aws/aws.go
@@ -41,25 +41,26 @@ type ServiceInfo struct {
//
// See http://goo.gl/d8BP1 for more details.
type Region struct {
- Name string // the canonical name of this region.
- EC2Endpoint string
- S3Endpoint string
- S3BucketEndpoint string // Not needed by AWS S3. Use ${bucket} for bucket name.
- S3LocationConstraint bool // true if this region requires a LocationConstraint declaration.
- S3LowercaseBucket bool // true if the region requires bucket names to be lower case.
- SDBEndpoint string
- SESEndpoint string
- SNSEndpoint string
- SQSEndpoint string
- IAMEndpoint string
- ELBEndpoint string
- DynamoDBEndpoint string
- CloudWatchServicepoint ServiceInfo
- AutoScalingEndpoint string
- RDSEndpoint ServiceInfo
- STSEndpoint string
- CloudFormationEndpoint string
- ECSEndpoint string
+ Name string // the canonical name of this region.
+ EC2Endpoint string
+ S3Endpoint string
+ S3BucketEndpoint string // Not needed by AWS S3. Use ${bucket} for bucket name.
+ S3LocationConstraint bool // true if this region requires a LocationConstraint declaration.
+ S3LowercaseBucket bool // true if the region requires bucket names to be lower case.
+ SDBEndpoint string
+ SESEndpoint string
+ SNSEndpoint string
+ SQSEndpoint string
+ IAMEndpoint string
+ ELBEndpoint string
+ DynamoDBEndpoint string
+ CloudWatchServicepoint ServiceInfo
+ AutoScalingEndpoint string
+ RDSEndpoint ServiceInfo
+ STSEndpoint string
+ CloudFormationEndpoint string
+ ECSEndpoint string
+ DynamoDBStreamsEndpoint string
}
var Regions = map[string]Region{
diff --git a/Godeps/_workspace/src/github.com/goamz/goamz/aws/regions.go b/Godeps/_workspace/src/github.com/goamz/goamz/aws/regions.go
index 508231e7d..5e18f023d 100644
--- a/Godeps/_workspace/src/github.com/goamz/goamz/aws/regions.go
+++ b/Godeps/_workspace/src/github.com/goamz/goamz/aws/regions.go
@@ -20,6 +20,7 @@ var USGovWest = Region{
"https://sts.amazonaws.com",
"https://cloudformation.us-gov-west-1.amazonaws.com",
"https://ecs.us-gov-west-1.amazonaws.com",
+ "https://streams.dynamodb.us-gov-west-1.amazonaws.com",
}
var USEast = Region{
@@ -42,6 +43,7 @@ var USEast = Region{
"https://sts.amazonaws.com",
"https://cloudformation.us-east-1.amazonaws.com",
"https://ecs.us-east-1.amazonaws.com",
+ "https://streams.dynamodb.us-east-1.amazonaws.com",
}
var USWest = Region{
@@ -64,6 +66,7 @@ var USWest = Region{
"https://sts.amazonaws.com",
"https://cloudformation.us-west-1.amazonaws.com",
"https://ecs.us-west-1.amazonaws.com",
+ "https://streams.dynamodb.us-west-1.amazonaws.com",
}
var USWest2 = Region{
@@ -86,6 +89,7 @@ var USWest2 = Region{
"https://sts.amazonaws.com",
"https://cloudformation.us-west-2.amazonaws.com",
"https://ecs.us-west-2.amazonaws.com",
+ "https://streams.dynamodb.us-west-2.amazonaws.com",
}
var EUWest = Region{
@@ -108,6 +112,7 @@ var EUWest = Region{
"https://sts.amazonaws.com",
"https://cloudformation.eu-west-1.amazonaws.com",
"https://ecs.eu-west-1.amazonaws.com",
+ "https://streams.dynamodb.eu-west-1.amazonaws.com",
}
var EUCentral = Region{
@@ -130,6 +135,7 @@ var EUCentral = Region{
"https://sts.amazonaws.com",
"https://cloudformation.eu-central-1.amazonaws.com",
"https://ecs.eu-central-1.amazonaws.com",
+ "https://streams.dynamodb.eu-central-1.amazonaws.com",
}
var APSoutheast = Region{
@@ -152,6 +158,7 @@ var APSoutheast = Region{
"https://sts.amazonaws.com",
"https://cloudformation.ap-southeast-1.amazonaws.com",
"https://ecs.ap-southeast-1.amazonaws.com",
+ "https://streams.dynamodb.ap-southeast-1.amazonaws.com",
}
var APSoutheast2 = Region{
@@ -174,6 +181,7 @@ var APSoutheast2 = Region{
"https://sts.amazonaws.com",
"https://cloudformation.ap-southeast-2.amazonaws.com",
"https://ecs.ap-southeast-2.amazonaws.com",
+ "https://streams.dynamodb.ap-southeast-2.amazonaws.com",
}
var APNortheast = Region{
@@ -196,6 +204,7 @@ var APNortheast = Region{
"https://sts.amazonaws.com",
"https://cloudformation.ap-northeast-1.amazonaws.com",
"https://ecs.ap-northeast-1.amazonaws.com",
+ "https://streams.dynamodb.ap-northeast-1.amazonaws.com",
}
var SAEast = Region{
@@ -218,6 +227,7 @@ var SAEast = Region{
"https://sts.amazonaws.com",
"https://cloudformation.sa-east-1.amazonaws.com",
"https://ecs.sa-east-1.amazonaws.com",
+ "https://streams.dynamodb.sa-east-1.amazonaws.com",
}
var CNNorth = Region{
@@ -240,4 +250,5 @@ var CNNorth = Region{
"https://sts.cn-north-1.amazonaws.com.cn",
"https://cloudformation.cn-north-1.amazonaws.com.cn",
"https://ecs.cn-north-1.amazonaws.com.cn",
+ "https://streams.dynamodb.cn-north-1.amazonaws.com.cn",
}
diff --git a/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi.go b/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi.go
index 1533bda9d..348ead300 100644
--- a/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi.go
+++ b/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi.go
@@ -339,9 +339,23 @@ func (p completeParts) Len() int { return len(p) }
func (p completeParts) Less(i, j int) bool { return p[i].PartNumber < p[j].PartNumber }
func (p completeParts) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+type completeResponse struct {
+ // The element name: should be either CompleteMultipartUploadResult or Error.
+ XMLName xml.Name
+ // If the element was error, then it should have the following:
+ Code string
+ Message string
+ RequestId string
+ HostId string
+}
+
// Complete assembles the given previously uploaded parts into the
// final object. This operation may take several minutes.
//
+// The complete call to AMZ may still fail after returning HTTP 200,
+// so even though it's unusued, the body of the reply must be demarshalled
+// and checked to see whether or not the complete succeeded.
+//
// See http://goo.gl/2Z7Tw for details.
func (m *Multi) Complete(parts []Part) error {
params := map[string][]string{
@@ -356,6 +370,8 @@ func (m *Multi) Complete(parts []Part) error {
if err != nil {
return err
}
+
+ // Setting Content-Length prevents breakage on DreamObjects
for attempt := m.Bucket.S3.AttemptStrategy.Start(); attempt.Next(); {
req := &request{
method: "POST",
@@ -363,11 +379,25 @@ func (m *Multi) Complete(parts []Part) error {
path: m.Key,
params: params,
payload: bytes.NewReader(data),
+ headers: map[string][]string{
+ "Content-Length": []string{strconv.Itoa(len(data))},
+ },
}
- err := m.Bucket.S3.query(req, nil)
+
+ resp := &completeResponse{}
+ err := m.Bucket.S3.query(req, resp)
if shouldRetry(err) && attempt.HasNext() {
continue
}
+ if err == nil && resp.XMLName.Local == "Error" {
+ err = &Error{
+ StatusCode: 200,
+ Code: resp.Code,
+ Message: resp.Message,
+ RequestId: resp.RequestId,
+ HostId: resp.HostId,
+ }
+ }
return err
}
panic("unreachable")
diff --git a/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi_test.go b/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi_test.go
index efab302d6..5c788d9cc 100644
--- a/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi_test.go
+++ b/Godeps/_workspace/src/github.com/goamz/goamz/s3/multi_test.go
@@ -300,7 +300,9 @@ func (s *S) TestMultiComplete(c *C) {
c.Assert(err, IsNil)
err = multi.Complete([]s3.Part{{2, `"ETag2"`, 32}, {1, `"ETag1"`, 64}})
- c.Assert(err, IsNil)
+ // returns InternalErrorDump in the payload, which should manifest as
+ // an error.
+ c.Assert(err, NotNil)
testServer.WaitRequest()
req := testServer.WaitRequest()
diff --git a/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3.go b/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3.go
index 88ef975d1..9490c9b96 100644
--- a/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3.go
+++ b/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3.go
@@ -1101,10 +1101,14 @@ func shouldRetry(err error) bool {
}
case *Error:
switch e.Code {
- case "InternalError", "NoSuchUpload", "NoSuchBucket":
+ case "InternalError", "NoSuchUpload", "NoSuchBucket", "RequestTimeout":
return true
}
+ // let's handle tls handshake timeout issues and similar temporary errors
+ case net.Error:
+ return e.Temporary()
}
+
return false
}
diff --git a/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3test/server.go b/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3test/server.go
index 10d36924f..2016b5659 100644
--- a/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3test/server.go
+++ b/Godeps/_workspace/src/github.com/goamz/goamz/s3/s3test/server.go
@@ -594,6 +594,10 @@ func (objr objectResource) put(a *action) interface{} {
obj.checksum = gotHash
obj.mtime = time.Now()
objr.bucket.objects[objr.name] = obj
+
+ h := a.w.Header()
+ h.Set("ETag", fmt.Sprintf(`"%s"`, hex.EncodeToString(obj.checksum)))
+
return nil
}
diff --git a/Godeps/_workspace/src/github.com/goamz/goamz/s3/sign.go b/Godeps/_workspace/src/github.com/goamz/goamz/s3/sign.go
index c8e57a2f7..722d97d29 100644
--- a/Godeps/_workspace/src/github.com/goamz/goamz/s3/sign.go
+++ b/Godeps/_workspace/src/github.com/goamz/goamz/s3/sign.go
@@ -39,10 +39,37 @@ var s3ParamsToSign = map[string]bool{
"delete": true,
}
+type keySortableTupleList []keySortableTuple
+
+type keySortableTuple struct {
+ Key string
+ TupleString string
+}
+
+func (l keySortableTupleList) StringSlice() []string {
+ slice := make([]string, len(l))
+ for i, v := range l {
+ slice[i] = v.TupleString
+ }
+ return slice
+}
+
+func (l keySortableTupleList) Len() int {
+ return len(l)
+}
+
+func (l keySortableTupleList) Less(i, j int) bool {
+ return l[i].Key < l[j].Key
+}
+
+func (l keySortableTupleList) Swap(i, j int) {
+ l[i], l[j] = l[j], l[i]
+}
+
func sign(auth aws.Auth, method, canonicalPath string, params, headers map[string][]string) {
var md5, ctype, date, xamz string
var xamzDate bool
- var sarray []string
+ var sarray keySortableTupleList
for k, v := range headers {
k = strings.ToLower(k)
switch k {
@@ -57,7 +84,7 @@ func sign(auth aws.Auth, method, canonicalPath string, params, headers map[strin
default:
if strings.HasPrefix(k, "x-amz-") {
vall := strings.Join(v, ",")
- sarray = append(sarray, k+":"+vall)
+ sarray = append(sarray, keySortableTuple{k, k + ":" + vall})
if k == "x-amz-date" {
xamzDate = true
date = ""
@@ -66,8 +93,8 @@ func sign(auth aws.Auth, method, canonicalPath string, params, headers map[strin
}
}
if len(sarray) > 0 {
- sort.StringSlice(sarray).Sort()
- xamz = strings.Join(sarray, "\n") + "\n"
+ sort.Sort(sarray)
+ xamz = strings.Join(sarray.StringSlice(), "\n") + "\n"
}
expires := false
@@ -83,17 +110,17 @@ func sign(auth aws.Auth, method, canonicalPath string, params, headers map[strin
if s3ParamsToSign[k] {
for _, vi := range v {
if vi == "" {
- sarray = append(sarray, k)
+ sarray = append(sarray, keySortableTuple{k, k})
} else {
// "When signing you do not encode these values."
- sarray = append(sarray, k+"="+vi)
+ sarray = append(sarray, keySortableTuple{k, k + "=" + vi})
}
}
}
}
if len(sarray) > 0 {
- sort.StringSlice(sarray).Sort()
- canonicalPath = canonicalPath + "?" + strings.Join(sarray, "&")
+ sort.Sort(sarray)
+ canonicalPath = canonicalPath + "?" + strings.Join(sarray.StringSlice(), "&")
}
payload := method + "\n" + md5 + "\n" + ctype + "\n" + date + "\n" + xamz + canonicalPath