mirror of
https://github.com/willnorris/imageproxy.git
synced 2026-06-24 20:48:06 +02:00
update all vendored dependencies
This commit is contained in:
parent
0c20cbe5b5
commit
1933f5bf1c
284 changed files with 37534 additions and 11024 deletions
2
vendor/cloud.google.com/go/LICENSE
generated
vendored
2
vendor/cloud.google.com/go/LICENSE
generated
vendored
|
|
@ -187,7 +187,7 @@
|
||||||
same "printed page" as the copyright notice for easier
|
same "printed page" as the copyright notice for easier
|
||||||
identification within third-party archives.
|
identification within third-party archives.
|
||||||
|
|
||||||
Copyright 2014 Google Inc.
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
|
|
||||||
54
vendor/cloud.google.com/go/internal/annotate.go
generated
vendored
Normal file
54
vendor/cloud.google.com/go/internal/annotate.go
generated
vendored
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
// Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package internal
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"google.golang.org/api/googleapi"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Annotate prepends msg to the error message in err, attempting
|
||||||
|
// to preserve other information in err, like an error code.
|
||||||
|
//
|
||||||
|
// Annotate panics if err is nil.
|
||||||
|
//
|
||||||
|
// Annotate knows about these error types:
|
||||||
|
// - "google.golang.org/grpc/status".Status
|
||||||
|
// - "google.golang.org/api/googleapi".Error
|
||||||
|
// If the error is not one of these types, Annotate behaves
|
||||||
|
// like
|
||||||
|
// fmt.Errorf("%s: %v", msg, err)
|
||||||
|
func Annotate(err error, msg string) error {
|
||||||
|
if err == nil {
|
||||||
|
panic("Annotate called with nil")
|
||||||
|
}
|
||||||
|
if s, ok := status.FromError(err); ok {
|
||||||
|
p := s.Proto()
|
||||||
|
p.Message = msg + ": " + p.Message
|
||||||
|
return status.ErrorProto(p)
|
||||||
|
}
|
||||||
|
if g, ok := err.(*googleapi.Error); ok {
|
||||||
|
g.Message = msg + ": " + g.Message
|
||||||
|
return g
|
||||||
|
}
|
||||||
|
return fmt.Errorf("%s: %v", msg, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Annotatef uses format and args to format a string, then calls Annotate.
|
||||||
|
func Annotatef(err error, format string, args ...interface{}) error {
|
||||||
|
return Annotate(err, fmt.Sprintf(format, args...))
|
||||||
|
}
|
||||||
3
vendor/cloud.google.com/go/internal/retry.go
generated
vendored
3
vendor/cloud.google.com/go/internal/retry.go
generated
vendored
|
|
@ -15,7 +15,6 @@
|
||||||
package internal
|
package internal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
gax "github.com/googleapis/gax-go"
|
gax "github.com/googleapis/gax-go"
|
||||||
|
|
@ -48,7 +47,7 @@ func retry(ctx context.Context, bo gax.Backoff, f func() (stop bool, err error),
|
||||||
p := bo.Pause()
|
p := bo.Pause()
|
||||||
if cerr := sleep(ctx, p); cerr != nil {
|
if cerr := sleep(ctx, p); cerr != nil {
|
||||||
if lastErr != nil {
|
if lastErr != nil {
|
||||||
return fmt.Errorf("%v; last function err: %v", cerr, lastErr)
|
return Annotatef(lastErr, "retry failed with %v; last error", cerr)
|
||||||
}
|
}
|
||||||
return cerr
|
return cerr
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2
vendor/cloud.google.com/go/internal/version/version.go
generated
vendored
2
vendor/cloud.google.com/go/internal/version/version.go
generated
vendored
|
|
@ -26,7 +26,7 @@ import (
|
||||||
|
|
||||||
// Repo is the current version of the client libraries in this
|
// Repo is the current version of the client libraries in this
|
||||||
// repo. It should be a date in YYYYMMDD format.
|
// repo. It should be a date in YYYYMMDD format.
|
||||||
const Repo = "20170621"
|
const Repo = "20180118"
|
||||||
|
|
||||||
// Go returns the Go runtime version. The returned string
|
// Go returns the Go runtime version. The returned string
|
||||||
// has no whitespace.
|
// has no whitespace.
|
||||||
|
|
|
||||||
33
vendor/cloud.google.com/go/storage/acl.go
generated
vendored
33
vendor/cloud.google.com/go/storage/acl.go
generated
vendored
|
|
@ -15,7 +15,6 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
|
|
@ -106,21 +105,17 @@ func (a *ACLHandle) bucketDefaultList(ctx context.Context) ([]ACLRule, error) {
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("storage: error listing default object ACL for bucket %q: %v", a.bucket, err)
|
return nil, err
|
||||||
}
|
}
|
||||||
return toACLRules(acls.Items), nil
|
return toACLRules(acls.Items), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ACLHandle) bucketDefaultDelete(ctx context.Context, entity ACLEntity) error {
|
func (a *ACLHandle) bucketDefaultDelete(ctx context.Context, entity ACLEntity) error {
|
||||||
err := runWithRetry(ctx, func() error {
|
return runWithRetry(ctx, func() error {
|
||||||
req := a.c.raw.DefaultObjectAccessControls.Delete(a.bucket, string(entity))
|
req := a.c.raw.DefaultObjectAccessControls.Delete(a.bucket, string(entity))
|
||||||
a.configureCall(req, ctx)
|
a.configureCall(req, ctx)
|
||||||
return req.Do()
|
return req.Do()
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("storage: error deleting default ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ACLHandle) bucketList(ctx context.Context) ([]ACLRule, error) {
|
func (a *ACLHandle) bucketList(ctx context.Context) ([]ACLRule, error) {
|
||||||
|
|
@ -133,7 +128,7 @@ func (a *ACLHandle) bucketList(ctx context.Context) ([]ACLRule, error) {
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("storage: error listing bucket ACL for bucket %q: %v", a.bucket, err)
|
return nil, err
|
||||||
}
|
}
|
||||||
r := make([]ACLRule, len(acls.Items))
|
r := make([]ACLRule, len(acls.Items))
|
||||||
for i, v := range acls.Items {
|
for i, v := range acls.Items {
|
||||||
|
|
@ -156,7 +151,7 @@ func (a *ACLHandle) bucketSet(ctx context.Context, entity ACLEntity, role ACLRol
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("storage: error updating bucket ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -168,7 +163,7 @@ func (a *ACLHandle) bucketDelete(ctx context.Context, entity ACLEntity) error {
|
||||||
return req.Do()
|
return req.Do()
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("storage: error deleting bucket ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -183,7 +178,7 @@ func (a *ACLHandle) objectList(ctx context.Context) ([]ACLRule, error) {
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("storage: error listing object ACL for bucket %q, file %q: %v", a.bucket, a.object, err)
|
return nil, err
|
||||||
}
|
}
|
||||||
return toACLRules(acls.Items), nil
|
return toACLRules(acls.Items), nil
|
||||||
}
|
}
|
||||||
|
|
@ -206,30 +201,18 @@ func (a *ACLHandle) objectSet(ctx context.Context, entity ACLEntity, role ACLRol
|
||||||
req = a.c.raw.ObjectAccessControls.Update(a.bucket, a.object, string(entity), acl)
|
req = a.c.raw.ObjectAccessControls.Update(a.bucket, a.object, string(entity), acl)
|
||||||
}
|
}
|
||||||
a.configureCall(req, ctx)
|
a.configureCall(req, ctx)
|
||||||
err := runWithRetry(ctx, func() error {
|
return runWithRetry(ctx, func() error {
|
||||||
_, err := req.Do()
|
_, err := req.Do()
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
if isBucketDefault {
|
|
||||||
return fmt.Errorf("storage: error updating default ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
|
|
||||||
} else {
|
|
||||||
return fmt.Errorf("storage: error updating object ACL entry for bucket %q, object %q, entity %q: %v", a.bucket, a.object, entity, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ACLHandle) objectDelete(ctx context.Context, entity ACLEntity) error {
|
func (a *ACLHandle) objectDelete(ctx context.Context, entity ACLEntity) error {
|
||||||
err := runWithRetry(ctx, func() error {
|
return runWithRetry(ctx, func() error {
|
||||||
req := a.c.raw.ObjectAccessControls.Delete(a.bucket, a.object, string(entity))
|
req := a.c.raw.ObjectAccessControls.Delete(a.bucket, a.object, string(entity))
|
||||||
a.configureCall(req, ctx)
|
a.configureCall(req, ctx)
|
||||||
return req.Do()
|
return req.Do()
|
||||||
})
|
})
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("storage: error deleting object ACL entry for bucket %q, file %q, entity %q: %v", a.bucket, a.object, entity, err)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *ACLHandle) configureCall(call interface {
|
func (a *ACLHandle) configureCall(call interface {
|
||||||
|
|
|
||||||
17
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
17
vendor/cloud.google.com/go/storage/bucket.go
generated
vendored
|
|
@ -35,7 +35,7 @@ type BucketHandle struct {
|
||||||
acl ACLHandle
|
acl ACLHandle
|
||||||
defaultObjectACL ACLHandle
|
defaultObjectACL ACLHandle
|
||||||
conds *BucketConditions
|
conds *BucketConditions
|
||||||
userProject string // project for requester-pays buckets
|
userProject string // project for Requester Pays buckets
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bucket returns a BucketHandle, which provides operations on the named bucket.
|
// Bucket returns a BucketHandle, which provides operations on the named bucket.
|
||||||
|
|
@ -197,8 +197,10 @@ func (b *BucketHandle) newPatchCall(uattrs *BucketAttrsToUpdate) (*raw.BucketsPa
|
||||||
}
|
}
|
||||||
|
|
||||||
// BucketAttrs represents the metadata for a Google Cloud Storage bucket.
|
// BucketAttrs represents the metadata for a Google Cloud Storage bucket.
|
||||||
|
// Read-only fields are ignored by BucketHandle.Create.
|
||||||
type BucketAttrs struct {
|
type BucketAttrs struct {
|
||||||
// Name is the name of the bucket.
|
// Name is the name of the bucket.
|
||||||
|
// This field is read-only.
|
||||||
Name string
|
Name string
|
||||||
|
|
||||||
// ACL is the list of access control rules on the bucket.
|
// ACL is the list of access control rules on the bucket.
|
||||||
|
|
@ -212,6 +214,7 @@ type BucketAttrs struct {
|
||||||
Location string
|
Location string
|
||||||
|
|
||||||
// MetaGeneration is the metadata generation of the bucket.
|
// MetaGeneration is the metadata generation of the bucket.
|
||||||
|
// This field is read-only.
|
||||||
MetaGeneration int64
|
MetaGeneration int64
|
||||||
|
|
||||||
// StorageClass is the default storage class of the bucket. This defines
|
// StorageClass is the default storage class of the bucket. This defines
|
||||||
|
|
@ -224,16 +227,19 @@ type BucketAttrs struct {
|
||||||
StorageClass string
|
StorageClass string
|
||||||
|
|
||||||
// Created is the creation time of the bucket.
|
// Created is the creation time of the bucket.
|
||||||
|
// This field is read-only.
|
||||||
Created time.Time
|
Created time.Time
|
||||||
|
|
||||||
// VersioningEnabled reports whether this bucket has versioning enabled.
|
// VersioningEnabled reports whether this bucket has versioning enabled.
|
||||||
// This field is read-only.
|
|
||||||
VersioningEnabled bool
|
VersioningEnabled bool
|
||||||
|
|
||||||
// Labels are the bucket's labels.
|
// Labels are the bucket's labels.
|
||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
|
|
||||||
// RequesterPays reports whether the bucket is a Requester Pays bucket.
|
// RequesterPays reports whether the bucket is a Requester Pays bucket.
|
||||||
|
// Clients performing operations on Requester Pays buckets must provide
|
||||||
|
// a user project (see BucketHandle.UserProject), which will be billed
|
||||||
|
// for the operations.
|
||||||
RequesterPays bool
|
RequesterPays bool
|
||||||
// Lifecycle is the lifecycle configuration for objects in the bucket.
|
// Lifecycle is the lifecycle configuration for objects in the bucket.
|
||||||
Lifecycle Lifecycle
|
Lifecycle Lifecycle
|
||||||
|
|
@ -503,8 +509,10 @@ func (c *BucketConditions) validate(method string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// UserProject returns a new BucketHandle that passes the project ID as the user
|
// UserProject returns a new BucketHandle that passes the project ID as the user
|
||||||
// project for all subsequent calls. A user project is required for all operations
|
// project for all subsequent calls. Calls with a user project will be billed to that
|
||||||
// on requester-pays buckets.
|
// project rather than to the bucket's owning project.
|
||||||
|
//
|
||||||
|
// A user project is required for all operations on Requester Pays buckets.
|
||||||
func (b *BucketHandle) UserProject(projectID string) *BucketHandle {
|
func (b *BucketHandle) UserProject(projectID string) *BucketHandle {
|
||||||
b2 := *b
|
b2 := *b
|
||||||
b2.userProject = projectID
|
b2.userProject = projectID
|
||||||
|
|
@ -601,6 +609,7 @@ func toLifecycle(rl *raw.BucketLifecycle) Lifecycle {
|
||||||
if rr.Condition.CreatedBefore != "" {
|
if rr.Condition.CreatedBefore != "" {
|
||||||
r.Condition.CreatedBefore, _ = time.Parse(rfc3339Date, rr.Condition.CreatedBefore)
|
r.Condition.CreatedBefore, _ = time.Parse(rfc3339Date, rr.Condition.CreatedBefore)
|
||||||
}
|
}
|
||||||
|
l.Rules = append(l.Rules, r)
|
||||||
}
|
}
|
||||||
return l
|
return l
|
||||||
}
|
}
|
||||||
|
|
|
||||||
9
vendor/cloud.google.com/go/storage/doc.go
generated
vendored
9
vendor/cloud.google.com/go/storage/doc.go
generated
vendored
|
|
@ -23,8 +23,6 @@ All of the methods of this package use exponential backoff to retry calls
|
||||||
that fail with certain errors, as described in
|
that fail with certain errors, as described in
|
||||||
https://cloud.google.com/storage/docs/exponential-backoff.
|
https://cloud.google.com/storage/docs/exponential-backoff.
|
||||||
|
|
||||||
Note: This package is in beta. Some backwards-incompatible changes may occur.
|
|
||||||
|
|
||||||
|
|
||||||
Creating a Client
|
Creating a Client
|
||||||
|
|
||||||
|
|
@ -36,6 +34,13 @@ To start working with this package, create a client:
|
||||||
// TODO: Handle error.
|
// TODO: Handle error.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
The client will use your default application credentials.
|
||||||
|
|
||||||
|
If you only wish to access public data, you can create
|
||||||
|
an unauthenticated client with
|
||||||
|
|
||||||
|
client, err := storage.NewClient(ctx, option.WithoutAuthentication())
|
||||||
|
|
||||||
Buckets
|
Buckets
|
||||||
|
|
||||||
A Google Cloud Storage bucket is a collection of objects. To work with a
|
A Google Cloud Storage bucket is a collection of objects. To work with a
|
||||||
|
|
|
||||||
35
vendor/cloud.google.com/go/storage/iam.go
generated
vendored
35
vendor/cloud.google.com/go/storage/iam.go
generated
vendored
|
|
@ -23,21 +23,28 @@ import (
|
||||||
|
|
||||||
// IAM provides access to IAM access control for the bucket.
|
// IAM provides access to IAM access control for the bucket.
|
||||||
func (b *BucketHandle) IAM() *iam.Handle {
|
func (b *BucketHandle) IAM() *iam.Handle {
|
||||||
return iam.InternalNewHandleClient(&iamClient{raw: b.c.raw}, b.name)
|
return iam.InternalNewHandleClient(&iamClient{
|
||||||
|
raw: b.c.raw,
|
||||||
|
userProject: b.userProject,
|
||||||
|
}, b.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// iamClient implements the iam.client interface.
|
// iamClient implements the iam.client interface.
|
||||||
type iamClient struct {
|
type iamClient struct {
|
||||||
raw *raw.Service
|
raw *raw.Service
|
||||||
|
userProject string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *iamClient) Get(ctx context.Context, resource string) (*iampb.Policy, error) {
|
func (c *iamClient) Get(ctx context.Context, resource string) (*iampb.Policy, error) {
|
||||||
req := c.raw.Buckets.GetIamPolicy(resource)
|
call := c.raw.Buckets.GetIamPolicy(resource)
|
||||||
setClientHeader(req.Header())
|
setClientHeader(call.Header())
|
||||||
|
if c.userProject != "" {
|
||||||
|
call.UserProject(c.userProject)
|
||||||
|
}
|
||||||
var rp *raw.Policy
|
var rp *raw.Policy
|
||||||
var err error
|
var err error
|
||||||
err = runWithRetry(ctx, func() error {
|
err = runWithRetry(ctx, func() error {
|
||||||
rp, err = req.Context(ctx).Do()
|
rp, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -48,21 +55,27 @@ func (c *iamClient) Get(ctx context.Context, resource string) (*iampb.Policy, er
|
||||||
|
|
||||||
func (c *iamClient) Set(ctx context.Context, resource string, p *iampb.Policy) error {
|
func (c *iamClient) Set(ctx context.Context, resource string, p *iampb.Policy) error {
|
||||||
rp := iamToStoragePolicy(p)
|
rp := iamToStoragePolicy(p)
|
||||||
req := c.raw.Buckets.SetIamPolicy(resource, rp)
|
call := c.raw.Buckets.SetIamPolicy(resource, rp)
|
||||||
setClientHeader(req.Header())
|
setClientHeader(call.Header())
|
||||||
|
if c.userProject != "" {
|
||||||
|
call.UserProject(c.userProject)
|
||||||
|
}
|
||||||
return runWithRetry(ctx, func() error {
|
return runWithRetry(ctx, func() error {
|
||||||
_, err := req.Context(ctx).Do()
|
_, err := call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *iamClient) Test(ctx context.Context, resource string, perms []string) ([]string, error) {
|
func (c *iamClient) Test(ctx context.Context, resource string, perms []string) ([]string, error) {
|
||||||
req := c.raw.Buckets.TestIamPermissions(resource, perms)
|
call := c.raw.Buckets.TestIamPermissions(resource, perms)
|
||||||
setClientHeader(req.Header())
|
setClientHeader(call.Header())
|
||||||
|
if c.userProject != "" {
|
||||||
|
call.UserProject(c.userProject)
|
||||||
|
}
|
||||||
var res *raw.TestIamPermissionsResponse
|
var res *raw.TestIamPermissionsResponse
|
||||||
var err error
|
var err error
|
||||||
err = runWithRetry(ctx, func() error {
|
err = runWithRetry(ctx, func() error {
|
||||||
res, err = req.Context(ctx).Do()
|
res, err = call.Context(ctx).Do()
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
179
vendor/cloud.google.com/go/storage/notifications.go
generated
vendored
Normal file
179
vendor/cloud.google.com/go/storage/notifications.go
generated
vendored
Normal file
|
|
@ -0,0 +1,179 @@
|
||||||
|
// Copyright 2017 Google Inc. All Rights Reserved.
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"regexp"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
raw "google.golang.org/api/storage/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Notification describes how to send Cloud PubSub messages when certain
|
||||||
|
// events occur in a bucket.
|
||||||
|
type Notification struct {
|
||||||
|
//The ID of the notification.
|
||||||
|
ID string
|
||||||
|
|
||||||
|
// The ID of the topic to which this subscription publishes.
|
||||||
|
TopicID string
|
||||||
|
|
||||||
|
// The ID of the project to which the topic belongs.
|
||||||
|
TopicProjectID string
|
||||||
|
|
||||||
|
// Only send notifications about listed event types. If empty, send notifications
|
||||||
|
// for all event types.
|
||||||
|
// See https://cloud.google.com/storage/docs/pubsub-notifications#events.
|
||||||
|
EventTypes []string
|
||||||
|
|
||||||
|
// If present, only apply this notification configuration to object names that
|
||||||
|
// begin with this prefix.
|
||||||
|
ObjectNamePrefix string
|
||||||
|
|
||||||
|
// An optional list of additional attributes to attach to each Cloud PubSub
|
||||||
|
// message published for this notification subscription.
|
||||||
|
CustomAttributes map[string]string
|
||||||
|
|
||||||
|
// The contents of the message payload.
|
||||||
|
// See https://cloud.google.com/storage/docs/pubsub-notifications#payload.
|
||||||
|
PayloadFormat string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Values for Notification.PayloadFormat.
|
||||||
|
const (
|
||||||
|
// Send no payload with notification messages.
|
||||||
|
NoPayload = "NONE"
|
||||||
|
|
||||||
|
// Send object metadata as JSON with notification messages.
|
||||||
|
JSONPayload = "JSON_API_V1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Values for Notification.EventTypes.
|
||||||
|
const (
|
||||||
|
// Event that occurs when an object is successfully created.
|
||||||
|
ObjectFinalizeEvent = "OBJECT_FINALIZE"
|
||||||
|
|
||||||
|
// Event that occurs when the metadata of an existing object changes.
|
||||||
|
ObjectMetadataUpdateEvent = "OBJECT_METADATA_UPDATE"
|
||||||
|
|
||||||
|
// Event that occurs when an object is permanently deleted.
|
||||||
|
ObjectDeleteEvent = "OBJECT_DELETE"
|
||||||
|
|
||||||
|
// Event that occurs when the live version of an object becomes an
|
||||||
|
// archived version.
|
||||||
|
ObjectArchiveEvent = "OBJECT_ARCHIVE"
|
||||||
|
)
|
||||||
|
|
||||||
|
func toNotification(rn *raw.Notification) *Notification {
|
||||||
|
n := &Notification{
|
||||||
|
ID: rn.Id,
|
||||||
|
EventTypes: rn.EventTypes,
|
||||||
|
ObjectNamePrefix: rn.ObjectNamePrefix,
|
||||||
|
CustomAttributes: rn.CustomAttributes,
|
||||||
|
PayloadFormat: rn.PayloadFormat,
|
||||||
|
}
|
||||||
|
n.TopicProjectID, n.TopicID = parseNotificationTopic(rn.Topic)
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
var topicRE = regexp.MustCompile("^//pubsub.googleapis.com/projects/([^/]+)/topics/([^/]+)")
|
||||||
|
|
||||||
|
// parseNotificationTopic extracts the project and topic IDs from from the full
|
||||||
|
// resource name returned by the service. If the name is malformed, it returns
|
||||||
|
// "?" for both IDs.
|
||||||
|
func parseNotificationTopic(nt string) (projectID, topicID string) {
|
||||||
|
matches := topicRE.FindStringSubmatch(nt)
|
||||||
|
if matches == nil {
|
||||||
|
return "?", "?"
|
||||||
|
}
|
||||||
|
return matches[1], matches[2]
|
||||||
|
}
|
||||||
|
|
||||||
|
func toRawNotification(n *Notification) *raw.Notification {
|
||||||
|
return &raw.Notification{
|
||||||
|
Id: n.ID,
|
||||||
|
Topic: fmt.Sprintf("//pubsub.googleapis.com/projects/%s/topics/%s",
|
||||||
|
n.TopicProjectID, n.TopicID),
|
||||||
|
EventTypes: n.EventTypes,
|
||||||
|
ObjectNamePrefix: n.ObjectNamePrefix,
|
||||||
|
CustomAttributes: n.CustomAttributes,
|
||||||
|
PayloadFormat: string(n.PayloadFormat),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddNotification adds a notification to b. You must set n's TopicProjectID, TopicID
|
||||||
|
// and PayloadFormat, and must not set its ID. The other fields are all optional. The
|
||||||
|
// returned Notification's ID can be used to refer to it.
|
||||||
|
func (b *BucketHandle) AddNotification(ctx context.Context, n *Notification) (*Notification, error) {
|
||||||
|
if n.ID != "" {
|
||||||
|
return nil, errors.New("storage: AddNotification: ID must not be set")
|
||||||
|
}
|
||||||
|
if n.TopicProjectID == "" {
|
||||||
|
return nil, errors.New("storage: AddNotification: missing TopicProjectID")
|
||||||
|
}
|
||||||
|
if n.TopicID == "" {
|
||||||
|
return nil, errors.New("storage: AddNotification: missing TopicID")
|
||||||
|
}
|
||||||
|
call := b.c.raw.Notifications.Insert(b.name, toRawNotification(n))
|
||||||
|
setClientHeader(call.Header())
|
||||||
|
if b.userProject != "" {
|
||||||
|
call.UserProject(b.userProject)
|
||||||
|
}
|
||||||
|
rn, err := call.Context(ctx).Do()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return toNotification(rn), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notifications returns all the Notifications configured for this bucket, as a map
|
||||||
|
// indexed by notification ID.
|
||||||
|
func (b *BucketHandle) Notifications(ctx context.Context) (map[string]*Notification, error) {
|
||||||
|
call := b.c.raw.Notifications.List(b.name)
|
||||||
|
setClientHeader(call.Header())
|
||||||
|
if b.userProject != "" {
|
||||||
|
call.UserProject(b.userProject)
|
||||||
|
}
|
||||||
|
var res *raw.Notifications
|
||||||
|
var err error
|
||||||
|
err = runWithRetry(ctx, func() error {
|
||||||
|
res, err = call.Context(ctx).Do()
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return notificationsToMap(res.Items), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func notificationsToMap(rns []*raw.Notification) map[string]*Notification {
|
||||||
|
m := map[string]*Notification{}
|
||||||
|
for _, rn := range rns {
|
||||||
|
m[rn.Id] = toNotification(rn)
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteNotification deletes the notification with the given ID.
|
||||||
|
func (b *BucketHandle) DeleteNotification(ctx context.Context, id string) error {
|
||||||
|
call := b.c.raw.Notifications.Delete(b.name, id)
|
||||||
|
setClientHeader(call.Header())
|
||||||
|
if b.userProject != "" {
|
||||||
|
call.UserProject(b.userProject)
|
||||||
|
}
|
||||||
|
return call.Context(ctx).Do()
|
||||||
|
}
|
||||||
34
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
34
vendor/cloud.google.com/go/storage/reader.go
generated
vendored
|
|
@ -24,14 +24,20 @@ var crc32cTable = crc32.MakeTable(crc32.Castagnoli)
|
||||||
|
|
||||||
// Reader reads a Cloud Storage object.
|
// Reader reads a Cloud Storage object.
|
||||||
// It implements io.Reader.
|
// It implements io.Reader.
|
||||||
|
//
|
||||||
|
// Typically, a Reader computes the CRC of the downloaded content and compares it to
|
||||||
|
// the stored CRC, returning an error from Read if there is a mismatch. This integrity check
|
||||||
|
// is skipped if transcoding occurs. See https://cloud.google.com/storage/docs/transcoding.
|
||||||
type Reader struct {
|
type Reader struct {
|
||||||
body io.ReadCloser
|
body io.ReadCloser
|
||||||
remain, size int64
|
remain, size int64
|
||||||
contentType string
|
contentType string
|
||||||
cacheControl string
|
contentEncoding string
|
||||||
checkCRC bool // should we check the CRC?
|
cacheControl string
|
||||||
wantCRC uint32 // the CRC32c value the server sent in the header
|
checkCRC bool // should we check the CRC?
|
||||||
gotCRC uint32 // running crc
|
wantCRC uint32 // the CRC32c value the server sent in the header
|
||||||
|
gotCRC uint32 // running crc
|
||||||
|
checkedCRC bool // did we check the CRC? (For tests.)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes the Reader. It must be called when done reading.
|
// Close closes the Reader. It must be called when done reading.
|
||||||
|
|
@ -49,9 +55,12 @@ func (r *Reader) Read(p []byte) (int, error) {
|
||||||
// Check CRC here. It would be natural to check it in Close, but
|
// Check CRC here. It would be natural to check it in Close, but
|
||||||
// everybody defers Close on the assumption that it doesn't return
|
// everybody defers Close on the assumption that it doesn't return
|
||||||
// anything worth looking at.
|
// anything worth looking at.
|
||||||
if r.remain == 0 && r.gotCRC != r.wantCRC {
|
if r.remain == 0 { // Only check if we have Content-Length.
|
||||||
return n, fmt.Errorf("storage: bad CRC on read: got %d, want %d",
|
r.checkedCRC = true
|
||||||
r.gotCRC, r.wantCRC)
|
if r.gotCRC != r.wantCRC {
|
||||||
|
return n, fmt.Errorf("storage: bad CRC on read: got %d, want %d",
|
||||||
|
r.gotCRC, r.wantCRC)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return n, err
|
return n, err
|
||||||
|
|
@ -74,6 +83,11 @@ func (r *Reader) ContentType() string {
|
||||||
return r.contentType
|
return r.contentType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContentEncoding returns the content encoding of the object.
|
||||||
|
func (r *Reader) ContentEncoding() string {
|
||||||
|
return r.contentEncoding
|
||||||
|
}
|
||||||
|
|
||||||
// CacheControl returns the cache control of the object.
|
// CacheControl returns the cache control of the object.
|
||||||
func (r *Reader) CacheControl() string {
|
func (r *Reader) CacheControl() string {
|
||||||
return r.cacheControl
|
return r.cacheControl
|
||||||
|
|
|
||||||
123
vendor/cloud.google.com/go/storage/storage.go
generated
vendored
123
vendor/cloud.google.com/go/storage/storage.go
generated
vendored
|
|
@ -30,6 +30,8 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"regexp"
|
||||||
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -110,7 +112,10 @@ func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error
|
||||||
//
|
//
|
||||||
// Close need not be called at program exit.
|
// Close need not be called at program exit.
|
||||||
func (c *Client) Close() error {
|
func (c *Client) Close() error {
|
||||||
|
// Set fields to nil so that subsequent uses
|
||||||
|
// will panic.
|
||||||
c.hc = nil
|
c.hc = nil
|
||||||
|
c.raw = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -167,7 +172,7 @@ type SignedURLOptions struct {
|
||||||
// Optional.
|
// Optional.
|
||||||
ContentType string
|
ContentType string
|
||||||
|
|
||||||
// Headers is a list of extention headers the client must provide
|
// Headers is a list of extension headers the client must provide
|
||||||
// in order to use the generated signed URL.
|
// in order to use the generated signed URL.
|
||||||
// Optional.
|
// Optional.
|
||||||
Headers []string
|
Headers []string
|
||||||
|
|
@ -179,6 +184,60 @@ type SignedURLOptions struct {
|
||||||
MD5 string
|
MD5 string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
canonicalHeaderRegexp = regexp.MustCompile(`(?i)^(x-goog-[^:]+):(.*)?$`)
|
||||||
|
excludedCanonicalHeaders = map[string]bool{
|
||||||
|
"x-goog-encryption-key": true,
|
||||||
|
"x-goog-encryption-key-sha256": true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// sanitizeHeaders applies the specifications for canonical extension headers at
|
||||||
|
// https://cloud.google.com/storage/docs/access-control/signed-urls#about-canonical-extension-headers.
|
||||||
|
func sanitizeHeaders(hdrs []string) []string {
|
||||||
|
headerMap := map[string][]string{}
|
||||||
|
for _, hdr := range hdrs {
|
||||||
|
// No leading or trailing whitespaces.
|
||||||
|
sanitizedHeader := strings.TrimSpace(hdr)
|
||||||
|
|
||||||
|
// Only keep canonical headers, discard any others.
|
||||||
|
headerMatches := canonicalHeaderRegexp.FindStringSubmatch(sanitizedHeader)
|
||||||
|
if len(headerMatches) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
header := strings.ToLower(strings.TrimSpace(headerMatches[1]))
|
||||||
|
if excludedCanonicalHeaders[headerMatches[1]] {
|
||||||
|
// Do not keep any deliberately excluded canonical headers when signing.
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
value := strings.TrimSpace(headerMatches[2])
|
||||||
|
if len(value) > 0 {
|
||||||
|
// Remove duplicate headers by appending the values of duplicates
|
||||||
|
// in their order of appearance.
|
||||||
|
headerMap[header] = append(headerMap[header], value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var sanitizedHeaders []string
|
||||||
|
for header, values := range headerMap {
|
||||||
|
// There should be no spaces around the colon separating the
|
||||||
|
// header name from the header value or around the values
|
||||||
|
// themselves. The values should be separated by commas.
|
||||||
|
// NOTE: The semantics for headers without a value are not clear.
|
||||||
|
// However from specifications these should be edge-cases
|
||||||
|
// anyway and we should assume that there will be no
|
||||||
|
// canonical headers using empty values. Any such headers
|
||||||
|
// are discarded at the regexp stage above.
|
||||||
|
sanitizedHeaders = append(
|
||||||
|
sanitizedHeaders,
|
||||||
|
fmt.Sprintf("%s:%s", header, strings.Join(values, ",")),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
sort.Strings(sanitizedHeaders)
|
||||||
|
return sanitizedHeaders
|
||||||
|
}
|
||||||
|
|
||||||
// SignedURL returns a URL for the specified object. Signed URLs allow
|
// SignedURL returns a URL for the specified object. Signed URLs allow
|
||||||
// the users access to a restricted resource for a limited time without having a
|
// the users access to a restricted resource for a limited time without having a
|
||||||
// Google account or signing in. For more information about the signed
|
// Google account or signing in. For more information about the signed
|
||||||
|
|
@ -205,6 +264,7 @@ func SignedURL(bucket, name string, opts *SignedURLOptions) (string, error) {
|
||||||
return "", errors.New("storage: invalid MD5 checksum")
|
return "", errors.New("storage: invalid MD5 checksum")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
opts.Headers = sanitizeHeaders(opts.Headers)
|
||||||
|
|
||||||
signBytes := opts.SignBytes
|
signBytes := opts.SignBytes
|
||||||
if opts.PrivateKey != nil {
|
if opts.PrivateKey != nil {
|
||||||
|
|
@ -255,14 +315,15 @@ func SignedURL(bucket, name string, opts *SignedURLOptions) (string, error) {
|
||||||
// ObjectHandle provides operations on an object in a Google Cloud Storage bucket.
|
// ObjectHandle provides operations on an object in a Google Cloud Storage bucket.
|
||||||
// Use BucketHandle.Object to get a handle.
|
// Use BucketHandle.Object to get a handle.
|
||||||
type ObjectHandle struct {
|
type ObjectHandle struct {
|
||||||
c *Client
|
c *Client
|
||||||
bucket string
|
bucket string
|
||||||
object string
|
object string
|
||||||
acl ACLHandle
|
acl ACLHandle
|
||||||
gen int64 // a negative value indicates latest
|
gen int64 // a negative value indicates latest
|
||||||
conds *Conditions
|
conds *Conditions
|
||||||
encryptionKey []byte // AES-256 key
|
encryptionKey []byte // AES-256 key
|
||||||
userProject string // for requester-pays buckets
|
userProject string // for requester-pays buckets
|
||||||
|
readCompressed bool // Accept-Encoding: gzip
|
||||||
}
|
}
|
||||||
|
|
||||||
// ACL provides access to the object's access control list.
|
// ACL provides access to the object's access control list.
|
||||||
|
|
@ -346,11 +407,17 @@ func (o *ObjectHandle) Update(ctx context.Context, uattrs ObjectAttrsToUpdate) (
|
||||||
var forceSendFields, nullFields []string
|
var forceSendFields, nullFields []string
|
||||||
if uattrs.ContentType != nil {
|
if uattrs.ContentType != nil {
|
||||||
attrs.ContentType = optional.ToString(uattrs.ContentType)
|
attrs.ContentType = optional.ToString(uattrs.ContentType)
|
||||||
forceSendFields = append(forceSendFields, "ContentType")
|
// For ContentType, sending the empty string is a no-op.
|
||||||
|
// Instead we send a null.
|
||||||
|
if attrs.ContentType == "" {
|
||||||
|
nullFields = append(nullFields, "ContentType")
|
||||||
|
} else {
|
||||||
|
forceSendFields = append(forceSendFields, "ContentType")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if uattrs.ContentLanguage != nil {
|
if uattrs.ContentLanguage != nil {
|
||||||
attrs.ContentLanguage = optional.ToString(uattrs.ContentLanguage)
|
attrs.ContentLanguage = optional.ToString(uattrs.ContentLanguage)
|
||||||
// For ContentLanguage It's an error to send the empty string.
|
// For ContentLanguage it's an error to send the empty string.
|
||||||
// Instead we send a null.
|
// Instead we send a null.
|
||||||
if attrs.ContentLanguage == "" {
|
if attrs.ContentLanguage == "" {
|
||||||
nullFields = append(nullFields, "ContentLanguage")
|
nullFields = append(nullFields, "ContentLanguage")
|
||||||
|
|
@ -458,6 +525,13 @@ func (o *ObjectHandle) Delete(ctx context.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadCompressed when true causes the read to happen without decompressing.
|
||||||
|
func (o *ObjectHandle) ReadCompressed(compressed bool) *ObjectHandle {
|
||||||
|
o2 := *o
|
||||||
|
o2.readCompressed = compressed
|
||||||
|
return &o2
|
||||||
|
}
|
||||||
|
|
||||||
// NewReader creates a new Reader to read the contents of the
|
// NewReader creates a new Reader to read the contents of the
|
||||||
// object.
|
// object.
|
||||||
// ErrObjectNotExist will be returned if the object is not found.
|
// ErrObjectNotExist will be returned if the object is not found.
|
||||||
|
|
@ -505,6 +579,9 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||||
if o.userProject != "" {
|
if o.userProject != "" {
|
||||||
req.Header.Set("X-Goog-User-Project", o.userProject)
|
req.Header.Set("X-Goog-User-Project", o.userProject)
|
||||||
}
|
}
|
||||||
|
if o.readCompressed {
|
||||||
|
req.Header.Set("Accept-Encoding", "gzip")
|
||||||
|
}
|
||||||
if err := setEncryptionHeaders(req.Header, o.encryptionKey, false); err != nil {
|
if err := setEncryptionHeaders(req.Header, o.encryptionKey, false); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
@ -567,13 +644,14 @@ func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64)
|
||||||
crc, checkCRC = parseCRC32c(res)
|
crc, checkCRC = parseCRC32c(res)
|
||||||
}
|
}
|
||||||
return &Reader{
|
return &Reader{
|
||||||
body: body,
|
body: body,
|
||||||
size: size,
|
size: size,
|
||||||
remain: remain,
|
remain: remain,
|
||||||
contentType: res.Header.Get("Content-Type"),
|
contentType: res.Header.Get("Content-Type"),
|
||||||
cacheControl: res.Header.Get("Cache-Control"),
|
contentEncoding: res.Header.Get("Content-Encoding"),
|
||||||
wantCRC: crc,
|
cacheControl: res.Header.Get("Cache-Control"),
|
||||||
checkCRC: checkCRC,
|
wantCRC: crc,
|
||||||
|
checkCRC: checkCRC,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -629,11 +707,10 @@ func (o *ObjectHandle) validate() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseKey converts the binary contents of a private key file
|
// parseKey converts the binary contents of a private key file to an
|
||||||
// to an *rsa.PrivateKey. It detects whether the private key is in a
|
// *rsa.PrivateKey. It detects whether the private key is in a PEM container or
|
||||||
// PEM container or not. If so, it extracts the the private key
|
// not. If so, it extracts the private key from PEM container before
|
||||||
// from PEM container before conversion. It only supports PEM
|
// conversion. It only supports PEM containers with no passphrase.
|
||||||
// containers with no passphrase.
|
|
||||||
func parseKey(key []byte) (*rsa.PrivateKey, error) {
|
func parseKey(key []byte) (*rsa.PrivateKey, error) {
|
||||||
if block, _ := pem.Decode(key); block != nil {
|
if block, _ := pem.Decode(key); block != nil {
|
||||||
key = block.Bytes
|
key = block.Bytes
|
||||||
|
|
|
||||||
49
vendor/cloud.google.com/go/storage/writer.go
generated
vendored
49
vendor/cloud.google.com/go/storage/writer.go
generated
vendored
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"sync"
|
||||||
"unicode/utf8"
|
"unicode/utf8"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
@ -68,8 +69,10 @@ type Writer struct {
|
||||||
pw *io.PipeWriter
|
pw *io.PipeWriter
|
||||||
|
|
||||||
donec chan struct{} // closed after err and obj are set.
|
donec chan struct{} // closed after err and obj are set.
|
||||||
err error
|
|
||||||
obj *ObjectAttrs
|
obj *ObjectAttrs
|
||||||
|
|
||||||
|
mu sync.Mutex
|
||||||
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) open() error {
|
func (w *Writer) open() error {
|
||||||
|
|
@ -87,7 +90,7 @@ func (w *Writer) open() error {
|
||||||
w.opened = true
|
w.opened = true
|
||||||
|
|
||||||
if w.ChunkSize < 0 {
|
if w.ChunkSize < 0 {
|
||||||
return errors.New("storage: Writer.ChunkSize must non-negative")
|
return errors.New("storage: Writer.ChunkSize must be non-negative")
|
||||||
}
|
}
|
||||||
mediaOpts := []googleapi.MediaOption{
|
mediaOpts := []googleapi.MediaOption{
|
||||||
googleapi.ChunkSize(w.ChunkSize),
|
googleapi.ChunkSize(w.ChunkSize),
|
||||||
|
|
@ -114,8 +117,10 @@ func (w *Writer) open() error {
|
||||||
call.ProgressUpdater(func(n, _ int64) { w.ProgressFunc(n) })
|
call.ProgressUpdater(func(n, _ int64) { w.ProgressFunc(n) })
|
||||||
}
|
}
|
||||||
if err := setEncryptionHeaders(call.Header(), w.o.encryptionKey, false); err != nil {
|
if err := setEncryptionHeaders(call.Header(), w.o.encryptionKey, false); err != nil {
|
||||||
|
w.mu.Lock()
|
||||||
w.err = err
|
w.err = err
|
||||||
pr.CloseWithError(w.err)
|
w.mu.Unlock()
|
||||||
|
pr.CloseWithError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var resp *raw.Object
|
var resp *raw.Object
|
||||||
|
|
@ -125,18 +130,27 @@ func (w *Writer) open() error {
|
||||||
call.UserProject(w.o.userProject)
|
call.UserProject(w.o.userProject)
|
||||||
}
|
}
|
||||||
setClientHeader(call.Header())
|
setClientHeader(call.Header())
|
||||||
// We will only retry here if the initial POST, which obtains a URI for
|
// If the chunk size is zero, then no chunking is done on the Reader,
|
||||||
// the resumable upload, fails with a retryable error. The upload itself
|
// which means we cannot retry: the first call will read the data, and if
|
||||||
// has its own retry logic.
|
// it fails, there is no way to re-read.
|
||||||
err = runWithRetry(w.ctx, func() error {
|
if w.ChunkSize == 0 {
|
||||||
var err2 error
|
resp, err = call.Do()
|
||||||
resp, err2 = call.Do()
|
} else {
|
||||||
return err2
|
// We will only retry here if the initial POST, which obtains a URI for
|
||||||
})
|
// the resumable upload, fails with a retryable error. The upload itself
|
||||||
|
// has its own retry logic.
|
||||||
|
err = runWithRetry(w.ctx, func() error {
|
||||||
|
var err2 error
|
||||||
|
resp, err2 = call.Do()
|
||||||
|
return err2
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
w.mu.Lock()
|
||||||
w.err = err
|
w.err = err
|
||||||
pr.CloseWithError(w.err)
|
w.mu.Unlock()
|
||||||
|
pr.CloseWithError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.obj = newObject(resp)
|
w.obj = newObject(resp)
|
||||||
|
|
@ -151,8 +165,11 @@ func (w *Writer) open() error {
|
||||||
// use the error returned from Writer.Close to determine if
|
// use the error returned from Writer.Close to determine if
|
||||||
// the upload was successful.
|
// the upload was successful.
|
||||||
func (w *Writer) Write(p []byte) (n int, err error) {
|
func (w *Writer) Write(p []byte) (n int, err error) {
|
||||||
if w.err != nil {
|
w.mu.Lock()
|
||||||
return 0, w.err
|
werr := w.err
|
||||||
|
w.mu.Unlock()
|
||||||
|
if werr != nil {
|
||||||
|
return 0, werr
|
||||||
}
|
}
|
||||||
if !w.opened {
|
if !w.opened {
|
||||||
if err := w.open(); err != nil {
|
if err := w.open(); err != nil {
|
||||||
|
|
@ -175,11 +192,15 @@ func (w *Writer) Close() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
<-w.donec
|
<-w.donec
|
||||||
|
w.mu.Lock()
|
||||||
|
defer w.mu.Unlock()
|
||||||
return w.err
|
return w.err
|
||||||
}
|
}
|
||||||
|
|
||||||
// CloseWithError aborts the write operation with the provided error.
|
// CloseWithError aborts the write operation with the provided error.
|
||||||
// CloseWithError always returns nil.
|
// CloseWithError always returns nil.
|
||||||
|
//
|
||||||
|
// Deprecated: cancel the context passed to NewWriter instead.
|
||||||
func (w *Writer) CloseWithError(err error) error {
|
func (w *Writer) CloseWithError(err error) error {
|
||||||
if !w.opened {
|
if !w.opened {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
73
vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
generated
vendored
Normal file
73
vendor/github.com/Azure/azure-sdk-for-go/storage/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
# Azure Storage SDK for Go
|
||||||
|
|
||||||
|
The `github.com/Azure/azure-sdk-for-go/storage` package is used to perform REST operations against the [Azure Storage Service](https://docs.microsoft.com/en-us/azure/storage/). To manage your storage accounts (Azure Resource Manager / ARM), use the [github.com/Azure/azure-sdk-for-go/arm/storage](https://github.com/Azure/azure-sdk-for-go/tree/master/arm/storage) package. For your classic storage accounts (Azure Service Management / ASM), use [github.com/Azure/azure-sdk-for-go/management/storageservice](https://github.com/Azure/azure-sdk-for-go/tree/master/management/storageservice) package.
|
||||||
|
|
||||||
|
This package includes support for [Azure Storage Emulator](https://azure.microsoft.com/documentation/articles/storage-use-emulator/).
|
||||||
|
|
||||||
|
# Getting Started
|
||||||
|
|
||||||
|
1. Go get the SDK `go get -u github.com/Azure/azure-sdk-for-go/storage`
|
||||||
|
1. If you don't already have one, [create a Storage Account](https://docs.microsoft.com/en-us/azure/storage/storage-create-storage-account).
|
||||||
|
- Take note of your Azure Storage Account Name and Azure Storage Account Key. They'll both be necessary for using this library.
|
||||||
|
- This option is production ready, but can also be used for development.
|
||||||
|
1. (Optional, Windows only) Download and start the [Azure Storage Emulator](https://azure.microsoft.com/documentation/articles/storage-use-emulator/).
|
||||||
|
1. Checkout our existing [samples](https://github.com/Azure-Samples?q=Storage&language=go).
|
||||||
|
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||||
|
|
||||||
|
When contributing, please conform to the following practices:
|
||||||
|
- Run [gofmt](https://golang.org/cmd/gofmt/) to use standard go formatting.
|
||||||
|
- Run [golint](https://github.com/golang/lint) to conform to standard naming conventions.
|
||||||
|
- Run [go vet](https://golang.org/cmd/vet/) to catch common Go mistakes.
|
||||||
|
- Use [GoASTScanner/gas](https://github.com/GoASTScanner/gas) to ensure there are no common security violations in your contribution.
|
||||||
|
- Run [go test](https://golang.org/cmd/go/#hdr-Test_packages) to catch possible bugs in the code: `go test ./storage/...`.
|
||||||
|
- This project uses HTTP recordings for testing.
|
||||||
|
- The recorder should be attached to the client before calling the functions to test and later stopped.
|
||||||
|
- If you updated an existing test, its recording might need to be updated. Run `go test ./storage/... -ow -check.f TestName` to rerecord the test.
|
||||||
|
- Important note: all HTTP requests in the recording must be unique: different bodies, headers (`User-Agent`, `Authorization` and `Date` or `x-ms-date` headers are ignored), URLs and methods. As opposed to the example above, the following test is not suitable for recording:
|
||||||
|
|
||||||
|
``` go
|
||||||
|
func (s *StorageQueueSuite) TestQueueExists(c *chk.C) {
|
||||||
|
cli := getQueueClient(c)
|
||||||
|
rec := cli.client.appendRecorder(c)
|
||||||
|
defer rec.Stop()
|
||||||
|
|
||||||
|
queue := cli.GetQueueReference(queueName(c))
|
||||||
|
ok, err := queue.Exists()
|
||||||
|
c.Assert(err, chk.IsNil)
|
||||||
|
c.Assert(ok, chk.Equals, false)
|
||||||
|
|
||||||
|
c.Assert(queue.Create(nil), chk.IsNil)
|
||||||
|
defer queue.Delete(nil)
|
||||||
|
|
||||||
|
ok, err = queue.Exists() // This is the very same request as the one 5 lines above
|
||||||
|
// The test replayer gets confused and the test fails in the last line
|
||||||
|
c.Assert(err, chk.IsNil)
|
||||||
|
c.Assert(ok, chk.Equals, true)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- On the other side, this test does not repeat requests: the URLs are different.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
func (s *StorageQueueSuite) TestQueueExists(c *chk.C) {
|
||||||
|
cli := getQueueClient(c)
|
||||||
|
rec := cli.client.appendRecorder(c)
|
||||||
|
defer rec.Stop()
|
||||||
|
|
||||||
|
queue1 := cli.GetQueueReference(queueName(c, "nonexistent"))
|
||||||
|
ok, err := queue1.Exists()
|
||||||
|
c.Assert(err, chk.IsNil)
|
||||||
|
c.Assert(ok, chk.Equals, false)
|
||||||
|
|
||||||
|
queue2 := cli.GetQueueReference(queueName(c, "exisiting"))
|
||||||
|
c.Assert(queue2.Create(nil), chk.IsNil)
|
||||||
|
defer queue2.Delete(nil)
|
||||||
|
|
||||||
|
ok, err = queue2.Exists()
|
||||||
|
c.Assert(err, chk.IsNil)
|
||||||
|
c.Assert(ok, chk.Equals, true)
|
||||||
|
}
|
||||||
|
```
|
||||||
27
vendor/github.com/Azure/azure-sdk-for-go/storage/appendblob.go
generated
vendored
27
vendor/github.com/Azure/azure-sdk-for-go/storage/appendblob.go
generated
vendored
|
|
@ -1,7 +1,23 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
@ -31,8 +47,7 @@ func (b *Blob) PutAppendBlob(options *PutBlobOptions) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
readAndCloseBody(resp.body)
|
return b.respondCreation(resp, BlobTypeAppend)
|
||||||
return checkRespCode(resp.statusCode, []int{http.StatusCreated})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendBlockOptions includes the options for an append block operation
|
// AppendBlockOptions includes the options for an append block operation
|
||||||
|
|
@ -46,6 +61,7 @@ type AppendBlockOptions struct {
|
||||||
IfMatch string `header:"If-Match"`
|
IfMatch string `header:"If-Match"`
|
||||||
IfNoneMatch string `header:"If-None-Match"`
|
IfNoneMatch string `header:"If-None-Match"`
|
||||||
RequestID string `header:"x-ms-client-request-id"`
|
RequestID string `header:"x-ms-client-request-id"`
|
||||||
|
ContentMD5 bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// AppendBlock appends a block to an append blob.
|
// AppendBlock appends a block to an append blob.
|
||||||
|
|
@ -60,6 +76,10 @@ func (b *Blob) AppendBlock(chunk []byte, options *AppendBlockOptions) error {
|
||||||
if options != nil {
|
if options != nil {
|
||||||
params = addTimeout(params, options.Timeout)
|
params = addTimeout(params, options.Timeout)
|
||||||
headers = mergeHeaders(headers, headersFromStruct(*options))
|
headers = mergeHeaders(headers, headersFromStruct(*options))
|
||||||
|
if options.ContentMD5 {
|
||||||
|
md5sum := md5.Sum(chunk)
|
||||||
|
headers[headerContentMD5] = base64.StdEncoding.EncodeToString(md5sum[:])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
uri := b.Container.bsc.client.getEndpoint(blobServiceName, b.buildPath(), params)
|
uri := b.Container.bsc.client.getEndpoint(blobServiceName, b.buildPath(), params)
|
||||||
|
|
||||||
|
|
@ -67,6 +87,5 @@ func (b *Blob) AppendBlock(chunk []byte, options *AppendBlockOptions) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
readAndCloseBody(resp.body)
|
return b.respondCreation(resp, BlobTypeAppend)
|
||||||
return checkRespCode(resp.statusCode, []int{http.StatusCreated})
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
24
vendor/github.com/Azure/azure-sdk-for-go/storage/authorization.go
generated
vendored
24
vendor/github.com/Azure/azure-sdk-for-go/storage/authorization.go
generated
vendored
|
|
@ -1,6 +1,20 @@
|
||||||
// Package storage provides clients for Microsoft Azure Storage Services.
|
// Package storage provides clients for Microsoft Azure Storage Services.
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -41,11 +55,13 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Client) addAuthorizationHeader(verb, url string, headers map[string]string, auth authentication) (map[string]string, error) {
|
func (c *Client) addAuthorizationHeader(verb, url string, headers map[string]string, auth authentication) (map[string]string, error) {
|
||||||
authHeader, err := c.getSharedKey(verb, url, headers, auth)
|
if !c.sasClient {
|
||||||
if err != nil {
|
authHeader, err := c.getSharedKey(verb, url, headers, auth)
|
||||||
return nil, err
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
headers[headerAuthorization] = authHeader
|
||||||
}
|
}
|
||||||
headers[headerAuthorization] = authHeader
|
|
||||||
return headers, nil
|
return headers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
55
vendor/github.com/Azure/azure-sdk-for-go/storage/blob.go
generated
vendored
55
vendor/github.com/Azure/azure-sdk-for-go/storage/blob.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
@ -90,7 +104,7 @@ type BlobProperties struct {
|
||||||
CacheControl string `xml:"Cache-Control" header:"x-ms-blob-cache-control"`
|
CacheControl string `xml:"Cache-Control" header:"x-ms-blob-cache-control"`
|
||||||
ContentLanguage string `xml:"Cache-Language" header:"x-ms-blob-content-language"`
|
ContentLanguage string `xml:"Cache-Language" header:"x-ms-blob-content-language"`
|
||||||
ContentDisposition string `xml:"Content-Disposition" header:"x-ms-blob-content-disposition"`
|
ContentDisposition string `xml:"Content-Disposition" header:"x-ms-blob-content-disposition"`
|
||||||
BlobType BlobType `xml:"x-ms-blob-blob-type"`
|
BlobType BlobType `xml:"BlobType"`
|
||||||
SequenceNumber int64 `xml:"x-ms-blob-sequence-number"`
|
SequenceNumber int64 `xml:"x-ms-blob-sequence-number"`
|
||||||
CopyID string `xml:"CopyId"`
|
CopyID string `xml:"CopyId"`
|
||||||
CopyStatus string `xml:"CopyStatus"`
|
CopyStatus string `xml:"CopyStatus"`
|
||||||
|
|
@ -135,8 +149,7 @@ func (b *Blob) Exists() (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetURL gets the canonical URL to the blob with the specified name in the
|
// GetURL gets the canonical URL to the blob with the specified name in the
|
||||||
// specified container. If name is not specified, the canonical URL for the entire
|
// specified container.
|
||||||
// container is obtained.
|
|
||||||
// This method does not create a publicly accessible URL if the blob or container
|
// This method does not create a publicly accessible URL if the blob or container
|
||||||
// is private and this method does not check if the blob exists.
|
// is private and this method does not check if the blob exists.
|
||||||
func (b *Blob) GetURL() string {
|
func (b *Blob) GetURL() string {
|
||||||
|
|
@ -437,8 +450,8 @@ func (b *Blob) SetProperties(options *SetBlobPropertiesOptions) error {
|
||||||
uri := b.Container.bsc.client.getEndpoint(blobServiceName, b.buildPath(), params)
|
uri := b.Container.bsc.client.getEndpoint(blobServiceName, b.buildPath(), params)
|
||||||
|
|
||||||
if b.Properties.BlobType == BlobTypePage {
|
if b.Properties.BlobType == BlobTypePage {
|
||||||
headers = addToHeaders(headers, "x-ms-blob-content-length", fmt.Sprintf("byte %v", b.Properties.ContentLength))
|
headers = addToHeaders(headers, "x-ms-blob-content-length", fmt.Sprintf("%v", b.Properties.ContentLength))
|
||||||
if options != nil || options.SequenceNumberAction != nil {
|
if options != nil && options.SequenceNumberAction != nil {
|
||||||
headers = addToHeaders(headers, "x-ms-sequence-number-action", string(*options.SequenceNumberAction))
|
headers = addToHeaders(headers, "x-ms-sequence-number-action", string(*options.SequenceNumberAction))
|
||||||
if *options.SequenceNumberAction != SequenceNumberActionIncrement {
|
if *options.SequenceNumberAction != SequenceNumberActionIncrement {
|
||||||
headers = addToHeaders(headers, "x-ms-blob-sequence-number", fmt.Sprintf("%v", b.Properties.SequenceNumber))
|
headers = addToHeaders(headers, "x-ms-blob-sequence-number", fmt.Sprintf("%v", b.Properties.SequenceNumber))
|
||||||
|
|
@ -536,27 +549,7 @@ func (b *Blob) GetMetadata(options *GetBlobMetadataOptions) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Blob) writeMetadata(h http.Header) {
|
func (b *Blob) writeMetadata(h http.Header) {
|
||||||
metadata := make(map[string]string)
|
b.Metadata = BlobMetadata(writeMetadata(h))
|
||||||
for k, v := range h {
|
|
||||||
// Can't trust CanonicalHeaderKey() to munge case
|
|
||||||
// reliably. "_" is allowed in identifiers:
|
|
||||||
// https://msdn.microsoft.com/en-us/library/azure/dd179414.aspx
|
|
||||||
// https://msdn.microsoft.com/library/aa664670(VS.71).aspx
|
|
||||||
// http://tools.ietf.org/html/rfc7230#section-3.2
|
|
||||||
// ...but "_" is considered invalid by
|
|
||||||
// CanonicalMIMEHeaderKey in
|
|
||||||
// https://golang.org/src/net/textproto/reader.go?s=14615:14659#L542
|
|
||||||
// so k can be "X-Ms-Meta-Lol" or "x-ms-meta-lol_rofl".
|
|
||||||
k = strings.ToLower(k)
|
|
||||||
if len(v) == 0 || !strings.HasPrefix(k, strings.ToLower(userDefinedMetadataHeaderPrefix)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// metadata["lol"] = content of the last X-Ms-Meta-Lol header
|
|
||||||
k = k[len(userDefinedMetadataHeaderPrefix):]
|
|
||||||
metadata[k] = v[len(v)-1]
|
|
||||||
}
|
|
||||||
|
|
||||||
b.Metadata = BlobMetadata(metadata)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteBlobOptions includes the options for a delete blob operation
|
// DeleteBlobOptions includes the options for a delete blob operation
|
||||||
|
|
@ -627,3 +620,13 @@ func pathForResource(container, name string) string {
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("/%s", container)
|
return fmt.Sprintf("/%s", container)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Blob) respondCreation(resp *storageResponse, bt BlobType) error {
|
||||||
|
readAndCloseBody(resp.body)
|
||||||
|
err := checkRespCode(resp.statusCode, []int{http.StatusCreated})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
b.Properties.BlobType = bt
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
||||||
150
vendor/github.com/Azure/azure-sdk-for-go/storage/blobsasuri.go
generated
vendored
150
vendor/github.com/Azure/azure-sdk-for-go/storage/blobsasuri.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -8,70 +22,122 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// GetSASURIWithSignedIPAndProtocol creates an URL to the specified blob which contains the Shared
|
// OverrideHeaders defines overridable response heaedrs in
|
||||||
// Access Signature with specified permissions and expiration time. Also includes signedIPRange and allowed protocols.
|
// a request using a SAS URI.
|
||||||
// If old API version is used but no signedIP is passed (ie empty string) then this should still work.
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
// We only populate the signedIP when it non-empty.
|
type OverrideHeaders struct {
|
||||||
|
CacheControl string
|
||||||
|
ContentDisposition string
|
||||||
|
ContentEncoding string
|
||||||
|
ContentLanguage string
|
||||||
|
ContentType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlobSASOptions are options to construct a blob SAS
|
||||||
|
// URI.
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
|
type BlobSASOptions struct {
|
||||||
|
BlobServiceSASPermissions
|
||||||
|
OverrideHeaders
|
||||||
|
SASOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlobServiceSASPermissions includes the available permissions for
|
||||||
|
// blob service SAS URI.
|
||||||
|
type BlobServiceSASPermissions struct {
|
||||||
|
Read bool
|
||||||
|
Add bool
|
||||||
|
Create bool
|
||||||
|
Write bool
|
||||||
|
Delete bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p BlobServiceSASPermissions) buildString() string {
|
||||||
|
permissions := ""
|
||||||
|
if p.Read {
|
||||||
|
permissions += "r"
|
||||||
|
}
|
||||||
|
if p.Add {
|
||||||
|
permissions += "a"
|
||||||
|
}
|
||||||
|
if p.Create {
|
||||||
|
permissions += "c"
|
||||||
|
}
|
||||||
|
if p.Write {
|
||||||
|
permissions += "w"
|
||||||
|
}
|
||||||
|
if p.Delete {
|
||||||
|
permissions += "d"
|
||||||
|
}
|
||||||
|
return permissions
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSASURI creates an URL to the blob which contains the Shared
|
||||||
|
// Access Signature with the specified options.
|
||||||
//
|
//
|
||||||
// See https://msdn.microsoft.com/en-us/library/azure/ee395415.aspx
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
func (b *Blob) GetSASURIWithSignedIPAndProtocol(expiry time.Time, permissions string, signedIPRange string, HTTPSOnly bool) (string, error) {
|
func (b *Blob) GetSASURI(options BlobSASOptions) (string, error) {
|
||||||
var (
|
uri := b.GetURL()
|
||||||
signedPermissions = permissions
|
signedResource := "b"
|
||||||
blobURL = b.GetURL()
|
canonicalizedResource, err := b.Container.bsc.client.buildCanonicalizedResource(uri, b.Container.bsc.auth, true)
|
||||||
)
|
|
||||||
canonicalizedResource, err := b.Container.bsc.client.buildCanonicalizedResource(blobURL, b.Container.bsc.auth, true)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
// "The canonicalizedresouce portion of the string is a canonical path to the signed resource.
|
permissions := options.BlobServiceSASPermissions.buildString()
|
||||||
// It must include the service name (blob, table, queue or file) for version 2015-02-21 or
|
return b.Container.bsc.client.blobAndFileSASURI(options.SASOptions, uri, permissions, canonicalizedResource, signedResource, options.OverrideHeaders)
|
||||||
// later, the storage account name, and the resource name, and must be URL-decoded.
|
}
|
||||||
// -- https://msdn.microsoft.com/en-us/library/azure/dn140255.aspx
|
|
||||||
|
func (c *Client) blobAndFileSASURI(options SASOptions, uri, permissions, canonicalizedResource, signedResource string, headers OverrideHeaders) (string, error) {
|
||||||
|
start := ""
|
||||||
|
if options.Start != (time.Time{}) {
|
||||||
|
start = options.Start.UTC().Format(time.RFC3339)
|
||||||
|
}
|
||||||
|
|
||||||
|
expiry := options.Expiry.UTC().Format(time.RFC3339)
|
||||||
|
|
||||||
// We need to replace + with %2b first to avoid being treated as a space (which is correct for query strings, but not the path component).
|
// We need to replace + with %2b first to avoid being treated as a space (which is correct for query strings, but not the path component).
|
||||||
canonicalizedResource = strings.Replace(canonicalizedResource, "+", "%2b", -1)
|
canonicalizedResource = strings.Replace(canonicalizedResource, "+", "%2b", -1)
|
||||||
canonicalizedResource, err = url.QueryUnescape(canonicalizedResource)
|
canonicalizedResource, err := url.QueryUnescape(canonicalizedResource)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
signedExpiry := expiry.UTC().Format(time.RFC3339)
|
|
||||||
|
|
||||||
//If blob name is missing, resource is a container
|
|
||||||
signedResource := "c"
|
|
||||||
if len(b.Name) > 0 {
|
|
||||||
signedResource = "b"
|
|
||||||
}
|
|
||||||
|
|
||||||
protocols := ""
|
protocols := ""
|
||||||
if HTTPSOnly {
|
if options.UseHTTPS {
|
||||||
protocols = "https"
|
protocols = "https"
|
||||||
}
|
}
|
||||||
stringToSign, err := blobSASStringToSign(b.Container.bsc.client.apiVersion, canonicalizedResource, signedExpiry, signedPermissions, signedIPRange, protocols)
|
stringToSign, err := blobSASStringToSign(permissions, start, expiry, canonicalizedResource, options.Identifier, options.IP, protocols, c.apiVersion, headers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
sig := b.Container.bsc.client.computeHmac256(stringToSign)
|
sig := c.computeHmac256(stringToSign)
|
||||||
sasParams := url.Values{
|
sasParams := url.Values{
|
||||||
"sv": {b.Container.bsc.client.apiVersion},
|
"sv": {c.apiVersion},
|
||||||
"se": {signedExpiry},
|
"se": {expiry},
|
||||||
"sr": {signedResource},
|
"sr": {signedResource},
|
||||||
"sp": {signedPermissions},
|
"sp": {permissions},
|
||||||
"sig": {sig},
|
"sig": {sig},
|
||||||
}
|
}
|
||||||
|
|
||||||
if b.Container.bsc.client.apiVersion >= "2015-04-05" {
|
if c.apiVersion >= "2015-04-05" {
|
||||||
if protocols != "" {
|
if protocols != "" {
|
||||||
sasParams.Add("spr", protocols)
|
sasParams.Add("spr", protocols)
|
||||||
}
|
}
|
||||||
if signedIPRange != "" {
|
if options.IP != "" {
|
||||||
sasParams.Add("sip", signedIPRange)
|
sasParams.Add("sip", options.IP)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sasURL, err := url.Parse(blobURL)
|
// Add override response hedaers
|
||||||
|
addQueryParameter(sasParams, "rscc", headers.CacheControl)
|
||||||
|
addQueryParameter(sasParams, "rscd", headers.ContentDisposition)
|
||||||
|
addQueryParameter(sasParams, "rsce", headers.ContentEncoding)
|
||||||
|
addQueryParameter(sasParams, "rscl", headers.ContentLanguage)
|
||||||
|
addQueryParameter(sasParams, "rsct", headers.ContentType)
|
||||||
|
|
||||||
|
sasURL, err := url.Parse(uri)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
@ -79,16 +145,12 @@ func (b *Blob) GetSASURIWithSignedIPAndProtocol(expiry time.Time, permissions st
|
||||||
return sasURL.String(), nil
|
return sasURL.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSASURI creates an URL to the specified blob which contains the Shared
|
func blobSASStringToSign(signedPermissions, signedStart, signedExpiry, canonicalizedResource, signedIdentifier, signedIP, protocols, signedVersion string, headers OverrideHeaders) (string, error) {
|
||||||
// Access Signature with specified permissions and expiration time.
|
rscc := headers.CacheControl
|
||||||
//
|
rscd := headers.ContentDisposition
|
||||||
// See https://msdn.microsoft.com/en-us/library/azure/ee395415.aspx
|
rsce := headers.ContentEncoding
|
||||||
func (b *Blob) GetSASURI(expiry time.Time, permissions string) (string, error) {
|
rscl := headers.ContentLanguage
|
||||||
return b.GetSASURIWithSignedIPAndProtocol(expiry, permissions, "", false)
|
rsct := headers.ContentType
|
||||||
}
|
|
||||||
|
|
||||||
func blobSASStringToSign(signedVersion, canonicalizedResource, signedExpiry, signedPermissions string, signedIP string, protocols string) (string, error) {
|
|
||||||
var signedStart, signedIdentifier, rscc, rscd, rsce, rscl, rsct string
|
|
||||||
|
|
||||||
if signedVersion >= "2015-02-21" {
|
if signedVersion >= "2015-02-21" {
|
||||||
canonicalizedResource = "/blob" + canonicalizedResource
|
canonicalizedResource = "/blob" + canonicalizedResource
|
||||||
|
|
|
||||||
97
vendor/github.com/Azure/azure-sdk-for-go/storage/blobserviceclient.go
generated
vendored
97
vendor/github.com/Azure/azure-sdk-for-go/storage/blobserviceclient.go
generated
vendored
|
|
@ -1,9 +1,26 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BlobStorageClient contains operations for Microsoft Azure Blob Storage
|
// BlobStorageClient contains operations for Microsoft Azure Blob Storage
|
||||||
|
|
@ -45,6 +62,21 @@ func (b *BlobStorageClient) GetContainerReference(name string) *Container {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetContainerReferenceFromSASURI returns a Container object for the specified
|
||||||
|
// container SASURI
|
||||||
|
func GetContainerReferenceFromSASURI(sasuri url.URL) (*Container, error) {
|
||||||
|
path := strings.Split(sasuri.Path, "/")
|
||||||
|
if len(path) <= 1 {
|
||||||
|
return nil, fmt.Errorf("could not find a container in URI: %s", sasuri.String())
|
||||||
|
}
|
||||||
|
cli := newSASClient().GetBlobService()
|
||||||
|
return &Container{
|
||||||
|
bsc: &cli,
|
||||||
|
Name: path[1],
|
||||||
|
sasuri: sasuri,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
// ListContainers returns the list of containers in a storage account along with
|
// ListContainers returns the list of containers in a storage account along with
|
||||||
// pagination token and other response details.
|
// pagination token and other response details.
|
||||||
//
|
//
|
||||||
|
|
@ -54,21 +86,53 @@ func (b BlobStorageClient) ListContainers(params ListContainersParameters) (*Con
|
||||||
uri := b.client.getEndpoint(blobServiceName, "", q)
|
uri := b.client.getEndpoint(blobServiceName, "", q)
|
||||||
headers := b.client.getStandardHeaders()
|
headers := b.client.getStandardHeaders()
|
||||||
|
|
||||||
var out ContainerListResponse
|
type ContainerAlias struct {
|
||||||
|
bsc *BlobStorageClient
|
||||||
|
Name string `xml:"Name"`
|
||||||
|
Properties ContainerProperties `xml:"Properties"`
|
||||||
|
Metadata BlobMetadata
|
||||||
|
sasuri url.URL
|
||||||
|
}
|
||||||
|
type ContainerListResponseAlias struct {
|
||||||
|
XMLName xml.Name `xml:"EnumerationResults"`
|
||||||
|
Xmlns string `xml:"xmlns,attr"`
|
||||||
|
Prefix string `xml:"Prefix"`
|
||||||
|
Marker string `xml:"Marker"`
|
||||||
|
NextMarker string `xml:"NextMarker"`
|
||||||
|
MaxResults int64 `xml:"MaxResults"`
|
||||||
|
Containers []ContainerAlias `xml:"Containers>Container"`
|
||||||
|
}
|
||||||
|
|
||||||
|
var outAlias ContainerListResponseAlias
|
||||||
resp, err := b.client.exec(http.MethodGet, uri, headers, nil, b.auth)
|
resp, err := b.client.exec(http.MethodGet, uri, headers, nil, b.auth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
defer resp.body.Close()
|
defer resp.body.Close()
|
||||||
err = xmlUnmarshal(resp.body, &out)
|
err = xmlUnmarshal(resp.body, &outAlias)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign our client to the newly created Container objects
|
out := ContainerListResponse{
|
||||||
for i := range out.Containers {
|
XMLName: outAlias.XMLName,
|
||||||
out.Containers[i].bsc = &b
|
Xmlns: outAlias.Xmlns,
|
||||||
|
Prefix: outAlias.Prefix,
|
||||||
|
Marker: outAlias.Marker,
|
||||||
|
NextMarker: outAlias.NextMarker,
|
||||||
|
MaxResults: outAlias.MaxResults,
|
||||||
|
Containers: make([]Container, len(outAlias.Containers)),
|
||||||
}
|
}
|
||||||
|
for i, cnt := range outAlias.Containers {
|
||||||
|
out.Containers[i] = Container{
|
||||||
|
bsc: &b,
|
||||||
|
Name: cnt.Name,
|
||||||
|
Properties: cnt.Properties,
|
||||||
|
Metadata: map[string]string(cnt.Metadata),
|
||||||
|
sasuri: cnt.sasuri,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return &out, err
|
return &out, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,3 +157,26 @@ func (p ListContainersParameters) getParameters() url.Values {
|
||||||
|
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func writeMetadata(h http.Header) map[string]string {
|
||||||
|
metadata := make(map[string]string)
|
||||||
|
for k, v := range h {
|
||||||
|
// Can't trust CanonicalHeaderKey() to munge case
|
||||||
|
// reliably. "_" is allowed in identifiers:
|
||||||
|
// https://msdn.microsoft.com/en-us/library/azure/dd179414.aspx
|
||||||
|
// https://msdn.microsoft.com/library/aa664670(VS.71).aspx
|
||||||
|
// http://tools.ietf.org/html/rfc7230#section-3.2
|
||||||
|
// ...but "_" is considered invalid by
|
||||||
|
// CanonicalMIMEHeaderKey in
|
||||||
|
// https://golang.org/src/net/textproto/reader.go?s=14615:14659#L542
|
||||||
|
// so k can be "X-Ms-Meta-Lol" or "x-ms-meta-lol_rofl".
|
||||||
|
k = strings.ToLower(k)
|
||||||
|
if len(v) == 0 || !strings.HasPrefix(k, strings.ToLower(userDefinedMetadataHeaderPrefix)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// metadata["lol"] = content of the last X-Ms-Meta-Lol header
|
||||||
|
k = k[len(userDefinedMetadataHeaderPrefix):]
|
||||||
|
metadata[k] = v[len(v)-1]
|
||||||
|
}
|
||||||
|
return metadata
|
||||||
|
}
|
||||||
|
|
|
||||||
20
vendor/github.com/Azure/azure-sdk-for-go/storage/blockblob.go
generated
vendored
20
vendor/github.com/Azure/azure-sdk-for-go/storage/blockblob.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
|
|
@ -132,8 +146,7 @@ func (b *Blob) CreateBlockBlobFromReader(blob io.Reader, options *PutBlobOptions
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
readAndCloseBody(resp.body)
|
return b.respondCreation(resp, BlobTypeBlock)
|
||||||
return checkRespCode(resp.statusCode, []int{http.StatusCreated})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutBlockOptions includes the options for a put block operation
|
// PutBlockOptions includes the options for a put block operation
|
||||||
|
|
@ -181,8 +194,7 @@ func (b *Blob) PutBlockWithLength(blockID string, size uint64, blob io.Reader, o
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
readAndCloseBody(resp.body)
|
return b.respondCreation(resp, BlobTypeBlock)
|
||||||
return checkRespCode(resp.statusCode, []int{http.StatusCreated})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PutBlockListOptions includes the options for a put block list operation
|
// PutBlockListOptions includes the options for a put block list operation
|
||||||
|
|
|
||||||
365
vendor/github.com/Azure/azure-sdk-for-go/storage/client.go
generated
vendored
365
vendor/github.com/Azure/azure-sdk-for-go/storage/client.go
generated
vendored
|
|
@ -1,6 +1,20 @@
|
||||||
// Package storage provides clients for Microsoft Azure Storage Services.
|
// Package storage provides clients for Microsoft Azure Storage Services.
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
|
|
@ -17,6 +31,7 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -33,7 +48,9 @@ const (
|
||||||
// basic client is created.
|
// basic client is created.
|
||||||
DefaultAPIVersion = "2016-05-31"
|
DefaultAPIVersion = "2016-05-31"
|
||||||
|
|
||||||
defaultUseHTTPS = true
|
defaultUseHTTPS = true
|
||||||
|
defaultRetryAttempts = 5
|
||||||
|
defaultRetryDuration = time.Second * 5
|
||||||
|
|
||||||
// StorageEmulatorAccountName is the fixed storage account used by Azure Storage Emulator
|
// StorageEmulatorAccountName is the fixed storage account used by Azure Storage Emulator
|
||||||
StorageEmulatorAccountName = "devstoreaccount1"
|
StorageEmulatorAccountName = "devstoreaccount1"
|
||||||
|
|
@ -53,10 +70,28 @@ const (
|
||||||
userAgentHeader = "User-Agent"
|
userAgentHeader = "User-Agent"
|
||||||
|
|
||||||
userDefinedMetadataHeaderPrefix = "x-ms-meta-"
|
userDefinedMetadataHeaderPrefix = "x-ms-meta-"
|
||||||
|
|
||||||
|
connectionStringAccountName = "accountname"
|
||||||
|
connectionStringAccountKey = "accountkey"
|
||||||
|
connectionStringEndpointSuffix = "endpointsuffix"
|
||||||
|
connectionStringEndpointProtocol = "defaultendpointsprotocol"
|
||||||
|
|
||||||
|
connectionStringBlobEndpoint = "blobendpoint"
|
||||||
|
connectionStringFileEndpoint = "fileendpoint"
|
||||||
|
connectionStringQueueEndpoint = "queueendpoint"
|
||||||
|
connectionStringTableEndpoint = "tableendpoint"
|
||||||
|
connectionStringSAS = "sharedaccesssignature"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
validStorageAccount = regexp.MustCompile("^[0-9a-z]{3,24}$")
|
validStorageAccount = regexp.MustCompile("^[0-9a-z]{3,24}$")
|
||||||
|
defaultValidStatusCodes = []int{
|
||||||
|
http.StatusRequestTimeout, // 408
|
||||||
|
http.StatusInternalServerError, // 500
|
||||||
|
http.StatusBadGateway, // 502
|
||||||
|
http.StatusServiceUnavailable, // 503
|
||||||
|
http.StatusGatewayTimeout, // 504
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Sender sends a request
|
// Sender sends a request
|
||||||
|
|
@ -112,6 +147,8 @@ type Client struct {
|
||||||
baseURL string
|
baseURL string
|
||||||
apiVersion string
|
apiVersion string
|
||||||
userAgent string
|
userAgent string
|
||||||
|
sasClient bool
|
||||||
|
accountSASToken url.Values
|
||||||
}
|
}
|
||||||
|
|
||||||
type storageResponse struct {
|
type storageResponse struct {
|
||||||
|
|
@ -179,6 +216,55 @@ func (e UnexpectedStatusCodeError) Got() int {
|
||||||
return e.got
|
return e.got
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewClientFromConnectionString creates a Client from the connection string.
|
||||||
|
func NewClientFromConnectionString(input string) (Client, error) {
|
||||||
|
// build a map of connection string key/value pairs
|
||||||
|
parts := map[string]string{}
|
||||||
|
for _, pair := range strings.Split(input, ";") {
|
||||||
|
if pair == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
equalDex := strings.IndexByte(pair, '=')
|
||||||
|
if equalDex <= 0 {
|
||||||
|
return Client{}, fmt.Errorf("Invalid connection segment %q", pair)
|
||||||
|
}
|
||||||
|
|
||||||
|
value := strings.TrimSpace(pair[equalDex+1:])
|
||||||
|
key := strings.TrimSpace(strings.ToLower(pair[:equalDex]))
|
||||||
|
parts[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: validate parameter sets?
|
||||||
|
|
||||||
|
if parts[connectionStringAccountName] == StorageEmulatorAccountName {
|
||||||
|
return NewEmulatorClient()
|
||||||
|
}
|
||||||
|
|
||||||
|
if parts[connectionStringSAS] != "" {
|
||||||
|
endpoint := ""
|
||||||
|
if parts[connectionStringBlobEndpoint] != "" {
|
||||||
|
endpoint = parts[connectionStringBlobEndpoint]
|
||||||
|
} else if parts[connectionStringFileEndpoint] != "" {
|
||||||
|
endpoint = parts[connectionStringFileEndpoint]
|
||||||
|
} else if parts[connectionStringQueueEndpoint] != "" {
|
||||||
|
endpoint = parts[connectionStringQueueEndpoint]
|
||||||
|
} else {
|
||||||
|
endpoint = parts[connectionStringTableEndpoint]
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewAccountSASClientFromEndpointToken(endpoint, parts[connectionStringSAS])
|
||||||
|
}
|
||||||
|
|
||||||
|
useHTTPS := defaultUseHTTPS
|
||||||
|
if parts[connectionStringEndpointProtocol] != "" {
|
||||||
|
useHTTPS = parts[connectionStringEndpointProtocol] == "https"
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewClient(parts[connectionStringAccountName], parts[connectionStringAccountKey],
|
||||||
|
parts[connectionStringEndpointSuffix], DefaultAPIVersion, useHTTPS)
|
||||||
|
}
|
||||||
|
|
||||||
// NewBasicClient constructs a Client with given storage service name and
|
// NewBasicClient constructs a Client with given storage service name and
|
||||||
// key.
|
// key.
|
||||||
func NewBasicClient(accountName, accountKey string) (Client, error) {
|
func NewBasicClient(accountName, accountKey string) (Client, error) {
|
||||||
|
|
@ -206,13 +292,13 @@ func NewEmulatorClient() (Client, error) {
|
||||||
// NewClient constructs a Client. This should be used if the caller wants
|
// NewClient constructs a Client. This should be used if the caller wants
|
||||||
// to specify whether to use HTTPS, a specific REST API version or a custom
|
// to specify whether to use HTTPS, a specific REST API version or a custom
|
||||||
// storage endpoint than Azure Public Cloud.
|
// storage endpoint than Azure Public Cloud.
|
||||||
func NewClient(accountName, accountKey, blobServiceBaseURL, apiVersion string, useHTTPS bool) (Client, error) {
|
func NewClient(accountName, accountKey, serviceBaseURL, apiVersion string, useHTTPS bool) (Client, error) {
|
||||||
var c Client
|
var c Client
|
||||||
if !IsValidStorageAccount(accountName) {
|
if !IsValidStorageAccount(accountName) {
|
||||||
return c, fmt.Errorf("azure: account name is not valid: it must be between 3 and 24 characters, and only may contain numbers and lowercase letters: %v", accountName)
|
return c, fmt.Errorf("azure: account name is not valid: it must be between 3 and 24 characters, and only may contain numbers and lowercase letters: %v", accountName)
|
||||||
} else if accountKey == "" {
|
} else if accountKey == "" {
|
||||||
return c, fmt.Errorf("azure: account key required")
|
return c, fmt.Errorf("azure: account key required")
|
||||||
} else if blobServiceBaseURL == "" {
|
} else if serviceBaseURL == "" {
|
||||||
return c, fmt.Errorf("azure: base storage service url required")
|
return c, fmt.Errorf("azure: base storage service url required")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -226,19 +312,14 @@ func NewClient(accountName, accountKey, blobServiceBaseURL, apiVersion string, u
|
||||||
accountName: accountName,
|
accountName: accountName,
|
||||||
accountKey: key,
|
accountKey: key,
|
||||||
useHTTPS: useHTTPS,
|
useHTTPS: useHTTPS,
|
||||||
baseURL: blobServiceBaseURL,
|
baseURL: serviceBaseURL,
|
||||||
apiVersion: apiVersion,
|
apiVersion: apiVersion,
|
||||||
|
sasClient: false,
|
||||||
UseSharedKeyLite: false,
|
UseSharedKeyLite: false,
|
||||||
Sender: &DefaultSender{
|
Sender: &DefaultSender{
|
||||||
RetryAttempts: 5,
|
RetryAttempts: defaultRetryAttempts,
|
||||||
ValidStatusCodes: []int{
|
ValidStatusCodes: defaultValidStatusCodes,
|
||||||
http.StatusRequestTimeout, // 408
|
RetryDuration: defaultRetryDuration,
|
||||||
http.StatusInternalServerError, // 500
|
|
||||||
http.StatusBadGateway, // 502
|
|
||||||
http.StatusServiceUnavailable, // 503
|
|
||||||
http.StatusGatewayTimeout, // 504
|
|
||||||
},
|
|
||||||
RetryDuration: time.Second * 5,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
c.userAgent = c.getDefaultUserAgent()
|
c.userAgent = c.getDefaultUserAgent()
|
||||||
|
|
@ -251,6 +332,84 @@ func IsValidStorageAccount(account string) bool {
|
||||||
return validStorageAccount.MatchString(account)
|
return validStorageAccount.MatchString(account)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewAccountSASClient contructs a client that uses accountSAS authorization
|
||||||
|
// for its operations.
|
||||||
|
func NewAccountSASClient(account string, token url.Values, env azure.Environment) Client {
|
||||||
|
c := newSASClient()
|
||||||
|
c.accountSASToken = token
|
||||||
|
c.accountName = account
|
||||||
|
c.baseURL = env.StorageEndpointSuffix
|
||||||
|
|
||||||
|
// Get API version and protocol from token
|
||||||
|
c.apiVersion = token.Get("sv")
|
||||||
|
c.useHTTPS = token.Get("spr") == "https"
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAccountSASClientFromEndpointToken constructs a client that uses accountSAS authorization
|
||||||
|
// for its operations using the specified endpoint and SAS token.
|
||||||
|
func NewAccountSASClientFromEndpointToken(endpoint string, sasToken string) (Client, error) {
|
||||||
|
u, err := url.Parse(endpoint)
|
||||||
|
if err != nil {
|
||||||
|
return Client{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
token, err := url.ParseQuery(sasToken)
|
||||||
|
if err != nil {
|
||||||
|
return Client{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// the host name will look something like this
|
||||||
|
// - foo.blob.core.windows.net
|
||||||
|
// "foo" is the account name
|
||||||
|
// "core.windows.net" is the baseURL
|
||||||
|
|
||||||
|
// find the first dot to get account name
|
||||||
|
i1 := strings.IndexByte(u.Host, '.')
|
||||||
|
if i1 < 0 {
|
||||||
|
return Client{}, fmt.Errorf("failed to find '.' in %s", u.Host)
|
||||||
|
}
|
||||||
|
|
||||||
|
// now find the second dot to get the base URL
|
||||||
|
i2 := strings.IndexByte(u.Host[i1+1:], '.')
|
||||||
|
if i2 < 0 {
|
||||||
|
return Client{}, fmt.Errorf("failed to find '.' in %s", u.Host[i1+1:])
|
||||||
|
}
|
||||||
|
|
||||||
|
c := newSASClient()
|
||||||
|
c.accountSASToken = token
|
||||||
|
c.accountName = u.Host[:i1]
|
||||||
|
c.baseURL = u.Host[i1+i2+2:]
|
||||||
|
|
||||||
|
// Get API version and protocol from token
|
||||||
|
c.apiVersion = token.Get("sv")
|
||||||
|
c.useHTTPS = token.Get("spr") == "https"
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSASClient() Client {
|
||||||
|
c := Client{
|
||||||
|
HTTPClient: http.DefaultClient,
|
||||||
|
apiVersion: DefaultAPIVersion,
|
||||||
|
sasClient: true,
|
||||||
|
Sender: &DefaultSender{
|
||||||
|
RetryAttempts: defaultRetryAttempts,
|
||||||
|
ValidStatusCodes: defaultValidStatusCodes,
|
||||||
|
RetryDuration: defaultRetryDuration,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
c.userAgent = c.getDefaultUserAgent()
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Client) isServiceSASClient() bool {
|
||||||
|
return c.sasClient && c.accountSASToken == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Client) isAccountSASClient() bool {
|
||||||
|
return c.sasClient && c.accountSASToken != nil
|
||||||
|
}
|
||||||
|
|
||||||
func (c Client) getDefaultUserAgent() string {
|
func (c Client) getDefaultUserAgent() string {
|
||||||
return fmt.Sprintf("Go/%s (%s-%s) azure-storage-go/%s api-version/%s",
|
return fmt.Sprintf("Go/%s (%s-%s) azure-storage-go/%s api-version/%s",
|
||||||
runtime.Version(),
|
runtime.Version(),
|
||||||
|
|
@ -323,6 +482,164 @@ func (c Client) getEndpoint(service, path string, params url.Values) string {
|
||||||
return u.String()
|
return u.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AccountSASTokenOptions includes options for constructing
|
||||||
|
// an account SAS token.
|
||||||
|
// https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas
|
||||||
|
type AccountSASTokenOptions struct {
|
||||||
|
APIVersion string
|
||||||
|
Services Services
|
||||||
|
ResourceTypes ResourceTypes
|
||||||
|
Permissions Permissions
|
||||||
|
Start time.Time
|
||||||
|
Expiry time.Time
|
||||||
|
IP string
|
||||||
|
UseHTTPS bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Services specify services accessible with an account SAS.
|
||||||
|
type Services struct {
|
||||||
|
Blob bool
|
||||||
|
Queue bool
|
||||||
|
Table bool
|
||||||
|
File bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResourceTypes specify the resources accesible with an
|
||||||
|
// account SAS.
|
||||||
|
type ResourceTypes struct {
|
||||||
|
Service bool
|
||||||
|
Container bool
|
||||||
|
Object bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Permissions specifies permissions for an accountSAS.
|
||||||
|
type Permissions struct {
|
||||||
|
Read bool
|
||||||
|
Write bool
|
||||||
|
Delete bool
|
||||||
|
List bool
|
||||||
|
Add bool
|
||||||
|
Create bool
|
||||||
|
Update bool
|
||||||
|
Process bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAccountSASToken creates an account SAS token
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-an-account-sas
|
||||||
|
func (c Client) GetAccountSASToken(options AccountSASTokenOptions) (url.Values, error) {
|
||||||
|
if options.APIVersion == "" {
|
||||||
|
options.APIVersion = c.apiVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.APIVersion < "2015-04-05" {
|
||||||
|
return url.Values{}, fmt.Errorf("account SAS does not support API versions prior to 2015-04-05. API version : %s", options.APIVersion)
|
||||||
|
}
|
||||||
|
|
||||||
|
// build services string
|
||||||
|
services := ""
|
||||||
|
if options.Services.Blob {
|
||||||
|
services += "b"
|
||||||
|
}
|
||||||
|
if options.Services.Queue {
|
||||||
|
services += "q"
|
||||||
|
}
|
||||||
|
if options.Services.Table {
|
||||||
|
services += "t"
|
||||||
|
}
|
||||||
|
if options.Services.File {
|
||||||
|
services += "f"
|
||||||
|
}
|
||||||
|
|
||||||
|
// build resources string
|
||||||
|
resources := ""
|
||||||
|
if options.ResourceTypes.Service {
|
||||||
|
resources += "s"
|
||||||
|
}
|
||||||
|
if options.ResourceTypes.Container {
|
||||||
|
resources += "c"
|
||||||
|
}
|
||||||
|
if options.ResourceTypes.Object {
|
||||||
|
resources += "o"
|
||||||
|
}
|
||||||
|
|
||||||
|
// build permissions string
|
||||||
|
permissions := ""
|
||||||
|
if options.Permissions.Read {
|
||||||
|
permissions += "r"
|
||||||
|
}
|
||||||
|
if options.Permissions.Write {
|
||||||
|
permissions += "w"
|
||||||
|
}
|
||||||
|
if options.Permissions.Delete {
|
||||||
|
permissions += "d"
|
||||||
|
}
|
||||||
|
if options.Permissions.List {
|
||||||
|
permissions += "l"
|
||||||
|
}
|
||||||
|
if options.Permissions.Add {
|
||||||
|
permissions += "a"
|
||||||
|
}
|
||||||
|
if options.Permissions.Create {
|
||||||
|
permissions += "c"
|
||||||
|
}
|
||||||
|
if options.Permissions.Update {
|
||||||
|
permissions += "u"
|
||||||
|
}
|
||||||
|
if options.Permissions.Process {
|
||||||
|
permissions += "p"
|
||||||
|
}
|
||||||
|
|
||||||
|
// build start time, if exists
|
||||||
|
start := ""
|
||||||
|
if options.Start != (time.Time{}) {
|
||||||
|
start = options.Start.Format(time.RFC3339)
|
||||||
|
// For some reason I don't understand, it fails when the rest of the string is included
|
||||||
|
start = start[:10]
|
||||||
|
}
|
||||||
|
|
||||||
|
// build expiry time
|
||||||
|
expiry := options.Expiry.Format(time.RFC3339)
|
||||||
|
// For some reason I don't understand, it fails when the rest of the string is included
|
||||||
|
expiry = expiry[:10]
|
||||||
|
|
||||||
|
protocol := "https,http"
|
||||||
|
if options.UseHTTPS {
|
||||||
|
protocol = "https"
|
||||||
|
}
|
||||||
|
|
||||||
|
stringToSign := strings.Join([]string{
|
||||||
|
c.accountName,
|
||||||
|
permissions,
|
||||||
|
services,
|
||||||
|
resources,
|
||||||
|
start,
|
||||||
|
expiry,
|
||||||
|
options.IP,
|
||||||
|
protocol,
|
||||||
|
options.APIVersion,
|
||||||
|
"",
|
||||||
|
}, "\n")
|
||||||
|
signature := c.computeHmac256(stringToSign)
|
||||||
|
|
||||||
|
sasParams := url.Values{
|
||||||
|
"sv": {options.APIVersion},
|
||||||
|
"ss": {services},
|
||||||
|
"srt": {resources},
|
||||||
|
"sp": {permissions},
|
||||||
|
"se": {expiry},
|
||||||
|
"spr": {protocol},
|
||||||
|
"sig": {signature},
|
||||||
|
}
|
||||||
|
if start != "" {
|
||||||
|
sasParams.Add("st", start)
|
||||||
|
}
|
||||||
|
if options.IP != "" {
|
||||||
|
sasParams.Add("sip", options.IP)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sasParams, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetBlobService returns a BlobStorageClient which can operate on the blob
|
// GetBlobService returns a BlobStorageClient which can operate on the blob
|
||||||
// service of the storage account.
|
// service of the storage account.
|
||||||
func (c Client) GetBlobService() BlobStorageClient {
|
func (c Client) GetBlobService() BlobStorageClient {
|
||||||
|
|
@ -398,12 +715,13 @@ func (c Client) exec(verb, url string, headers map[string]string, body io.Reader
|
||||||
return nil, errors.New("azure/storage: error creating request: " + err.Error())
|
return nil, errors.New("azure/storage: error creating request: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
// if a body was provided ensure that the content length was set.
|
// http.NewRequest() will automatically set req.ContentLength for a handful of types
|
||||||
// http.NewRequest() will automatically do this for a handful of types
|
// otherwise we will handle here.
|
||||||
// and for those that it doesn't we will handle here.
|
if req.ContentLength < 1 {
|
||||||
if body != nil && req.ContentLength < 1 {
|
if clstr, ok := headers["Content-Length"]; ok {
|
||||||
if lr, ok := body.(*io.LimitedReader); ok {
|
if cl, err := strconv.ParseInt(clstr, 10, 64); err == nil {
|
||||||
setContentLengthFromLimitedReader(req, lr)
|
req.ContentLength = cl
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -411,6 +729,13 @@ func (c Client) exec(verb, url string, headers map[string]string, body io.Reader
|
||||||
req.Header[k] = append(req.Header[k], v) // Must bypass case munging present in `Add` by using map functions directly. See https://github.com/Azure/azure-sdk-for-go/issues/645
|
req.Header[k] = append(req.Header[k], v) // Must bypass case munging present in `Add` by using map functions directly. See https://github.com/Azure/azure-sdk-for-go/issues/645
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.isAccountSASClient() {
|
||||||
|
// append the SAS token to the query params
|
||||||
|
v := req.URL.Query()
|
||||||
|
v = mergeParams(v, c.accountSASToken)
|
||||||
|
req.URL.RawQuery = v.Encode()
|
||||||
|
}
|
||||||
|
|
||||||
resp, err := c.Sender.Send(&c, req)
|
resp, err := c.Sender.Send(&c, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
38
vendor/github.com/Azure/azure-sdk-for-go/storage/commonsasuri.go
generated
vendored
Normal file
38
vendor/github.com/Azure/azure-sdk-for-go/storage/commonsasuri.go
generated
vendored
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SASOptions includes options used by SAS URIs for different
|
||||||
|
// services and resources.
|
||||||
|
type SASOptions struct {
|
||||||
|
APIVersion string
|
||||||
|
Start time.Time
|
||||||
|
Expiry time.Time
|
||||||
|
IP string
|
||||||
|
UseHTTPS bool
|
||||||
|
Identifier string
|
||||||
|
}
|
||||||
|
|
||||||
|
func addQueryParameter(query url.Values, key, value string) url.Values {
|
||||||
|
if value != "" {
|
||||||
|
query.Add(key, value)
|
||||||
|
}
|
||||||
|
return query
|
||||||
|
}
|
||||||
169
vendor/github.com/Azure/azure-sdk-for-go/storage/container.go
generated
vendored
169
vendor/github.com/Azure/azure-sdk-for-go/storage/container.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
@ -18,12 +32,66 @@ type Container struct {
|
||||||
Name string `xml:"Name"`
|
Name string `xml:"Name"`
|
||||||
Properties ContainerProperties `xml:"Properties"`
|
Properties ContainerProperties `xml:"Properties"`
|
||||||
Metadata map[string]string
|
Metadata map[string]string
|
||||||
|
sasuri url.URL
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client returns the HTTP client used by the Container reference.
|
||||||
|
func (c *Container) Client() *Client {
|
||||||
|
return &c.bsc.client
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Container) buildPath() string {
|
func (c *Container) buildPath() string {
|
||||||
return fmt.Sprintf("/%s", c.Name)
|
return fmt.Sprintf("/%s", c.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetURL gets the canonical URL to the container.
|
||||||
|
// This method does not create a publicly accessible URL if the container
|
||||||
|
// is private and this method does not check if the blob exists.
|
||||||
|
func (c *Container) GetURL() string {
|
||||||
|
container := c.Name
|
||||||
|
if container == "" {
|
||||||
|
container = "$root"
|
||||||
|
}
|
||||||
|
return c.bsc.client.getEndpoint(blobServiceName, pathForResource(container, ""), nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContainerSASOptions are options to construct a container SAS
|
||||||
|
// URI.
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
|
type ContainerSASOptions struct {
|
||||||
|
ContainerSASPermissions
|
||||||
|
OverrideHeaders
|
||||||
|
SASOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContainerSASPermissions includes the available permissions for
|
||||||
|
// a container SAS URI.
|
||||||
|
type ContainerSASPermissions struct {
|
||||||
|
BlobServiceSASPermissions
|
||||||
|
List bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSASURI creates an URL to the container which contains the Shared
|
||||||
|
// Access Signature with the specified options.
|
||||||
|
//
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
|
func (c *Container) GetSASURI(options ContainerSASOptions) (string, error) {
|
||||||
|
uri := c.GetURL()
|
||||||
|
signedResource := "c"
|
||||||
|
canonicalizedResource, err := c.bsc.client.buildCanonicalizedResource(uri, c.bsc.auth, true)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// build permissions string
|
||||||
|
permissions := options.BlobServiceSASPermissions.buildString()
|
||||||
|
if options.List {
|
||||||
|
permissions += "l"
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.bsc.client.blobAndFileSASURI(options.SASOptions, uri, permissions, canonicalizedResource, signedResource, options.OverrideHeaders)
|
||||||
|
}
|
||||||
|
|
||||||
// ContainerProperties contains various properties of a container returned from
|
// ContainerProperties contains various properties of a container returned from
|
||||||
// various endpoints like ListContainers.
|
// various endpoints like ListContainers.
|
||||||
type ContainerProperties struct {
|
type ContainerProperties struct {
|
||||||
|
|
@ -224,7 +292,17 @@ func (c *Container) create(options *CreateContainerOptions) (*storageResponse, e
|
||||||
// Exists returns true if a container with given name exists
|
// Exists returns true if a container with given name exists
|
||||||
// on the storage account, otherwise returns false.
|
// on the storage account, otherwise returns false.
|
||||||
func (c *Container) Exists() (bool, error) {
|
func (c *Container) Exists() (bool, error) {
|
||||||
uri := c.bsc.client.getEndpoint(blobServiceName, c.buildPath(), url.Values{"restype": {"container"}})
|
q := url.Values{"restype": {"container"}}
|
||||||
|
var uri string
|
||||||
|
if c.bsc.client.isServiceSASClient() {
|
||||||
|
q = mergeParams(q, c.sasuri.Query())
|
||||||
|
newURI := c.sasuri
|
||||||
|
newURI.RawQuery = q.Encode()
|
||||||
|
uri = newURI.String()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
uri = c.bsc.client.getEndpoint(blobServiceName, c.buildPath(), q)
|
||||||
|
}
|
||||||
headers := c.bsc.client.getStandardHeaders()
|
headers := c.bsc.client.getStandardHeaders()
|
||||||
|
|
||||||
resp, err := c.bsc.client.exec(http.MethodHead, uri, headers, nil, c.bsc.auth)
|
resp, err := c.bsc.client.exec(http.MethodHead, uri, headers, nil, c.bsc.auth)
|
||||||
|
|
@ -399,9 +477,17 @@ func (c *Container) delete(options *DeleteContainerOptions) (*storageResponse, e
|
||||||
func (c *Container) ListBlobs(params ListBlobsParameters) (BlobListResponse, error) {
|
func (c *Container) ListBlobs(params ListBlobsParameters) (BlobListResponse, error) {
|
||||||
q := mergeParams(params.getParameters(), url.Values{
|
q := mergeParams(params.getParameters(), url.Values{
|
||||||
"restype": {"container"},
|
"restype": {"container"},
|
||||||
"comp": {"list"}},
|
"comp": {"list"},
|
||||||
)
|
})
|
||||||
uri := c.bsc.client.getEndpoint(blobServiceName, c.buildPath(), q)
|
var uri string
|
||||||
|
if c.bsc.client.isServiceSASClient() {
|
||||||
|
q = mergeParams(q, c.sasuri.Query())
|
||||||
|
newURI := c.sasuri
|
||||||
|
newURI.RawQuery = q.Encode()
|
||||||
|
uri = newURI.String()
|
||||||
|
} else {
|
||||||
|
uri = c.bsc.client.getEndpoint(blobServiceName, c.buildPath(), q)
|
||||||
|
}
|
||||||
|
|
||||||
headers := c.bsc.client.getStandardHeaders()
|
headers := c.bsc.client.getStandardHeaders()
|
||||||
headers = addToHeaders(headers, "x-ms-client-request-id", params.RequestID)
|
headers = addToHeaders(headers, "x-ms-client-request-id", params.RequestID)
|
||||||
|
|
@ -420,6 +506,81 @@ func (c *Container) ListBlobs(params ListBlobsParameters) (BlobListResponse, err
|
||||||
return out, err
|
return out, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ContainerMetadataOptions includes options for container metadata operations
|
||||||
|
type ContainerMetadataOptions struct {
|
||||||
|
Timeout uint
|
||||||
|
LeaseID string `header:"x-ms-lease-id"`
|
||||||
|
RequestID string `header:"x-ms-client-request-id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetMetadata replaces the metadata for the specified container.
|
||||||
|
//
|
||||||
|
// Some keys may be converted to Camel-Case before sending. All keys
|
||||||
|
// are returned in lower case by GetBlobMetadata. HTTP header names
|
||||||
|
// are case-insensitive so case munging should not matter to other
|
||||||
|
// applications either.
|
||||||
|
//
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/set-container-metadata
|
||||||
|
func (c *Container) SetMetadata(options *ContainerMetadataOptions) error {
|
||||||
|
params := url.Values{
|
||||||
|
"comp": {"metadata"},
|
||||||
|
"restype": {"container"},
|
||||||
|
}
|
||||||
|
headers := c.bsc.client.getStandardHeaders()
|
||||||
|
headers = c.bsc.client.addMetadataToHeaders(headers, c.Metadata)
|
||||||
|
|
||||||
|
if options != nil {
|
||||||
|
params = addTimeout(params, options.Timeout)
|
||||||
|
headers = mergeHeaders(headers, headersFromStruct(*options))
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := c.bsc.client.getEndpoint(blobServiceName, c.buildPath(), params)
|
||||||
|
|
||||||
|
resp, err := c.bsc.client.exec(http.MethodPut, uri, headers, nil, c.bsc.auth)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
readAndCloseBody(resp.body)
|
||||||
|
return checkRespCode(resp.statusCode, []int{http.StatusOK})
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMetadata returns all user-defined metadata for the specified container.
|
||||||
|
//
|
||||||
|
// All metadata keys will be returned in lower case. (HTTP header
|
||||||
|
// names are case-insensitive.)
|
||||||
|
//
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/get-container-metadata
|
||||||
|
func (c *Container) GetMetadata(options *ContainerMetadataOptions) error {
|
||||||
|
params := url.Values{
|
||||||
|
"comp": {"metadata"},
|
||||||
|
"restype": {"container"},
|
||||||
|
}
|
||||||
|
headers := c.bsc.client.getStandardHeaders()
|
||||||
|
|
||||||
|
if options != nil {
|
||||||
|
params = addTimeout(params, options.Timeout)
|
||||||
|
headers = mergeHeaders(headers, headersFromStruct(*options))
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := c.bsc.client.getEndpoint(blobServiceName, c.buildPath(), params)
|
||||||
|
|
||||||
|
resp, err := c.bsc.client.exec(http.MethodGet, uri, headers, nil, c.bsc.auth)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
readAndCloseBody(resp.body)
|
||||||
|
if err := checkRespCode(resp.statusCode, []int{http.StatusOK}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c.writeMetadata(resp.headers)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Container) writeMetadata(h http.Header) {
|
||||||
|
c.Metadata = writeMetadata(h)
|
||||||
|
}
|
||||||
|
|
||||||
func generateContainerACLpayload(policies []ContainerAccessPolicy) (io.Reader, int, error) {
|
func generateContainerACLpayload(policies []ContainerAccessPolicy) (io.Reader, int, error) {
|
||||||
sil := SignedIdentifiers{
|
sil := SignedIdentifiers{
|
||||||
SignedIdentifiers: []SignedIdentifier{},
|
SignedIdentifiers: []SignedIdentifier{},
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/copyblob.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/copyblob.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/directory.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/directory.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
|
||||||
16
vendor/github.com/Azure/azure-sdk-for-go/storage/entity.go
generated
vendored
16
vendor/github.com/Azure/azure-sdk-for-go/storage/entity.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
@ -12,7 +26,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/satori/uuid"
|
"github.com/satori/go.uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Annotating as secure for gas scanning
|
// Annotating as secure for gas scanning
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/file.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/file.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/fileserviceclient.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/fileserviceclient.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/leaseblob.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/leaseblob.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/message.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/message.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/odata.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/odata.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
// MetadataLevel determines if operations should return a paylod,
|
// MetadataLevel determines if operations should return a paylod,
|
||||||
// and it level of detail.
|
// and it level of detail.
|
||||||
type MetadataLevel string
|
type MetadataLevel string
|
||||||
|
|
|
||||||
23
vendor/github.com/Azure/azure-sdk-for-go/storage/pageblob.go
generated
vendored
23
vendor/github.com/Azure/azure-sdk-for-go/storage/pageblob.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
@ -73,10 +87,10 @@ func (b *Blob) modifyRange(blobRange BlobRange, bytes io.Reader, options *PutPag
|
||||||
return errors.New("the value for rangeEnd must be greater than or equal to rangeStart")
|
return errors.New("the value for rangeEnd must be greater than or equal to rangeStart")
|
||||||
}
|
}
|
||||||
if blobRange.Start%512 != 0 {
|
if blobRange.Start%512 != 0 {
|
||||||
return errors.New("the value for rangeStart must be a modulus of 512")
|
return errors.New("the value for rangeStart must be a multiple of 512")
|
||||||
}
|
}
|
||||||
if blobRange.End%512 != 511 {
|
if blobRange.End%512 != 511 {
|
||||||
return errors.New("the value for rangeEnd must be a modulus of 511")
|
return errors.New("the value for rangeEnd must be a multiple of 512 - 1")
|
||||||
}
|
}
|
||||||
|
|
||||||
params := url.Values{"comp": {"page"}}
|
params := url.Values{"comp": {"page"}}
|
||||||
|
|
@ -133,7 +147,7 @@ func (b *Blob) GetPageRanges(options *GetPageRangesOptions) (GetPageRangesRespon
|
||||||
params = addTimeout(params, options.Timeout)
|
params = addTimeout(params, options.Timeout)
|
||||||
params = addSnapshot(params, options.Snapshot)
|
params = addSnapshot(params, options.Snapshot)
|
||||||
if options.PreviousSnapshot != nil {
|
if options.PreviousSnapshot != nil {
|
||||||
params.Add("prevsnapshot", timeRfc1123Formatted(*options.PreviousSnapshot))
|
params.Add("prevsnapshot", timeRFC3339Formatted(*options.PreviousSnapshot))
|
||||||
}
|
}
|
||||||
if options.Range != nil {
|
if options.Range != nil {
|
||||||
headers["Range"] = options.Range.String()
|
headers["Range"] = options.Range.String()
|
||||||
|
|
@ -186,6 +200,5 @@ func (b *Blob) PutPageBlob(options *PutBlobOptions) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
readAndCloseBody(resp.body)
|
return b.respondCreation(resp, BlobTypePage)
|
||||||
return checkRespCode(resp.statusCode, []int{http.StatusCreated})
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/queue.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/queue.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
|
||||||
146
vendor/github.com/Azure/azure-sdk-for-go/storage/queuesasuri.go
generated
vendored
Normal file
146
vendor/github.com/Azure/azure-sdk-for-go/storage/queuesasuri.go
generated
vendored
Normal file
|
|
@ -0,0 +1,146 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// QueueSASOptions are options to construct a blob SAS
|
||||||
|
// URI.
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
|
type QueueSASOptions struct {
|
||||||
|
QueueSASPermissions
|
||||||
|
SASOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueueSASPermissions includes the available permissions for
|
||||||
|
// a queue SAS URI.
|
||||||
|
type QueueSASPermissions struct {
|
||||||
|
Read bool
|
||||||
|
Add bool
|
||||||
|
Update bool
|
||||||
|
Process bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q QueueSASPermissions) buildString() string {
|
||||||
|
permissions := ""
|
||||||
|
|
||||||
|
if q.Read {
|
||||||
|
permissions += "r"
|
||||||
|
}
|
||||||
|
if q.Add {
|
||||||
|
permissions += "a"
|
||||||
|
}
|
||||||
|
if q.Update {
|
||||||
|
permissions += "u"
|
||||||
|
}
|
||||||
|
if q.Process {
|
||||||
|
permissions += "p"
|
||||||
|
}
|
||||||
|
return permissions
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSASURI creates an URL to the specified queue which contains the Shared
|
||||||
|
// Access Signature with specified permissions and expiration time.
|
||||||
|
//
|
||||||
|
// See https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas
|
||||||
|
func (q *Queue) GetSASURI(options QueueSASOptions) (string, error) {
|
||||||
|
canonicalizedResource, err := q.qsc.client.buildCanonicalizedResource(q.buildPath(), q.qsc.auth, true)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// "The canonicalizedresouce portion of the string is a canonical path to the signed resource.
|
||||||
|
// It must include the service name (blob, table, queue or file) for version 2015-02-21 or
|
||||||
|
// later, the storage account name, and the resource name, and must be URL-decoded.
|
||||||
|
// -- https://msdn.microsoft.com/en-us/library/azure/dn140255.aspx
|
||||||
|
// We need to replace + with %2b first to avoid being treated as a space (which is correct for query strings, but not the path component).
|
||||||
|
canonicalizedResource = strings.Replace(canonicalizedResource, "+", "%2b", -1)
|
||||||
|
canonicalizedResource, err = url.QueryUnescape(canonicalizedResource)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
signedStart := ""
|
||||||
|
if options.Start != (time.Time{}) {
|
||||||
|
signedStart = options.Start.UTC().Format(time.RFC3339)
|
||||||
|
}
|
||||||
|
signedExpiry := options.Expiry.UTC().Format(time.RFC3339)
|
||||||
|
|
||||||
|
protocols := "https,http"
|
||||||
|
if options.UseHTTPS {
|
||||||
|
protocols = "https"
|
||||||
|
}
|
||||||
|
|
||||||
|
permissions := options.QueueSASPermissions.buildString()
|
||||||
|
stringToSign, err := queueSASStringToSign(q.qsc.client.apiVersion, canonicalizedResource, signedStart, signedExpiry, options.IP, permissions, protocols, options.Identifier)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
sig := q.qsc.client.computeHmac256(stringToSign)
|
||||||
|
sasParams := url.Values{
|
||||||
|
"sv": {q.qsc.client.apiVersion},
|
||||||
|
"se": {signedExpiry},
|
||||||
|
"sp": {permissions},
|
||||||
|
"sig": {sig},
|
||||||
|
}
|
||||||
|
|
||||||
|
if q.qsc.client.apiVersion >= "2015-04-05" {
|
||||||
|
sasParams.Add("spr", protocols)
|
||||||
|
addQueryParameter(sasParams, "sip", options.IP)
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := q.qsc.client.getEndpoint(queueServiceName, q.buildPath(), nil)
|
||||||
|
sasURL, err := url.Parse(uri)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
sasURL.RawQuery = sasParams.Encode()
|
||||||
|
return sasURL.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func queueSASStringToSign(signedVersion, canonicalizedResource, signedStart, signedExpiry, signedIP, signedPermissions, protocols, signedIdentifier string) (string, error) {
|
||||||
|
|
||||||
|
if signedVersion >= "2015-02-21" {
|
||||||
|
canonicalizedResource = "/queue" + canonicalizedResource
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://msdn.microsoft.com/en-us/library/azure/dn140255.aspx#Anchor_12
|
||||||
|
if signedVersion >= "2015-04-05" {
|
||||||
|
return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s",
|
||||||
|
signedPermissions,
|
||||||
|
signedStart,
|
||||||
|
signedExpiry,
|
||||||
|
canonicalizedResource,
|
||||||
|
signedIdentifier,
|
||||||
|
signedIP,
|
||||||
|
protocols,
|
||||||
|
signedVersion), nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// reference: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx
|
||||||
|
if signedVersion >= "2013-08-15" {
|
||||||
|
return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s", signedPermissions, signedStart, signedExpiry, canonicalizedResource, signedIdentifier, signedVersion), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", errors.New("storage: not implemented SAS for versions earlier than 2013-08-15")
|
||||||
|
}
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/queueserviceclient.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/queueserviceclient.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
// QueueServiceClient contains operations for Microsoft Azure Queue Storage
|
// QueueServiceClient contains operations for Microsoft Azure Queue Storage
|
||||||
// Service.
|
// Service.
|
||||||
type QueueServiceClient struct {
|
type QueueServiceClient struct {
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/share.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/share.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/storagepolicy.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/storagepolicy.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/storageservice.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/storageservice.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
|
||||||
25
vendor/github.com/Azure/azure-sdk-for-go/storage/table.go
generated
vendored
25
vendor/github.com/Azure/azure-sdk-for-go/storage/table.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
@ -174,11 +188,7 @@ func (t *Table) Delete(timeout uint, options *TableOptions) error {
|
||||||
}
|
}
|
||||||
defer readAndCloseBody(resp.body)
|
defer readAndCloseBody(resp.body)
|
||||||
|
|
||||||
if err := checkRespCode(resp.statusCode, []int{http.StatusNoContent}); err != nil {
|
return checkRespCode(resp.statusCode, []int{http.StatusNoContent})
|
||||||
return err
|
|
||||||
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryOptions includes options for a query entities operation.
|
// QueryOptions includes options for a query entities operation.
|
||||||
|
|
@ -261,10 +271,7 @@ func (t *Table) SetPermissions(tap []TableAccessPolicy, timeout uint, options *T
|
||||||
}
|
}
|
||||||
defer readAndCloseBody(resp.body)
|
defer readAndCloseBody(resp.body)
|
||||||
|
|
||||||
if err := checkRespCode(resp.statusCode, []int{http.StatusNoContent}); err != nil {
|
return checkRespCode(resp.statusCode, []int{http.StatusNoContent})
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func generateTableACLPayload(policies []TableAccessPolicy) (io.Reader, int, error) {
|
func generateTableACLPayload(policies []TableAccessPolicy) (io.Reader, int, error) {
|
||||||
|
|
|
||||||
32
vendor/github.com/Azure/azure-sdk-for-go/storage/table_batch.go
generated
vendored
32
vendor/github.com/Azure/azure-sdk-for-go/storage/table_batch.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
@ -12,7 +26,7 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/satori/uuid"
|
"github.com/marstr/guid"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Operation type. Insert, Delete, Replace etc.
|
// Operation type. Insert, Delete, Replace etc.
|
||||||
|
|
@ -117,14 +131,26 @@ func (t *TableBatch) MergeEntity(entity *Entity) {
|
||||||
// the changesets.
|
// the changesets.
|
||||||
// As per document https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/performing-entity-group-transactions
|
// As per document https://docs.microsoft.com/en-us/rest/api/storageservices/fileservices/performing-entity-group-transactions
|
||||||
func (t *TableBatch) ExecuteBatch() error {
|
func (t *TableBatch) ExecuteBatch() error {
|
||||||
changesetBoundary := fmt.Sprintf("changeset_%s", uuid.NewV1())
|
|
||||||
|
// Using `github.com/marstr/guid` is in response to issue #947 (https://github.com/Azure/azure-sdk-for-go/issues/947).
|
||||||
|
id, err := guid.NewGUIDs(guid.CreationStrategyVersion1)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
changesetBoundary := fmt.Sprintf("changeset_%s", id.String())
|
||||||
uri := t.Table.tsc.client.getEndpoint(tableServiceName, "$batch", nil)
|
uri := t.Table.tsc.client.getEndpoint(tableServiceName, "$batch", nil)
|
||||||
changesetBody, err := t.generateChangesetBody(changesetBoundary)
|
changesetBody, err := t.generateChangesetBody(changesetBoundary)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
boundary := fmt.Sprintf("batch_%s", uuid.NewV1())
|
id, err = guid.NewGUIDs(guid.CreationStrategyVersion1)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
boundary := fmt.Sprintf("batch_%s", id.String())
|
||||||
body, err := generateBody(changesetBody, changesetBoundary, boundary)
|
body, err := generateBody(changesetBody, changesetBoundary, boundary)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/azure-sdk-for-go/storage/tableserviceclient.go
generated
vendored
14
vendor/github.com/Azure/azure-sdk-for-go/storage/tableserviceclient.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
|
||||||
44
vendor/github.com/Azure/azure-sdk-for-go/storage/util.go
generated
vendored
44
vendor/github.com/Azure/azure-sdk-for-go/storage/util.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
|
|
@ -18,7 +32,29 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
fixedTime = time.Date(2050, time.December, 20, 21, 55, 0, 0, time.FixedZone("GMT", -6))
|
fixedTime = time.Date(2050, time.December, 20, 21, 55, 0, 0, time.FixedZone("GMT", -6))
|
||||||
|
accountSASOptions = AccountSASTokenOptions{
|
||||||
|
Services: Services{
|
||||||
|
Blob: true,
|
||||||
|
},
|
||||||
|
ResourceTypes: ResourceTypes{
|
||||||
|
Service: true,
|
||||||
|
Container: true,
|
||||||
|
Object: true,
|
||||||
|
},
|
||||||
|
Permissions: Permissions{
|
||||||
|
Read: true,
|
||||||
|
Write: true,
|
||||||
|
Delete: true,
|
||||||
|
List: true,
|
||||||
|
Add: true,
|
||||||
|
Create: true,
|
||||||
|
Update: true,
|
||||||
|
Process: true,
|
||||||
|
},
|
||||||
|
Expiry: fixedTime,
|
||||||
|
UseHTTPS: true,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c Client) computeHmac256(message string) string {
|
func (c Client) computeHmac256(message string) string {
|
||||||
|
|
@ -35,6 +71,10 @@ func timeRfc1123Formatted(t time.Time) string {
|
||||||
return t.Format(http.TimeFormat)
|
return t.Format(http.TimeFormat)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func timeRFC3339Formatted(t time.Time) string {
|
||||||
|
return t.Format("2006-01-02T15:04:05.0000000Z")
|
||||||
|
}
|
||||||
|
|
||||||
func mergeParams(v1, v2 url.Values) url.Values {
|
func mergeParams(v1, v2 url.Values) url.Values {
|
||||||
out := url.Values{}
|
out := url.Values{}
|
||||||
for k, v := range v1 {
|
for k, v := range v1 {
|
||||||
|
|
@ -136,7 +176,7 @@ func addTimeout(params url.Values, timeout uint) url.Values {
|
||||||
|
|
||||||
func addSnapshot(params url.Values, snapshot *time.Time) url.Values {
|
func addSnapshot(params url.Values, snapshot *time.Time) url.Values {
|
||||||
if snapshot != nil {
|
if snapshot != nil {
|
||||||
params.Add("snapshot", snapshot.Format("2006-01-02T15:04:05.0000000Z"))
|
params.Add("snapshot", timeRFC3339Formatted(*snapshot))
|
||||||
}
|
}
|
||||||
return params
|
return params
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
vendor/github.com/Azure/azure-sdk-for-go/storage/util_1.7.go
generated
vendored
12
vendor/github.com/Azure/azure-sdk-for-go/storage/util_1.7.go
generated
vendored
|
|
@ -1,12 +0,0 @@
|
||||||
// +build !go1.8
|
|
||||||
|
|
||||||
package storage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func setContentLengthFromLimitedReader(req *http.Request, lr *io.LimitedReader) {
|
|
||||||
req.ContentLength = lr.N
|
|
||||||
}
|
|
||||||
18
vendor/github.com/Azure/azure-sdk-for-go/storage/util_1.8.go
generated
vendored
18
vendor/github.com/Azure/azure-sdk-for-go/storage/util_1.8.go
generated
vendored
|
|
@ -1,18 +0,0 @@
|
||||||
// +build go1.8
|
|
||||||
|
|
||||||
package storage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
|
||||||
)
|
|
||||||
|
|
||||||
func setContentLengthFromLimitedReader(req *http.Request, lr *io.LimitedReader) {
|
|
||||||
req.ContentLength = lr.N
|
|
||||||
snapshot := *lr
|
|
||||||
req.GetBody = func() (io.ReadCloser, error) {
|
|
||||||
r := snapshot
|
|
||||||
return ioutil.NopCloser(&r), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
16
vendor/github.com/Azure/azure-sdk-for-go/storage/version.go
generated
vendored
16
vendor/github.com/Azure/azure-sdk-for-go/storage/version.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
var (
|
var (
|
||||||
sdkVersion = "10.0.2"
|
sdkVersion = "v12.3.0-beta"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
34
vendor/github.com/Azure/go-autorest/autorest/adal/README.md
generated
vendored
34
vendor/github.com/Azure/go-autorest/autorest/adal/README.md
generated
vendored
|
|
@ -218,6 +218,40 @@ if (err == nil) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Username password authenticate
|
||||||
|
|
||||||
|
```Go
|
||||||
|
spt, err := adal.NewServicePrincipalTokenFromUsernamePassword(
|
||||||
|
oauthConfig,
|
||||||
|
applicationID,
|
||||||
|
username,
|
||||||
|
password,
|
||||||
|
resource,
|
||||||
|
callbacks...)
|
||||||
|
|
||||||
|
if (err == nil) {
|
||||||
|
token := spt.Token
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Authorization code authenticate
|
||||||
|
|
||||||
|
``` Go
|
||||||
|
spt, err := adal.NewServicePrincipalTokenFromAuthorizationCode(
|
||||||
|
oauthConfig,
|
||||||
|
applicationID,
|
||||||
|
clientSecret,
|
||||||
|
authorizationCode,
|
||||||
|
redirectURI,
|
||||||
|
resource,
|
||||||
|
callbacks...)
|
||||||
|
|
||||||
|
err = spt.Refresh()
|
||||||
|
if (err == nil) {
|
||||||
|
token := spt.Token
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Command Line Tool
|
### Command Line Tool
|
||||||
|
|
||||||
A command line tool is available in `cmd/adal.go` that can acquire a token for a given resource. It supports all flows mentioned above.
|
A command line tool is available in `cmd/adal.go` that can acquire a token for a given resource. It supports all flows mentioned above.
|
||||||
|
|
|
||||||
30
vendor/github.com/Azure/go-autorest/autorest/adal/config.go
generated
vendored
30
vendor/github.com/Azure/go-autorest/autorest/adal/config.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package adal
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
@ -18,8 +32,24 @@ type OAuthConfig struct {
|
||||||
DeviceCodeEndpoint url.URL
|
DeviceCodeEndpoint url.URL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsZero returns true if the OAuthConfig object is zero-initialized.
|
||||||
|
func (oac OAuthConfig) IsZero() bool {
|
||||||
|
return oac == OAuthConfig{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateStringParam(param, name string) error {
|
||||||
|
if len(param) == 0 {
|
||||||
|
return fmt.Errorf("parameter '" + name + "' cannot be empty")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// NewOAuthConfig returns an OAuthConfig with tenant specific urls
|
// NewOAuthConfig returns an OAuthConfig with tenant specific urls
|
||||||
func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, error) {
|
func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, error) {
|
||||||
|
if err := validateStringParam(activeDirectoryEndpoint, "activeDirectoryEndpoint"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
// it's legal for tenantID to be empty so don't validate it
|
||||||
const activeDirectoryEndpointTemplate = "%s/oauth2/%s?api-version=%s"
|
const activeDirectoryEndpointTemplate = "%s/oauth2/%s?api-version=%s"
|
||||||
u, err := url.Parse(activeDirectoryEndpoint)
|
u, err := url.Parse(activeDirectoryEndpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package adal
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
This file is largely based on rjw57/oauth2device's code, with the follow differences:
|
This file is largely based on rjw57/oauth2device's code, with the follow differences:
|
||||||
* scope -> resource, and only allow a single one
|
* scope -> resource, and only allow a single one
|
||||||
|
|
|
||||||
20
vendor/github.com/Azure/go-autorest/autorest/adal/msi.go
generated
vendored
Normal file
20
vendor/github.com/Azure/go-autorest/autorest/adal/msi.go
generated
vendored
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
// msiPath is the path to the MSI Extension settings file (to discover the endpoint)
|
||||||
|
var msiPath = "/var/lib/waagent/ManagedIdentity-Settings"
|
||||||
25
vendor/github.com/Azure/go-autorest/autorest/adal/msi_windows.go
generated
vendored
Normal file
25
vendor/github.com/Azure/go-autorest/autorest/adal/msi_windows.go
generated
vendored
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// msiPath is the path to the MSI Extension settings file (to discover the endpoint)
|
||||||
|
var msiPath = strings.Join([]string{os.Getenv("SystemDrive"), "WindowsAzure/Config/ManagedIdentity-Settings"}, "/")
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/adal/persist.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/adal/persist.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package adal
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package adal
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
326
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
326
vendor/github.com/Azure/go-autorest/autorest/adal/token.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package adal
|
package adal
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/rsa"
|
"crypto/rsa"
|
||||||
|
|
@ -13,14 +27,15 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/Azure/go-autorest/autorest/date"
|
||||||
"github.com/dgrijalva/jwt-go"
|
"github.com/dgrijalva/jwt-go"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
defaultRefresh = 5 * time.Minute
|
defaultRefresh = 5 * time.Minute
|
||||||
tokenBaseDate = "1970-01-01T00:00:00Z"
|
|
||||||
|
|
||||||
// OAuthGrantTypeDeviceCode is the "grant_type" identifier used in device flow
|
// OAuthGrantTypeDeviceCode is the "grant_type" identifier used in device flow
|
||||||
OAuthGrantTypeDeviceCode = "device_code"
|
OAuthGrantTypeDeviceCode = "device_code"
|
||||||
|
|
@ -28,27 +43,30 @@ const (
|
||||||
// OAuthGrantTypeClientCredentials is the "grant_type" identifier used in credential flows
|
// OAuthGrantTypeClientCredentials is the "grant_type" identifier used in credential flows
|
||||||
OAuthGrantTypeClientCredentials = "client_credentials"
|
OAuthGrantTypeClientCredentials = "client_credentials"
|
||||||
|
|
||||||
|
// OAuthGrantTypeUserPass is the "grant_type" identifier used in username and password auth flows
|
||||||
|
OAuthGrantTypeUserPass = "password"
|
||||||
|
|
||||||
// OAuthGrantTypeRefreshToken is the "grant_type" identifier used in refresh token flows
|
// OAuthGrantTypeRefreshToken is the "grant_type" identifier used in refresh token flows
|
||||||
OAuthGrantTypeRefreshToken = "refresh_token"
|
OAuthGrantTypeRefreshToken = "refresh_token"
|
||||||
|
|
||||||
// managedIdentitySettingsPath is the path to the MSI Extension settings file (to discover the endpoint)
|
// OAuthGrantTypeAuthorizationCode is the "grant_type" identifier used in authorization code flows
|
||||||
managedIdentitySettingsPath = "/var/lib/waagent/ManagedIdentity-Settings"
|
OAuthGrantTypeAuthorizationCode = "authorization_code"
|
||||||
|
|
||||||
// metadataHeader is the header required by MSI extension
|
// metadataHeader is the header required by MSI extension
|
||||||
metadataHeader = "Metadata"
|
metadataHeader = "Metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
var expirationBase time.Time
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
expirationBase, _ = time.Parse(time.RFC3339, tokenBaseDate)
|
|
||||||
}
|
|
||||||
|
|
||||||
// OAuthTokenProvider is an interface which should be implemented by an access token retriever
|
// OAuthTokenProvider is an interface which should be implemented by an access token retriever
|
||||||
type OAuthTokenProvider interface {
|
type OAuthTokenProvider interface {
|
||||||
OAuthToken() string
|
OAuthToken() string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TokenRefreshError is an interface used by errors returned during token refresh.
|
||||||
|
type TokenRefreshError interface {
|
||||||
|
error
|
||||||
|
Response() *http.Response
|
||||||
|
}
|
||||||
|
|
||||||
// Refresher is an interface for token refresh functionality
|
// Refresher is an interface for token refresh functionality
|
||||||
type Refresher interface {
|
type Refresher interface {
|
||||||
Refresh() error
|
Refresh() error
|
||||||
|
|
@ -73,13 +91,21 @@ type Token struct {
|
||||||
Type string `json:"token_type"`
|
Type string `json:"token_type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsZero returns true if the token object is zero-initialized.
|
||||||
|
func (t Token) IsZero() bool {
|
||||||
|
return t == Token{}
|
||||||
|
}
|
||||||
|
|
||||||
// Expires returns the time.Time when the Token expires.
|
// Expires returns the time.Time when the Token expires.
|
||||||
func (t Token) Expires() time.Time {
|
func (t Token) Expires() time.Time {
|
||||||
s, err := strconv.Atoi(t.ExpiresOn)
|
s, err := strconv.Atoi(t.ExpiresOn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s = -3600
|
s = -3600
|
||||||
}
|
}
|
||||||
return expirationBase.Add(time.Duration(s) * time.Second).UTC()
|
|
||||||
|
expiration := date.NewUnixTimeFromSeconds(float64(s))
|
||||||
|
|
||||||
|
return time.Time(expiration).UTC()
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsExpired returns true if the Token is expired, false otherwise.
|
// IsExpired returns true if the Token is expired, false otherwise.
|
||||||
|
|
@ -137,10 +163,36 @@ type ServicePrincipalCertificateSecret struct {
|
||||||
type ServicePrincipalMSISecret struct {
|
type ServicePrincipalMSISecret struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ServicePrincipalUsernamePasswordSecret implements ServicePrincipalSecret for username and password auth.
|
||||||
|
type ServicePrincipalUsernamePasswordSecret struct {
|
||||||
|
Username string
|
||||||
|
Password string
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServicePrincipalAuthorizationCodeSecret implements ServicePrincipalSecret for authorization code auth.
|
||||||
|
type ServicePrincipalAuthorizationCodeSecret struct {
|
||||||
|
ClientSecret string
|
||||||
|
AuthorizationCode string
|
||||||
|
RedirectURI string
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||||
|
func (secret *ServicePrincipalAuthorizationCodeSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||||
|
v.Set("code", secret.AuthorizationCode)
|
||||||
|
v.Set("client_secret", secret.ClientSecret)
|
||||||
|
v.Set("redirect_uri", secret.RedirectURI)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||||
|
func (secret *ServicePrincipalUsernamePasswordSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||||
|
v.Set("username", secret.Username)
|
||||||
|
v.Set("password", secret.Password)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
|
||||||
// MSI extension requires the authority field to be set to the real tenant authority endpoint
|
|
||||||
func (msiSecret *ServicePrincipalMSISecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
func (msiSecret *ServicePrincipalMSISecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
|
||||||
v.Set("authority", spt.oauthConfig.AuthorityEndpoint.String())
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -193,25 +245,46 @@ func (secret *ServicePrincipalCertificateSecret) SetAuthenticationValues(spt *Se
|
||||||
type ServicePrincipalToken struct {
|
type ServicePrincipalToken struct {
|
||||||
Token
|
Token
|
||||||
|
|
||||||
secret ServicePrincipalSecret
|
secret ServicePrincipalSecret
|
||||||
oauthConfig OAuthConfig
|
oauthConfig OAuthConfig
|
||||||
clientID string
|
clientID string
|
||||||
resource string
|
resource string
|
||||||
autoRefresh bool
|
autoRefresh bool
|
||||||
refreshWithin time.Duration
|
autoRefreshLock *sync.Mutex
|
||||||
sender Sender
|
refreshWithin time.Duration
|
||||||
|
sender Sender
|
||||||
|
|
||||||
refreshCallbacks []TokenRefreshCallback
|
refreshCallbacks []TokenRefreshCallback
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateOAuthConfig(oac OAuthConfig) error {
|
||||||
|
if oac.IsZero() {
|
||||||
|
return fmt.Errorf("parameter 'oauthConfig' cannot be zero-initialized")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// NewServicePrincipalTokenWithSecret create a ServicePrincipalToken using the supplied ServicePrincipalSecret implementation.
|
// NewServicePrincipalTokenWithSecret create a ServicePrincipalToken using the supplied ServicePrincipalSecret implementation.
|
||||||
func NewServicePrincipalTokenWithSecret(oauthConfig OAuthConfig, id string, resource string, secret ServicePrincipalSecret, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
func NewServicePrincipalTokenWithSecret(oauthConfig OAuthConfig, id string, resource string, secret ServicePrincipalSecret, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(id, "id"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if secret == nil {
|
||||||
|
return nil, fmt.Errorf("parameter 'secret' cannot be nil")
|
||||||
|
}
|
||||||
spt := &ServicePrincipalToken{
|
spt := &ServicePrincipalToken{
|
||||||
oauthConfig: oauthConfig,
|
oauthConfig: oauthConfig,
|
||||||
secret: secret,
|
secret: secret,
|
||||||
clientID: id,
|
clientID: id,
|
||||||
resource: resource,
|
resource: resource,
|
||||||
autoRefresh: true,
|
autoRefresh: true,
|
||||||
|
autoRefreshLock: &sync.Mutex{},
|
||||||
refreshWithin: defaultRefresh,
|
refreshWithin: defaultRefresh,
|
||||||
sender: &http.Client{},
|
sender: &http.Client{},
|
||||||
refreshCallbacks: callbacks,
|
refreshCallbacks: callbacks,
|
||||||
|
|
@ -221,6 +294,18 @@ func NewServicePrincipalTokenWithSecret(oauthConfig OAuthConfig, id string, reso
|
||||||
|
|
||||||
// NewServicePrincipalTokenFromManualToken creates a ServicePrincipalToken using the supplied token
|
// NewServicePrincipalTokenFromManualToken creates a ServicePrincipalToken using the supplied token
|
||||||
func NewServicePrincipalTokenFromManualToken(oauthConfig OAuthConfig, clientID string, resource string, token Token, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
func NewServicePrincipalTokenFromManualToken(oauthConfig OAuthConfig, clientID string, resource string, token Token, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if token.IsZero() {
|
||||||
|
return nil, fmt.Errorf("parameter 'token' cannot be zero-initialized")
|
||||||
|
}
|
||||||
spt, err := NewServicePrincipalTokenWithSecret(
|
spt, err := NewServicePrincipalTokenWithSecret(
|
||||||
oauthConfig,
|
oauthConfig,
|
||||||
clientID,
|
clientID,
|
||||||
|
|
@ -239,6 +324,18 @@ func NewServicePrincipalTokenFromManualToken(oauthConfig OAuthConfig, clientID s
|
||||||
// NewServicePrincipalToken creates a ServicePrincipalToken from the supplied Service Principal
|
// NewServicePrincipalToken creates a ServicePrincipalToken from the supplied Service Principal
|
||||||
// credentials scoped to the named resource.
|
// credentials scoped to the named resource.
|
||||||
func NewServicePrincipalToken(oauthConfig OAuthConfig, clientID string, secret string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
func NewServicePrincipalToken(oauthConfig OAuthConfig, clientID string, secret string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(secret, "secret"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return NewServicePrincipalTokenWithSecret(
|
return NewServicePrincipalTokenWithSecret(
|
||||||
oauthConfig,
|
oauthConfig,
|
||||||
clientID,
|
clientID,
|
||||||
|
|
@ -250,8 +347,23 @@ func NewServicePrincipalToken(oauthConfig OAuthConfig, clientID string, secret s
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewServicePrincipalTokenFromCertificate create a ServicePrincipalToken from the supplied pkcs12 bytes.
|
// NewServicePrincipalTokenFromCertificate creates a ServicePrincipalToken from the supplied pkcs12 bytes.
|
||||||
func NewServicePrincipalTokenFromCertificate(oauthConfig OAuthConfig, clientID string, certificate *x509.Certificate, privateKey *rsa.PrivateKey, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
func NewServicePrincipalTokenFromCertificate(oauthConfig OAuthConfig, clientID string, certificate *x509.Certificate, privateKey *rsa.PrivateKey, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if certificate == nil {
|
||||||
|
return nil, fmt.Errorf("parameter 'certificate' cannot be nil")
|
||||||
|
}
|
||||||
|
if privateKey == nil {
|
||||||
|
return nil, fmt.Errorf("parameter 'privateKey' cannot be nil")
|
||||||
|
}
|
||||||
return NewServicePrincipalTokenWithSecret(
|
return NewServicePrincipalTokenWithSecret(
|
||||||
oauthConfig,
|
oauthConfig,
|
||||||
clientID,
|
clientID,
|
||||||
|
|
@ -264,57 +376,175 @@ func NewServicePrincipalTokenFromCertificate(oauthConfig OAuthConfig, clientID s
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewServicePrincipalTokenFromMSI creates a ServicePrincipalToken via the MSI VM Extension.
|
// NewServicePrincipalTokenFromUsernamePassword creates a ServicePrincipalToken from the username and password.
|
||||||
func NewServicePrincipalTokenFromMSI(oauthConfig OAuthConfig, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
func NewServicePrincipalTokenFromUsernamePassword(oauthConfig OAuthConfig, clientID string, username string, password string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
return newServicePrincipalTokenFromMSI(oauthConfig, resource, managedIdentitySettingsPath, callbacks...)
|
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(username, "username"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(password, "password"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewServicePrincipalTokenWithSecret(
|
||||||
|
oauthConfig,
|
||||||
|
clientID,
|
||||||
|
resource,
|
||||||
|
&ServicePrincipalUsernamePasswordSecret{
|
||||||
|
Username: username,
|
||||||
|
Password: password,
|
||||||
|
},
|
||||||
|
callbacks...,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newServicePrincipalTokenFromMSI(oauthConfig OAuthConfig, resource, settingsPath string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
// NewServicePrincipalTokenFromAuthorizationCode creates a ServicePrincipalToken from the
|
||||||
// Read MSI settings
|
func NewServicePrincipalTokenFromAuthorizationCode(oauthConfig OAuthConfig, clientID string, clientSecret string, authorizationCode string, redirectURI string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
bytes, err := ioutil.ReadFile(settingsPath)
|
|
||||||
if err != nil {
|
if err := validateOAuthConfig(oauthConfig); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if err := validateStringParam(clientID, "clientID"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(clientSecret, "clientSecret"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(authorizationCode, "authorizationCode"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(redirectURI, "redirectURI"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return NewServicePrincipalTokenWithSecret(
|
||||||
|
oauthConfig,
|
||||||
|
clientID,
|
||||||
|
resource,
|
||||||
|
&ServicePrincipalAuthorizationCodeSecret{
|
||||||
|
ClientSecret: clientSecret,
|
||||||
|
AuthorizationCode: authorizationCode,
|
||||||
|
RedirectURI: redirectURI,
|
||||||
|
},
|
||||||
|
callbacks...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMSIVMEndpoint gets the MSI endpoint on Virtual Machines.
|
||||||
|
func GetMSIVMEndpoint() (string, error) {
|
||||||
|
return getMSIVMEndpoint(msiPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getMSIVMEndpoint(path string) (string, error) {
|
||||||
|
// Read MSI settings
|
||||||
|
bytes, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
msiSettings := struct {
|
msiSettings := struct {
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
}{}
|
}{}
|
||||||
err = json.Unmarshal(bytes, &msiSettings)
|
err = json.Unmarshal(bytes, &msiSettings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return msiSettings.URL, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewServicePrincipalTokenFromMSI creates a ServicePrincipalToken via the MSI VM Extension.
|
||||||
|
// It will use the system assigned identity when creating the token.
|
||||||
|
func NewServicePrincipalTokenFromMSI(msiEndpoint, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
return newServicePrincipalTokenFromMSI(msiEndpoint, resource, nil, callbacks...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewServicePrincipalTokenFromMSIWithUserAssignedID creates a ServicePrincipalToken via the MSI VM Extension.
|
||||||
|
// It will use the specified user assigned identity when creating the token.
|
||||||
|
func NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, resource string, userAssignedID string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
return newServicePrincipalTokenFromMSI(msiEndpoint, resource, &userAssignedID, callbacks...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newServicePrincipalTokenFromMSI(msiEndpoint, resource string, userAssignedID *string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
|
||||||
|
if err := validateStringParam(msiEndpoint, "msiEndpoint"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := validateStringParam(resource, "resource"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if userAssignedID != nil {
|
||||||
|
if err := validateStringParam(*userAssignedID, "userAssignedID"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
// We set the oauth config token endpoint to be MSI's endpoint
|
// We set the oauth config token endpoint to be MSI's endpoint
|
||||||
// We leave the authority as-is so MSI can POST it with the token request
|
msiEndpointURL, err := url.Parse(msiEndpoint)
|
||||||
msiEndpointURL, err := url.Parse(msiSettings.URL)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
msiTokenEndpointURL, err := msiEndpointURL.Parse("/oauth2/token")
|
oauthConfig, err := NewOAuthConfig(msiEndpointURL.String(), "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
oauthConfig.TokenEndpoint = *msiTokenEndpointURL
|
|
||||||
|
|
||||||
spt := &ServicePrincipalToken{
|
spt := &ServicePrincipalToken{
|
||||||
oauthConfig: oauthConfig,
|
oauthConfig: *oauthConfig,
|
||||||
secret: &ServicePrincipalMSISecret{},
|
secret: &ServicePrincipalMSISecret{},
|
||||||
resource: resource,
|
resource: resource,
|
||||||
autoRefresh: true,
|
autoRefresh: true,
|
||||||
|
autoRefreshLock: &sync.Mutex{},
|
||||||
refreshWithin: defaultRefresh,
|
refreshWithin: defaultRefresh,
|
||||||
sender: &http.Client{},
|
sender: &http.Client{},
|
||||||
refreshCallbacks: callbacks,
|
refreshCallbacks: callbacks,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if userAssignedID != nil {
|
||||||
|
spt.clientID = *userAssignedID
|
||||||
|
}
|
||||||
|
|
||||||
return spt, nil
|
return spt, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// internal type that implements TokenRefreshError
|
||||||
|
type tokenRefreshError struct {
|
||||||
|
message string
|
||||||
|
resp *http.Response
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error implements the error interface which is part of the TokenRefreshError interface.
|
||||||
|
func (tre tokenRefreshError) Error() string {
|
||||||
|
return tre.message
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response implements the TokenRefreshError interface, it returns the raw HTTP response from the refresh operation.
|
||||||
|
func (tre tokenRefreshError) Response() *http.Response {
|
||||||
|
return tre.resp
|
||||||
|
}
|
||||||
|
|
||||||
|
func newTokenRefreshError(message string, resp *http.Response) TokenRefreshError {
|
||||||
|
return tokenRefreshError{message: message, resp: resp}
|
||||||
|
}
|
||||||
|
|
||||||
// EnsureFresh will refresh the token if it will expire within the refresh window (as set by
|
// EnsureFresh will refresh the token if it will expire within the refresh window (as set by
|
||||||
// RefreshWithin) and autoRefresh flag is on.
|
// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
|
||||||
func (spt *ServicePrincipalToken) EnsureFresh() error {
|
func (spt *ServicePrincipalToken) EnsureFresh() error {
|
||||||
if spt.autoRefresh && spt.WillExpireIn(spt.refreshWithin) {
|
if spt.autoRefresh && spt.WillExpireIn(spt.refreshWithin) {
|
||||||
return spt.Refresh()
|
// take the lock then check to see if the token was already refreshed
|
||||||
|
spt.autoRefreshLock.Lock()
|
||||||
|
defer spt.autoRefreshLock.Unlock()
|
||||||
|
if spt.WillExpireIn(spt.refreshWithin) {
|
||||||
|
return spt.Refresh()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -333,15 +563,28 @@ func (spt *ServicePrincipalToken) InvokeRefreshCallbacks(token Token) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh obtains a fresh token for the Service Principal.
|
// Refresh obtains a fresh token for the Service Principal.
|
||||||
|
// This method is not safe for concurrent use and should be syncrhonized.
|
||||||
func (spt *ServicePrincipalToken) Refresh() error {
|
func (spt *ServicePrincipalToken) Refresh() error {
|
||||||
return spt.refreshInternal(spt.resource)
|
return spt.refreshInternal(spt.resource)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RefreshExchange refreshes the token, but for a different resource.
|
// RefreshExchange refreshes the token, but for a different resource.
|
||||||
|
// This method is not safe for concurrent use and should be syncrhonized.
|
||||||
func (spt *ServicePrincipalToken) RefreshExchange(resource string) error {
|
func (spt *ServicePrincipalToken) RefreshExchange(resource string) error {
|
||||||
return spt.refreshInternal(resource)
|
return spt.refreshInternal(resource)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (spt *ServicePrincipalToken) getGrantType() string {
|
||||||
|
switch spt.secret.(type) {
|
||||||
|
case *ServicePrincipalUsernamePasswordSecret:
|
||||||
|
return OAuthGrantTypeUserPass
|
||||||
|
case *ServicePrincipalAuthorizationCodeSecret:
|
||||||
|
return OAuthGrantTypeAuthorizationCode
|
||||||
|
default:
|
||||||
|
return OAuthGrantTypeClientCredentials
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
||||||
v := url.Values{}
|
v := url.Values{}
|
||||||
v.Set("client_id", spt.clientID)
|
v.Set("client_id", spt.clientID)
|
||||||
|
|
@ -351,7 +594,7 @@ func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
||||||
v.Set("grant_type", OAuthGrantTypeRefreshToken)
|
v.Set("grant_type", OAuthGrantTypeRefreshToken)
|
||||||
v.Set("refresh_token", spt.RefreshToken)
|
v.Set("refresh_token", spt.RefreshToken)
|
||||||
} else {
|
} else {
|
||||||
v.Set("grant_type", OAuthGrantTypeClientCredentials)
|
v.Set("grant_type", spt.getGrantType())
|
||||||
err := spt.secret.SetAuthenticationValues(spt, &v)
|
err := spt.secret.SetAuthenticationValues(spt, &v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -374,12 +617,17 @@ func (spt *ServicePrincipalToken) refreshInternal(resource string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("adal: Failed to execute the refresh request. Error = '%v'", err)
|
return fmt.Errorf("adal: Failed to execute the refresh request. Error = '%v'", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
rb, err := ioutil.ReadAll(resp.Body)
|
||||||
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
return fmt.Errorf("adal: Refresh request failed. Status Code = '%d'", resp.StatusCode)
|
if err != nil {
|
||||||
|
return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Failed reading response body", resp.StatusCode), resp)
|
||||||
|
}
|
||||||
|
return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Response body: %s", resp.StatusCode, string(rb)), resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
rb, err := ioutil.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("adal: Failed to read a new service principal token during refresh. Error = '%v'", err)
|
return fmt.Errorf("adal: Failed to read a new service principal token during refresh. Error = '%v'", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
95
vendor/github.com/Azure/go-autorest/autorest/authorization.go
generated
vendored
95
vendor/github.com/Azure/go-autorest/autorest/authorization.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
@ -10,9 +24,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
bearerChallengeHeader = "Www-Authenticate"
|
bearerChallengeHeader = "Www-Authenticate"
|
||||||
bearer = "Bearer"
|
bearer = "Bearer"
|
||||||
tenantID = "tenantID"
|
tenantID = "tenantID"
|
||||||
|
apiKeyAuthorizerHeader = "Ocp-Apim-Subscription-Key"
|
||||||
|
bingAPISdkHeader = "X-BingApis-SDK-Client"
|
||||||
|
golangBingAPISdkHeaderValue = "Go-SDK"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Authorizer is the interface that provides a PrepareDecorator used to supply request
|
// Authorizer is the interface that provides a PrepareDecorator used to supply request
|
||||||
|
|
@ -30,6 +47,53 @@ func (na NullAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
return WithNothing()
|
return WithNothing()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// APIKeyAuthorizer implements API Key authorization.
|
||||||
|
type APIKeyAuthorizer struct {
|
||||||
|
headers map[string]interface{}
|
||||||
|
queryParameters map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAPIKeyAuthorizerWithHeaders creates an ApiKeyAuthorizer with headers.
|
||||||
|
func NewAPIKeyAuthorizerWithHeaders(headers map[string]interface{}) *APIKeyAuthorizer {
|
||||||
|
return NewAPIKeyAuthorizer(headers, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAPIKeyAuthorizerWithQueryParameters creates an ApiKeyAuthorizer with query parameters.
|
||||||
|
func NewAPIKeyAuthorizerWithQueryParameters(queryParameters map[string]interface{}) *APIKeyAuthorizer {
|
||||||
|
return NewAPIKeyAuthorizer(nil, queryParameters)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAPIKeyAuthorizer creates an ApiKeyAuthorizer with headers.
|
||||||
|
func NewAPIKeyAuthorizer(headers map[string]interface{}, queryParameters map[string]interface{}) *APIKeyAuthorizer {
|
||||||
|
return &APIKeyAuthorizer{headers: headers, queryParameters: queryParameters}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthorization returns a PrepareDecorator that adds an HTTP headers and Query Paramaters
|
||||||
|
func (aka *APIKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
|
return func(p Preparer) Preparer {
|
||||||
|
return DecoratePreparer(p, WithHeaders(aka.headers), WithQueryParameters(aka.queryParameters))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CognitiveServicesAuthorizer implements authorization for Cognitive Services.
|
||||||
|
type CognitiveServicesAuthorizer struct {
|
||||||
|
subscriptionKey string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCognitiveServicesAuthorizer is
|
||||||
|
func NewCognitiveServicesAuthorizer(subscriptionKey string) *CognitiveServicesAuthorizer {
|
||||||
|
return &CognitiveServicesAuthorizer{subscriptionKey: subscriptionKey}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthorization is
|
||||||
|
func (csa *CognitiveServicesAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
|
headers := make(map[string]interface{})
|
||||||
|
headers[apiKeyAuthorizerHeader] = csa.subscriptionKey
|
||||||
|
headers[bingAPISdkHeader] = golangBingAPISdkHeaderValue
|
||||||
|
|
||||||
|
return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
|
||||||
|
}
|
||||||
|
|
||||||
// BearerAuthorizer implements the bearer authorization
|
// BearerAuthorizer implements the bearer authorization
|
||||||
type BearerAuthorizer struct {
|
type BearerAuthorizer struct {
|
||||||
tokenProvider adal.OAuthTokenProvider
|
tokenProvider adal.OAuthTokenProvider
|
||||||
|
|
@ -55,7 +119,11 @@ func (ba *BearerAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
if ok {
|
if ok {
|
||||||
err := refresher.EnsureFresh()
|
err := refresher.EnsureFresh()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return r, NewErrorWithError(err, "azure.BearerAuthorizer", "WithAuthorization", nil,
|
var resp *http.Response
|
||||||
|
if tokError, ok := err.(adal.TokenRefreshError); ok {
|
||||||
|
resp = tokError.Response()
|
||||||
|
}
|
||||||
|
return r, NewErrorWithError(err, "azure.BearerAuthorizer", "WithAuthorization", resp,
|
||||||
"Failed to refresh the Token for request to %s", r.URL)
|
"Failed to refresh the Token for request to %s", r.URL)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -165,3 +233,22 @@ func newBearerChallenge(resp *http.Response) (bc bearerChallenge, err error) {
|
||||||
|
|
||||||
return bc, err
|
return bc, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EventGridKeyAuthorizer implements authorization for event grid using key authentication.
|
||||||
|
type EventGridKeyAuthorizer struct {
|
||||||
|
topicKey string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewEventGridKeyAuthorizer creates a new EventGridKeyAuthorizer
|
||||||
|
// with the specified topic key.
|
||||||
|
func NewEventGridKeyAuthorizer(topicKey string) EventGridKeyAuthorizer {
|
||||||
|
return EventGridKeyAuthorizer{topicKey: topicKey}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithAuthorization returns a PrepareDecorator that adds the aeg-sas-key authentication header.
|
||||||
|
func (egta EventGridKeyAuthorizer) WithAuthorization() PrepareDecorator {
|
||||||
|
headers := map[string]interface{}{
|
||||||
|
"aeg-sas-key": egta.topicKey,
|
||||||
|
}
|
||||||
|
return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
|
||||||
|
}
|
||||||
|
|
|
||||||
17
vendor/github.com/Azure/go-autorest/autorest/autorest.go
generated
vendored
17
vendor/github.com/Azure/go-autorest/autorest/autorest.go
generated
vendored
|
|
@ -57,6 +57,20 @@ generated clients, see the Client described below.
|
||||||
*/
|
*/
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -73,6 +87,9 @@ const (
|
||||||
// ResponseHasStatusCode returns true if the status code in the HTTP Response is in the passed set
|
// ResponseHasStatusCode returns true if the status code in the HTTP Response is in the passed set
|
||||||
// and false otherwise.
|
// and false otherwise.
|
||||||
func ResponseHasStatusCode(resp *http.Response, codes ...int) bool {
|
func ResponseHasStatusCode(resp *http.Response, codes ...int) bool {
|
||||||
|
if resp == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
return containsInt(codes, resp.StatusCode)
|
return containsInt(codes, resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
288
vendor/github.com/Azure/go-autorest/autorest/azure/async.go
generated
vendored
288
vendor/github.com/Azure/go-autorest/autorest/azure/async.go
generated
vendored
|
|
@ -1,7 +1,23 @@
|
||||||
package azure
|
package azure
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
@ -23,6 +39,152 @@ const (
|
||||||
operationSucceeded string = "Succeeded"
|
operationSucceeded string = "Succeeded"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var pollingCodes = [...]int{http.StatusNoContent, http.StatusAccepted, http.StatusCreated, http.StatusOK}
|
||||||
|
|
||||||
|
// Future provides a mechanism to access the status and results of an asynchronous request.
|
||||||
|
// Since futures are stateful they should be passed by value to avoid race conditions.
|
||||||
|
type Future struct {
|
||||||
|
req *http.Request
|
||||||
|
resp *http.Response
|
||||||
|
ps pollingState
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFuture returns a new Future object initialized with the specified request.
|
||||||
|
func NewFuture(req *http.Request) Future {
|
||||||
|
return Future{req: req}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response returns the last HTTP response or nil if there isn't one.
|
||||||
|
func (f Future) Response() *http.Response {
|
||||||
|
return f.resp
|
||||||
|
}
|
||||||
|
|
||||||
|
// Status returns the last status message of the operation.
|
||||||
|
func (f Future) Status() string {
|
||||||
|
if f.ps.State == "" {
|
||||||
|
return "Unknown"
|
||||||
|
}
|
||||||
|
return f.ps.State
|
||||||
|
}
|
||||||
|
|
||||||
|
// PollingMethod returns the method used to monitor the status of the asynchronous operation.
|
||||||
|
func (f Future) PollingMethod() PollingMethodType {
|
||||||
|
return f.ps.PollingMethod
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done queries the service to see if the operation has completed.
|
||||||
|
func (f *Future) Done(sender autorest.Sender) (bool, error) {
|
||||||
|
// exit early if this future has terminated
|
||||||
|
if f.ps.hasTerminated() {
|
||||||
|
return true, f.errorInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := sender.Do(f.req)
|
||||||
|
f.resp = resp
|
||||||
|
if err != nil || !autorest.ResponseHasStatusCode(resp, pollingCodes[:]...) {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = updatePollingState(resp, &f.ps)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if f.ps.hasTerminated() {
|
||||||
|
return true, f.errorInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
f.req, err = newPollingRequest(f.ps)
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPollingDelay returns a duration the application should wait before checking
|
||||||
|
// the status of the asynchronous request and true; this value is returned from
|
||||||
|
// the service via the Retry-After response header. If the header wasn't returned
|
||||||
|
// then the function returns the zero-value time.Duration and false.
|
||||||
|
func (f Future) GetPollingDelay() (time.Duration, bool) {
|
||||||
|
if f.resp == nil {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
retry := f.resp.Header.Get(autorest.HeaderRetryAfter)
|
||||||
|
if retry == "" {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
d, err := time.ParseDuration(retry + "s")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return d, true
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaitForCompletion will return when one of the following conditions is met: the long
|
||||||
|
// running operation has completed, the provided context is cancelled, or the client's
|
||||||
|
// polling duration has been exceeded. It will retry failed polling attempts based on
|
||||||
|
// the retry value defined in the client up to the maximum retry attempts.
|
||||||
|
func (f Future) WaitForCompletion(ctx context.Context, client autorest.Client) error {
|
||||||
|
ctx, cancel := context.WithTimeout(ctx, client.PollingDuration)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
done, err := f.Done(client)
|
||||||
|
for attempts := 0; !done; done, err = f.Done(client) {
|
||||||
|
if attempts >= client.RetryAttempts {
|
||||||
|
return autorest.NewErrorWithError(err, "azure", "WaitForCompletion", f.resp, "the number of retries has been exceeded")
|
||||||
|
}
|
||||||
|
// we want delayAttempt to be zero in the non-error case so
|
||||||
|
// that DelayForBackoff doesn't perform exponential back-off
|
||||||
|
var delayAttempt int
|
||||||
|
var delay time.Duration
|
||||||
|
if err == nil {
|
||||||
|
// check for Retry-After delay, if not present use the client's polling delay
|
||||||
|
var ok bool
|
||||||
|
delay, ok = f.GetPollingDelay()
|
||||||
|
if !ok {
|
||||||
|
delay = client.PollingDelay
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// there was an error polling for status so perform exponential
|
||||||
|
// back-off based on the number of attempts using the client's retry
|
||||||
|
// duration. update attempts after delayAttempt to avoid off-by-one.
|
||||||
|
delayAttempt = attempts
|
||||||
|
delay = client.RetryDuration
|
||||||
|
attempts++
|
||||||
|
}
|
||||||
|
// wait until the delay elapses or the context is cancelled
|
||||||
|
delayElapsed := autorest.DelayForBackoff(delay, delayAttempt, ctx.Done())
|
||||||
|
if !delayElapsed {
|
||||||
|
return autorest.NewErrorWithError(ctx.Err(), "azure", "WaitForCompletion", f.resp, "context has been cancelled")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the operation failed the polling state will contain
|
||||||
|
// error information and implements the error interface
|
||||||
|
func (f *Future) errorInfo() error {
|
||||||
|
if !f.ps.hasSucceeded() {
|
||||||
|
return f.ps
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// MarshalJSON implements the json.Marshaler interface.
|
||||||
|
func (f Future) MarshalJSON() ([]byte, error) {
|
||||||
|
return json.Marshal(&f.ps)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON implements the json.Unmarshaler interface.
|
||||||
|
func (f *Future) UnmarshalJSON(data []byte) error {
|
||||||
|
err := json.Unmarshal(data, &f.ps)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
f.req, err = newPollingRequest(f.ps)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// DoPollForAsynchronous returns a SendDecorator that polls if the http.Response is for an Azure
|
// DoPollForAsynchronous returns a SendDecorator that polls if the http.Response is for an Azure
|
||||||
// long-running operation. It will delay between requests for the duration specified in the
|
// long-running operation. It will delay between requests for the duration specified in the
|
||||||
// RetryAfter header or, if the header is absent, the passed delay. Polling may be canceled by
|
// RetryAfter header or, if the header is absent, the passed delay. Polling may be canceled by
|
||||||
|
|
@ -34,8 +196,7 @@ func DoPollForAsynchronous(delay time.Duration) autorest.SendDecorator {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
pollingCodes := []int{http.StatusAccepted, http.StatusCreated, http.StatusOK}
|
if !autorest.ResponseHasStatusCode(resp, pollingCodes[:]...) {
|
||||||
if !autorest.ResponseHasStatusCode(resp, pollingCodes...) {
|
|
||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,10 +213,11 @@ func DoPollForAsynchronous(delay time.Duration) autorest.SendDecorator {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
r, err = newPollingRequest(resp, ps)
|
r, err = newPollingRequest(ps)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
r.Cancel = resp.Request.Cancel
|
||||||
|
|
||||||
delay = autorest.GetRetryAfter(resp, delay)
|
delay = autorest.GetRetryAfter(resp, delay)
|
||||||
resp, err = autorest.SendWithSender(s, r,
|
resp, err = autorest.SendWithSender(s, r,
|
||||||
|
|
@ -72,20 +234,15 @@ func getAsyncOperation(resp *http.Response) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasSucceeded(state string) bool {
|
func hasSucceeded(state string) bool {
|
||||||
return state == operationSucceeded
|
return strings.EqualFold(state, operationSucceeded)
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasTerminated(state string) bool {
|
func hasTerminated(state string) bool {
|
||||||
switch state {
|
return strings.EqualFold(state, operationCanceled) || strings.EqualFold(state, operationFailed) || strings.EqualFold(state, operationSucceeded)
|
||||||
case operationCanceled, operationFailed, operationSucceeded:
|
|
||||||
return true
|
|
||||||
default:
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func hasFailed(state string) bool {
|
func hasFailed(state string) bool {
|
||||||
return state == operationFailed
|
return strings.EqualFold(state, operationFailed)
|
||||||
}
|
}
|
||||||
|
|
||||||
type provisioningTracker interface {
|
type provisioningTracker interface {
|
||||||
|
|
@ -146,36 +303,42 @@ func (ps provisioningStatus) hasProvisioningError() bool {
|
||||||
return ps.ProvisioningError != ServiceError{}
|
return ps.ProvisioningError != ServiceError{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type pollingResponseFormat string
|
// PollingMethodType defines a type used for enumerating polling mechanisms.
|
||||||
|
type PollingMethodType string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
usesOperationResponse pollingResponseFormat = "OperationResponse"
|
// PollingAsyncOperation indicates the polling method uses the Azure-AsyncOperation header.
|
||||||
usesProvisioningStatus pollingResponseFormat = "ProvisioningStatus"
|
PollingAsyncOperation PollingMethodType = "AsyncOperation"
|
||||||
formatIsUnknown pollingResponseFormat = ""
|
|
||||||
|
// PollingLocation indicates the polling method uses the Location header.
|
||||||
|
PollingLocation PollingMethodType = "Location"
|
||||||
|
|
||||||
|
// PollingUnknown indicates an unknown polling method and is the default value.
|
||||||
|
PollingUnknown PollingMethodType = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
type pollingState struct {
|
type pollingState struct {
|
||||||
responseFormat pollingResponseFormat
|
PollingMethod PollingMethodType `json:"pollingMethod"`
|
||||||
uri string
|
URI string `json:"uri"`
|
||||||
state string
|
State string `json:"state"`
|
||||||
code string
|
Code string `json:"code"`
|
||||||
message string
|
Message string `json:"message"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ps pollingState) hasSucceeded() bool {
|
func (ps pollingState) hasSucceeded() bool {
|
||||||
return hasSucceeded(ps.state)
|
return hasSucceeded(ps.State)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ps pollingState) hasTerminated() bool {
|
func (ps pollingState) hasTerminated() bool {
|
||||||
return hasTerminated(ps.state)
|
return hasTerminated(ps.State)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ps pollingState) hasFailed() bool {
|
func (ps pollingState) hasFailed() bool {
|
||||||
return hasFailed(ps.state)
|
return hasFailed(ps.State)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ps pollingState) Error() string {
|
func (ps pollingState) Error() string {
|
||||||
return fmt.Sprintf("Long running operation terminated with status '%s': Code=%q Message=%q", ps.state, ps.code, ps.message)
|
return fmt.Sprintf("Long running operation terminated with status '%s': Code=%q Message=%q", ps.State, ps.Code, ps.Message)
|
||||||
}
|
}
|
||||||
|
|
||||||
// updatePollingState maps the operation status -- retrieved from either a provisioningState
|
// updatePollingState maps the operation status -- retrieved from either a provisioningState
|
||||||
|
|
@ -190,7 +353,7 @@ func updatePollingState(resp *http.Response, ps *pollingState) error {
|
||||||
// -- The first response will always be a provisioningStatus response; only the polling requests,
|
// -- The first response will always be a provisioningStatus response; only the polling requests,
|
||||||
// depending on the header returned, may be something otherwise.
|
// depending on the header returned, may be something otherwise.
|
||||||
var pt provisioningTracker
|
var pt provisioningTracker
|
||||||
if ps.responseFormat == usesOperationResponse {
|
if ps.PollingMethod == PollingAsyncOperation {
|
||||||
pt = &operationResource{}
|
pt = &operationResource{}
|
||||||
} else {
|
} else {
|
||||||
pt = &provisioningStatus{}
|
pt = &provisioningStatus{}
|
||||||
|
|
@ -198,30 +361,30 @@ func updatePollingState(resp *http.Response, ps *pollingState) error {
|
||||||
|
|
||||||
// If this is the first request (that is, the polling response shape is unknown), determine how
|
// If this is the first request (that is, the polling response shape is unknown), determine how
|
||||||
// to poll and what to expect
|
// to poll and what to expect
|
||||||
if ps.responseFormat == formatIsUnknown {
|
if ps.PollingMethod == PollingUnknown {
|
||||||
req := resp.Request
|
req := resp.Request
|
||||||
if req == nil {
|
if req == nil {
|
||||||
return autorest.NewError("azure", "updatePollingState", "Azure Polling Error - Original HTTP request is missing")
|
return autorest.NewError("azure", "updatePollingState", "Azure Polling Error - Original HTTP request is missing")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prefer the Azure-AsyncOperation header
|
// Prefer the Azure-AsyncOperation header
|
||||||
ps.uri = getAsyncOperation(resp)
|
ps.URI = getAsyncOperation(resp)
|
||||||
if ps.uri != "" {
|
if ps.URI != "" {
|
||||||
ps.responseFormat = usesOperationResponse
|
ps.PollingMethod = PollingAsyncOperation
|
||||||
} else {
|
} else {
|
||||||
ps.responseFormat = usesProvisioningStatus
|
ps.PollingMethod = PollingLocation
|
||||||
}
|
}
|
||||||
|
|
||||||
// Else, use the Location header
|
// Else, use the Location header
|
||||||
if ps.uri == "" {
|
if ps.URI == "" {
|
||||||
ps.uri = autorest.GetLocation(resp)
|
ps.URI = autorest.GetLocation(resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lastly, requests against an existing resource, use the last request URI
|
// Lastly, requests against an existing resource, use the last request URI
|
||||||
if ps.uri == "" {
|
if ps.URI == "" {
|
||||||
m := strings.ToUpper(req.Method)
|
m := strings.ToUpper(req.Method)
|
||||||
if m == http.MethodPatch || m == http.MethodPut || m == http.MethodGet {
|
if m == http.MethodPatch || m == http.MethodPut || m == http.MethodGet {
|
||||||
ps.uri = req.URL.String()
|
ps.URI = req.URL.String()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -242,23 +405,23 @@ func updatePollingState(resp *http.Response, ps *pollingState) error {
|
||||||
// -- Unknown states are per-service inprogress states
|
// -- Unknown states are per-service inprogress states
|
||||||
// -- Otherwise, infer state from HTTP status code
|
// -- Otherwise, infer state from HTTP status code
|
||||||
if pt.hasTerminated() {
|
if pt.hasTerminated() {
|
||||||
ps.state = pt.state()
|
ps.State = pt.state()
|
||||||
} else if pt.state() != "" {
|
} else if pt.state() != "" {
|
||||||
ps.state = operationInProgress
|
ps.State = operationInProgress
|
||||||
} else {
|
} else {
|
||||||
switch resp.StatusCode {
|
switch resp.StatusCode {
|
||||||
case http.StatusAccepted:
|
case http.StatusAccepted:
|
||||||
ps.state = operationInProgress
|
ps.State = operationInProgress
|
||||||
|
|
||||||
case http.StatusNoContent, http.StatusCreated, http.StatusOK:
|
case http.StatusNoContent, http.StatusCreated, http.StatusOK:
|
||||||
ps.state = operationSucceeded
|
ps.State = operationSucceeded
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ps.state = operationFailed
|
ps.State = operationFailed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ps.state == operationInProgress && ps.uri == "" {
|
if strings.EqualFold(ps.State, operationInProgress) && ps.URI == "" {
|
||||||
return autorest.NewError("azure", "updatePollingState", "Azure Polling Error - Unable to obtain polling URI for %s %s", resp.Request.Method, resp.Request.URL)
|
return autorest.NewError("azure", "updatePollingState", "Azure Polling Error - Unable to obtain polling URI for %s %s", resp.Request.Method, resp.Request.URL)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -267,36 +430,49 @@ func updatePollingState(resp *http.Response, ps *pollingState) error {
|
||||||
// -- Response
|
// -- Response
|
||||||
// -- Otherwise, Unknown
|
// -- Otherwise, Unknown
|
||||||
if ps.hasFailed() {
|
if ps.hasFailed() {
|
||||||
if ps.responseFormat == usesOperationResponse {
|
if ps.PollingMethod == PollingAsyncOperation {
|
||||||
or := pt.(*operationResource)
|
or := pt.(*operationResource)
|
||||||
ps.code = or.OperationError.Code
|
ps.Code = or.OperationError.Code
|
||||||
ps.message = or.OperationError.Message
|
ps.Message = or.OperationError.Message
|
||||||
} else {
|
} else {
|
||||||
p := pt.(*provisioningStatus)
|
p := pt.(*provisioningStatus)
|
||||||
if p.hasProvisioningError() {
|
if p.hasProvisioningError() {
|
||||||
ps.code = p.ProvisioningError.Code
|
ps.Code = p.ProvisioningError.Code
|
||||||
ps.message = p.ProvisioningError.Message
|
ps.Message = p.ProvisioningError.Message
|
||||||
} else {
|
} else {
|
||||||
ps.code = "Unknown"
|
ps.Code = "Unknown"
|
||||||
ps.message = "None"
|
ps.Message = "None"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newPollingRequest(resp *http.Response, ps pollingState) (*http.Request, error) {
|
func newPollingRequest(ps pollingState) (*http.Request, error) {
|
||||||
req := resp.Request
|
reqPoll, err := autorest.Prepare(&http.Request{},
|
||||||
if req == nil {
|
|
||||||
return nil, autorest.NewError("azure", "newPollingRequest", "Azure Polling Error - Original HTTP request is missing")
|
|
||||||
}
|
|
||||||
|
|
||||||
reqPoll, err := autorest.Prepare(&http.Request{Cancel: req.Cancel},
|
|
||||||
autorest.AsGet(),
|
autorest.AsGet(),
|
||||||
autorest.WithBaseURL(ps.uri))
|
autorest.WithBaseURL(ps.URI))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, autorest.NewErrorWithError(err, "azure", "newPollingRequest", nil, "Failure creating poll request to %s", ps.uri)
|
return nil, autorest.NewErrorWithError(err, "azure", "newPollingRequest", nil, "Failure creating poll request to %s", ps.URI)
|
||||||
}
|
}
|
||||||
|
|
||||||
return reqPoll, nil
|
return reqPoll, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AsyncOpIncompleteError is the type that's returned from a future that has not completed.
|
||||||
|
type AsyncOpIncompleteError struct {
|
||||||
|
// FutureType is the name of the type composed of a azure.Future.
|
||||||
|
FutureType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error returns an error message including the originating type name of the error.
|
||||||
|
func (e AsyncOpIncompleteError) Error() string {
|
||||||
|
return fmt.Sprintf("%s: asynchronous operation has not completed", e.FutureType)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewAsyncOpIncompleteError creates a new AsyncOpIncompleteError with the specified parameters.
|
||||||
|
func NewAsyncOpIncompleteError(futureType string) AsyncOpIncompleteError {
|
||||||
|
return AsyncOpIncompleteError{
|
||||||
|
FutureType: futureType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
22
vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
generated
vendored
22
vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
generated
vendored
|
|
@ -5,6 +5,20 @@ See the included examples for more detail.
|
||||||
*/
|
*/
|
||||||
package azure
|
package azure
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -165,7 +179,13 @@ func WithErrorUnlessStatusCode(codes ...int) autorest.RespondDecorator {
|
||||||
if decodeErr != nil {
|
if decodeErr != nil {
|
||||||
return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), decodeErr)
|
return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b.String(), decodeErr)
|
||||||
} else if e.ServiceError == nil {
|
} else if e.ServiceError == nil {
|
||||||
e.ServiceError = &ServiceError{Code: "Unknown", Message: "Unknown service error"}
|
// Check if error is unwrapped ServiceError
|
||||||
|
if err := json.Unmarshal(b.Bytes(), &e.ServiceError); err != nil || e.ServiceError.Message == "" {
|
||||||
|
e.ServiceError = &ServiceError{
|
||||||
|
Code: "Unknown",
|
||||||
|
Message: "Unknown service error",
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
e.RequestID = ExtractRequestID(resp)
|
e.RequestID = ExtractRequestID(resp)
|
||||||
|
|
|
||||||
52
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
52
vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
generated
vendored
|
|
@ -1,10 +1,31 @@
|
||||||
package azure
|
package azure
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// EnvironmentFilepathName captures the name of the environment variable containing the path to the file
|
||||||
|
// to be used while populating the Azure Environment.
|
||||||
|
const EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH"
|
||||||
|
|
||||||
var environments = map[string]Environment{
|
var environments = map[string]Environment{
|
||||||
"AZURECHINACLOUD": ChinaCloud,
|
"AZURECHINACLOUD": ChinaCloud,
|
||||||
"AZUREGERMANCLOUD": GermanCloud,
|
"AZUREGERMANCLOUD": GermanCloud,
|
||||||
|
|
@ -62,10 +83,10 @@ var (
|
||||||
PublishSettingsURL: "https://manage.windowsazure.us/publishsettings/index",
|
PublishSettingsURL: "https://manage.windowsazure.us/publishsettings/index",
|
||||||
ServiceManagementEndpoint: "https://management.core.usgovcloudapi.net/",
|
ServiceManagementEndpoint: "https://management.core.usgovcloudapi.net/",
|
||||||
ResourceManagerEndpoint: "https://management.usgovcloudapi.net/",
|
ResourceManagerEndpoint: "https://management.usgovcloudapi.net/",
|
||||||
ActiveDirectoryEndpoint: "https://login.microsoftonline.com/",
|
ActiveDirectoryEndpoint: "https://login.microsoftonline.us/",
|
||||||
GalleryEndpoint: "https://gallery.usgovcloudapi.net/",
|
GalleryEndpoint: "https://gallery.usgovcloudapi.net/",
|
||||||
KeyVaultEndpoint: "https://vault.usgovcloudapi.net/",
|
KeyVaultEndpoint: "https://vault.usgovcloudapi.net/",
|
||||||
GraphEndpoint: "https://graph.usgovcloudapi.net/",
|
GraphEndpoint: "https://graph.windows.net/",
|
||||||
StorageEndpointSuffix: "core.usgovcloudapi.net",
|
StorageEndpointSuffix: "core.usgovcloudapi.net",
|
||||||
SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
|
SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
|
||||||
TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
|
TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
|
||||||
|
|
@ -119,12 +140,37 @@ var (
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// EnvironmentFromName returns an Environment based on the common name specified
|
// EnvironmentFromName returns an Environment based on the common name specified.
|
||||||
func EnvironmentFromName(name string) (Environment, error) {
|
func EnvironmentFromName(name string) (Environment, error) {
|
||||||
|
// IMPORTANT
|
||||||
|
// As per @radhikagupta5:
|
||||||
|
// This is technical debt, fundamentally here because Kubernetes is not currently accepting
|
||||||
|
// contributions to the providers. Once that is an option, the provider should be updated to
|
||||||
|
// directly call `EnvironmentFromFile`. Until then, we rely on dispatching Azure Stack environment creation
|
||||||
|
// from this method based on the name that is provided to us.
|
||||||
|
if strings.EqualFold(name, "AZURESTACKCLOUD") {
|
||||||
|
return EnvironmentFromFile(os.Getenv(EnvironmentFilepathName))
|
||||||
|
}
|
||||||
|
|
||||||
name = strings.ToUpper(name)
|
name = strings.ToUpper(name)
|
||||||
env, ok := environments[name]
|
env, ok := environments[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
return env, fmt.Errorf("autorest/azure: There is no cloud environment matching the name %q", name)
|
return env, fmt.Errorf("autorest/azure: There is no cloud environment matching the name %q", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
return env, nil
|
return env, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EnvironmentFromFile loads an Environment from a configuration file available on disk.
|
||||||
|
// This function is particularly useful in the Hybrid Cloud model, where one must define their own
|
||||||
|
// endpoints.
|
||||||
|
func EnvironmentFromFile(location string) (unmarshaled Environment, err error) {
|
||||||
|
fileContents, err := ioutil.ReadFile(location)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = json.Unmarshal(fileContents, &unmarshaled)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
|
||||||
203
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
Normal file
203
vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
generated
vendored
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package azure
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/Azure/go-autorest/autorest"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DoRetryWithRegistration tries to register the resource provider in case it is unregistered.
|
||||||
|
// It also handles request retries
|
||||||
|
func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator {
|
||||||
|
return func(s autorest.Sender) autorest.Sender {
|
||||||
|
return autorest.SenderFunc(func(r *http.Request) (resp *http.Response, err error) {
|
||||||
|
rr := autorest.NewRetriableRequest(r)
|
||||||
|
for currentAttempt := 0; currentAttempt < client.RetryAttempts; currentAttempt++ {
|
||||||
|
err = rr.Prepare()
|
||||||
|
if err != nil {
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err = autorest.SendWithSender(s, rr.Request(),
|
||||||
|
autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusConflict || client.SkipResourceProviderRegistration {
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
var re RequestError
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
autorest.ByUnmarshallingJSON(&re),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
err = re
|
||||||
|
|
||||||
|
if re.ServiceError != nil && re.ServiceError.Code == "MissingSubscriptionRegistration" {
|
||||||
|
regErr := register(client, r, re)
|
||||||
|
if regErr != nil {
|
||||||
|
return resp, fmt.Errorf("failed auto registering Resource Provider: %s. Original error: %s", regErr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resp, fmt.Errorf("failed request: %s", err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getProvider(re RequestError) (string, error) {
|
||||||
|
if re.ServiceError != nil {
|
||||||
|
if re.ServiceError.Details != nil && len(*re.ServiceError.Details) > 0 {
|
||||||
|
detail := (*re.ServiceError.Details)[0].(map[string]interface{})
|
||||||
|
return detail["target"].(string), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", errors.New("provider was not found in the response")
|
||||||
|
}
|
||||||
|
|
||||||
|
func register(client autorest.Client, originalReq *http.Request, re RequestError) error {
|
||||||
|
subID := getSubscription(originalReq.URL.Path)
|
||||||
|
if subID == "" {
|
||||||
|
return errors.New("missing parameter subscriptionID to register resource provider")
|
||||||
|
}
|
||||||
|
providerName, err := getProvider(re)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("missing parameter provider to register resource provider: %s", err)
|
||||||
|
}
|
||||||
|
newURL := url.URL{
|
||||||
|
Scheme: originalReq.URL.Scheme,
|
||||||
|
Host: originalReq.URL.Host,
|
||||||
|
}
|
||||||
|
|
||||||
|
// taken from the resources SDK
|
||||||
|
// with almost identical code, this sections are easier to mantain
|
||||||
|
// It is also not a good idea to import the SDK here
|
||||||
|
// https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L252
|
||||||
|
pathParameters := map[string]interface{}{
|
||||||
|
"resourceProviderNamespace": autorest.Encode("path", providerName),
|
||||||
|
"subscriptionId": autorest.Encode("path", subID),
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2016-09-01"
|
||||||
|
queryParameters := map[string]interface{}{
|
||||||
|
"api-version": APIVersion,
|
||||||
|
}
|
||||||
|
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsPost(),
|
||||||
|
autorest.WithBaseURL(newURL.String()),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}/register", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters),
|
||||||
|
)
|
||||||
|
|
||||||
|
req, err := preparer.Prepare(&http.Request{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.Cancel = originalReq.Cancel
|
||||||
|
|
||||||
|
resp, err := autorest.SendWithSender(client, req,
|
||||||
|
autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
type Provider struct {
|
||||||
|
RegistrationState *string `json:"registrationState,omitempty"`
|
||||||
|
}
|
||||||
|
var provider Provider
|
||||||
|
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&provider),
|
||||||
|
autorest.ByClosing(),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// poll for registered provisioning state
|
||||||
|
now := time.Now()
|
||||||
|
for err == nil && time.Since(now) < client.PollingDuration {
|
||||||
|
// taken from the resources SDK
|
||||||
|
// https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L45
|
||||||
|
preparer := autorest.CreatePreparer(
|
||||||
|
autorest.AsGet(),
|
||||||
|
autorest.WithBaseURL(newURL.String()),
|
||||||
|
autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}", pathParameters),
|
||||||
|
autorest.WithQueryParameters(queryParameters),
|
||||||
|
)
|
||||||
|
req, err = preparer.Prepare(&http.Request{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.Cancel = originalReq.Cancel
|
||||||
|
|
||||||
|
resp, err := autorest.SendWithSender(client, req,
|
||||||
|
autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = autorest.Respond(
|
||||||
|
resp,
|
||||||
|
WithErrorUnlessStatusCode(http.StatusOK),
|
||||||
|
autorest.ByUnmarshallingJSON(&provider),
|
||||||
|
autorest.ByClosing(),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.RegistrationState != nil &&
|
||||||
|
*provider.RegistrationState == "Registered" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
delayed := autorest.DelayWithRetryAfter(resp, originalReq.Cancel)
|
||||||
|
if !delayed {
|
||||||
|
autorest.DelayForBackoff(client.PollingDelay, 0, originalReq.Cancel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !(time.Since(now) < client.PollingDuration) {
|
||||||
|
return errors.New("polling for resource provider registration has exceeded the polling duration")
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func getSubscription(path string) string {
|
||||||
|
parts := strings.Split(path, "/")
|
||||||
|
for i, v := range parts {
|
||||||
|
if v == "subscriptions" && (i+1) < len(parts) {
|
||||||
|
return parts[i+1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
41
vendor/github.com/Azure/go-autorest/autorest/client.go
generated
vendored
41
vendor/github.com/Azure/go-autorest/autorest/client.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -21,6 +35,9 @@ const (
|
||||||
|
|
||||||
// DefaultRetryAttempts is number of attempts for retry status codes (5xx).
|
// DefaultRetryAttempts is number of attempts for retry status codes (5xx).
|
||||||
DefaultRetryAttempts = 3
|
DefaultRetryAttempts = 3
|
||||||
|
|
||||||
|
// DefaultRetryDuration is the duration to wait between retries.
|
||||||
|
DefaultRetryDuration = 30 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
@ -33,7 +50,8 @@ var (
|
||||||
Version(),
|
Version(),
|
||||||
)
|
)
|
||||||
|
|
||||||
statusCodesForRetry = []int{
|
// StatusCodesForRetry are a defined group of status code for which the client will retry
|
||||||
|
StatusCodesForRetry = []int{
|
||||||
http.StatusRequestTimeout, // 408
|
http.StatusRequestTimeout, // 408
|
||||||
http.StatusTooManyRequests, // 429
|
http.StatusTooManyRequests, // 429
|
||||||
http.StatusInternalServerError, // 500
|
http.StatusInternalServerError, // 500
|
||||||
|
|
@ -148,6 +166,9 @@ type Client struct {
|
||||||
UserAgent string
|
UserAgent string
|
||||||
|
|
||||||
Jar http.CookieJar
|
Jar http.CookieJar
|
||||||
|
|
||||||
|
// Set to true to skip attempted registration of resource providers (false by default).
|
||||||
|
SkipResourceProviderRegistration bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewClientWithUserAgent returns an instance of a Client with the UserAgent set to the passed
|
// NewClientWithUserAgent returns an instance of a Client with the UserAgent set to the passed
|
||||||
|
|
@ -157,9 +178,10 @@ func NewClientWithUserAgent(ua string) Client {
|
||||||
PollingDelay: DefaultPollingDelay,
|
PollingDelay: DefaultPollingDelay,
|
||||||
PollingDuration: DefaultPollingDuration,
|
PollingDuration: DefaultPollingDuration,
|
||||||
RetryAttempts: DefaultRetryAttempts,
|
RetryAttempts: DefaultRetryAttempts,
|
||||||
RetryDuration: 30 * time.Second,
|
RetryDuration: DefaultRetryDuration,
|
||||||
UserAgent: defaultUserAgent,
|
UserAgent: defaultUserAgent,
|
||||||
}
|
}
|
||||||
|
c.Sender = c.sender()
|
||||||
c.AddToUserAgent(ua)
|
c.AddToUserAgent(ua)
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
@ -185,12 +207,17 @@ func (c Client) Do(r *http.Request) (*http.Response, error) {
|
||||||
c.WithInspection(),
|
c.WithInspection(),
|
||||||
c.WithAuthorization())
|
c.WithAuthorization())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, NewErrorWithError(err, "autorest/Client", "Do", nil, "Preparing request failed")
|
var resp *http.Response
|
||||||
|
if detErr, ok := err.(DetailedError); ok {
|
||||||
|
// if the authorization failed (e.g. invalid credentials) there will
|
||||||
|
// be a response associated with the error, be sure to return it.
|
||||||
|
resp = detErr.Response
|
||||||
|
}
|
||||||
|
return resp, NewErrorWithError(err, "autorest/Client", "Do", nil, "Preparing request failed")
|
||||||
}
|
}
|
||||||
resp, err := SendWithSender(c.sender(), r,
|
|
||||||
DoRetryForStatusCodes(c.RetryAttempts, c.RetryDuration, statusCodesForRetry...))
|
resp, err := SendWithSender(c.sender(), r)
|
||||||
Respond(resp,
|
Respond(resp, c.ByInspecting())
|
||||||
c.ByInspecting())
|
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/date/date.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/date/date.go
generated
vendored
|
|
@ -5,6 +5,20 @@ time.Time types. And both convert to time.Time through a ToTime method.
|
||||||
*/
|
*/
|
||||||
package date
|
package date
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/date/time.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/date/time.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package date
|
package date
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"time"
|
"time"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package date
|
package date
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package date
|
package date
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/date/utility.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/date/utility.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package date
|
package date
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/error.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/error.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
|
||||||
60
vendor/github.com/Azure/go-autorest/autorest/preparer.go
generated
vendored
60
vendor/github.com/Azure/go-autorest/autorest/preparer.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
@ -13,8 +27,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
mimeTypeJSON = "application/json"
|
mimeTypeJSON = "application/json"
|
||||||
mimeTypeFormPost = "application/x-www-form-urlencoded"
|
mimeTypeOctetStream = "application/octet-stream"
|
||||||
|
mimeTypeFormPost = "application/x-www-form-urlencoded"
|
||||||
|
|
||||||
headerAuthorization = "Authorization"
|
headerAuthorization = "Authorization"
|
||||||
headerContentType = "Content-Type"
|
headerContentType = "Content-Type"
|
||||||
|
|
@ -98,6 +113,28 @@ func WithHeader(header string, value string) PrepareDecorator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithHeaders returns a PrepareDecorator that sets the specified HTTP headers of the http.Request to
|
||||||
|
// the passed value. It canonicalizes the passed headers name (via http.CanonicalHeaderKey) before
|
||||||
|
// adding them.
|
||||||
|
func WithHeaders(headers map[string]interface{}) PrepareDecorator {
|
||||||
|
h := ensureValueStrings(headers)
|
||||||
|
return func(p Preparer) Preparer {
|
||||||
|
return PreparerFunc(func(r *http.Request) (*http.Request, error) {
|
||||||
|
r, err := p.Prepare(r)
|
||||||
|
if err == nil {
|
||||||
|
if r.Header == nil {
|
||||||
|
r.Header = make(http.Header)
|
||||||
|
}
|
||||||
|
|
||||||
|
for name, value := range h {
|
||||||
|
r.Header.Set(http.CanonicalHeaderKey(name), value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r, err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WithBearerAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
|
// WithBearerAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
|
||||||
// value is "Bearer " followed by the supplied token.
|
// value is "Bearer " followed by the supplied token.
|
||||||
func WithBearerAuthorization(token string) PrepareDecorator {
|
func WithBearerAuthorization(token string) PrepareDecorator {
|
||||||
|
|
@ -128,6 +165,11 @@ func AsJSON() PrepareDecorator {
|
||||||
return AsContentType(mimeTypeJSON)
|
return AsContentType(mimeTypeJSON)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AsOctetStream returns a PrepareDecorator that adds the "application/octet-stream" Content-Type header.
|
||||||
|
func AsOctetStream() PrepareDecorator {
|
||||||
|
return AsContentType(mimeTypeOctetStream)
|
||||||
|
}
|
||||||
|
|
||||||
// WithMethod returns a PrepareDecorator that sets the HTTP method of the passed request. The
|
// WithMethod returns a PrepareDecorator that sets the HTTP method of the passed request. The
|
||||||
// decorator does not validate that the passed method string is a known HTTP method.
|
// decorator does not validate that the passed method string is a known HTTP method.
|
||||||
func WithMethod(method string) PrepareDecorator {
|
func WithMethod(method string) PrepareDecorator {
|
||||||
|
|
@ -201,6 +243,11 @@ func WithFormData(v url.Values) PrepareDecorator {
|
||||||
r, err := p.Prepare(r)
|
r, err := p.Prepare(r)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
s := v.Encode()
|
s := v.Encode()
|
||||||
|
|
||||||
|
if r.Header == nil {
|
||||||
|
r.Header = make(http.Header)
|
||||||
|
}
|
||||||
|
r.Header.Set(http.CanonicalHeaderKey(headerContentType), mimeTypeFormPost)
|
||||||
r.ContentLength = int64(len(s))
|
r.ContentLength = int64(len(s))
|
||||||
r.Body = ioutil.NopCloser(strings.NewReader(s))
|
r.Body = ioutil.NopCloser(strings.NewReader(s))
|
||||||
}
|
}
|
||||||
|
|
@ -416,11 +463,16 @@ func WithQueryParameters(queryParameters map[string]interface{}) PrepareDecorato
|
||||||
if r.URL == nil {
|
if r.URL == nil {
|
||||||
return r, NewError("autorest", "WithQueryParameters", "Invoked with a nil URL")
|
return r, NewError("autorest", "WithQueryParameters", "Invoked with a nil URL")
|
||||||
}
|
}
|
||||||
|
|
||||||
v := r.URL.Query()
|
v := r.URL.Query()
|
||||||
for key, value := range parameters {
|
for key, value := range parameters {
|
||||||
v.Add(key, value)
|
d, err := url.QueryUnescape(value)
|
||||||
|
if err != nil {
|
||||||
|
return r, err
|
||||||
|
}
|
||||||
|
v.Add(key, d)
|
||||||
}
|
}
|
||||||
r.URL.RawQuery = createQuery(v)
|
r.URL.RawQuery = v.Encode()
|
||||||
}
|
}
|
||||||
return r, err
|
return r, err
|
||||||
})
|
})
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/responder.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/responder.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
|
|
||||||
14
vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go
generated
vendored
14
vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
|
|
|
||||||
36
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go
generated
vendored
36
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go
generated
vendored
|
|
@ -1,17 +1,31 @@
|
||||||
// +build !go1.8
|
// +build !go1.8
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RetriableRequest provides facilities for retrying an HTTP request.
|
// RetriableRequest provides facilities for retrying an HTTP request.
|
||||||
type RetriableRequest struct {
|
type RetriableRequest struct {
|
||||||
req *http.Request
|
req *http.Request
|
||||||
br *bytes.Reader
|
br *bytes.Reader
|
||||||
reset bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare signals that the request is about to be sent.
|
// Prepare signals that the request is about to be sent.
|
||||||
|
|
@ -19,21 +33,17 @@ func (rr *RetriableRequest) Prepare() (err error) {
|
||||||
// preserve the request body; this is to support retry logic as
|
// preserve the request body; this is to support retry logic as
|
||||||
// the underlying transport will always close the reqeust body
|
// the underlying transport will always close the reqeust body
|
||||||
if rr.req.Body != nil {
|
if rr.req.Body != nil {
|
||||||
if rr.reset {
|
if rr.br != nil {
|
||||||
if rr.br != nil {
|
_, err = rr.br.Seek(0, 0 /*io.SeekStart*/)
|
||||||
_, err = rr.br.Seek(0, 0 /*io.SeekStart*/)
|
rr.req.Body = ioutil.NopCloser(rr.br)
|
||||||
}
|
}
|
||||||
rr.reset = false
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if rr.br == nil {
|
if rr.br == nil {
|
||||||
// fall back to making a copy (only do this once)
|
// fall back to making a copy (only do this once)
|
||||||
err = rr.prepareFromByteReader()
|
err = rr.prepareFromByteReader()
|
||||||
}
|
}
|
||||||
// indicates that the request body needs to be reset
|
|
||||||
rr.reset = true
|
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
42
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go
generated
vendored
42
vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go
generated
vendored
|
|
@ -1,19 +1,33 @@
|
||||||
// +build go1.8
|
// +build go1.8
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RetriableRequest provides facilities for retrying an HTTP request.
|
// RetriableRequest provides facilities for retrying an HTTP request.
|
||||||
type RetriableRequest struct {
|
type RetriableRequest struct {
|
||||||
req *http.Request
|
req *http.Request
|
||||||
rc io.ReadCloser
|
rc io.ReadCloser
|
||||||
br *bytes.Reader
|
br *bytes.Reader
|
||||||
reset bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prepare signals that the request is about to be sent.
|
// Prepare signals that the request is about to be sent.
|
||||||
|
|
@ -21,16 +35,14 @@ func (rr *RetriableRequest) Prepare() (err error) {
|
||||||
// preserve the request body; this is to support retry logic as
|
// preserve the request body; this is to support retry logic as
|
||||||
// the underlying transport will always close the reqeust body
|
// the underlying transport will always close the reqeust body
|
||||||
if rr.req.Body != nil {
|
if rr.req.Body != nil {
|
||||||
if rr.reset {
|
if rr.rc != nil {
|
||||||
if rr.rc != nil {
|
rr.req.Body = rr.rc
|
||||||
rr.req.Body = rr.rc
|
} else if rr.br != nil {
|
||||||
} else if rr.br != nil {
|
_, err = rr.br.Seek(0, io.SeekStart)
|
||||||
_, err = rr.br.Seek(0, io.SeekStart)
|
rr.req.Body = ioutil.NopCloser(rr.br)
|
||||||
}
|
}
|
||||||
rr.reset = false
|
if err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if rr.req.GetBody != nil {
|
if rr.req.GetBody != nil {
|
||||||
// this will allow us to preserve the body without having to
|
// this will allow us to preserve the body without having to
|
||||||
|
|
@ -43,8 +55,6 @@ func (rr *RetriableRequest) Prepare() (err error) {
|
||||||
// fall back to making a copy (only do this once)
|
// fall back to making a copy (only do this once)
|
||||||
err = rr.prepareFromByteReader()
|
err = rr.prepareFromByteReader()
|
||||||
}
|
}
|
||||||
// indicates that the request body needs to be reset
|
|
||||||
rr.reset = true
|
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
28
vendor/github.com/Azure/go-autorest/autorest/sender.go
generated
vendored
28
vendor/github.com/Azure/go-autorest/autorest/sender.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
@ -201,19 +215,26 @@ func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) Se
|
||||||
rr := NewRetriableRequest(r)
|
rr := NewRetriableRequest(r)
|
||||||
// Increment to add the first call (attempts denotes number of retries)
|
// Increment to add the first call (attempts denotes number of retries)
|
||||||
attempts++
|
attempts++
|
||||||
for attempt := 0; attempt < attempts; attempt++ {
|
for attempt := 0; attempt < attempts; {
|
||||||
err = rr.Prepare()
|
err = rr.Prepare()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
resp, err = s.Do(rr.Request())
|
resp, err = s.Do(rr.Request())
|
||||||
if err != nil || !ResponseHasStatusCode(resp, codes...) {
|
// we want to retry if err is not nil (e.g. transient network failure). note that for failed authentication
|
||||||
|
// resp and err will both have a value, so in this case we don't want to retry as it will never succeed.
|
||||||
|
if err == nil && !ResponseHasStatusCode(resp, codes...) || IsTokenRefreshError(err) {
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
delayed := DelayWithRetryAfter(resp, r.Cancel)
|
delayed := DelayWithRetryAfter(resp, r.Cancel)
|
||||||
if !delayed {
|
if !delayed {
|
||||||
DelayForBackoff(backoff, attempt, r.Cancel)
|
DelayForBackoff(backoff, attempt, r.Cancel)
|
||||||
}
|
}
|
||||||
|
// don't count a 429 against the number of attempts
|
||||||
|
// so that we continue to retry until it succeeds
|
||||||
|
if resp == nil || resp.StatusCode != http.StatusTooManyRequests {
|
||||||
|
attempt++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return resp, err
|
return resp, err
|
||||||
})
|
})
|
||||||
|
|
@ -223,6 +244,9 @@ func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) Se
|
||||||
// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header in
|
// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header in
|
||||||
// responses with status code 429
|
// responses with status code 429
|
||||||
func DelayWithRetryAfter(resp *http.Response, cancel <-chan struct{}) bool {
|
func DelayWithRetryAfter(resp *http.Response, cancel <-chan struct{}) bool {
|
||||||
|
if resp == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
retryAfter, _ := strconv.Atoi(resp.Header.Get("Retry-After"))
|
retryAfter, _ := strconv.Atoi(resp.Header.Get("Retry-After"))
|
||||||
if resp.StatusCode == http.StatusTooManyRequests && retryAfter > 0 {
|
if resp.StatusCode == http.StatusTooManyRequests && retryAfter > 0 {
|
||||||
select {
|
select {
|
||||||
|
|
|
||||||
98
vendor/github.com/Azure/go-autorest/autorest/utility.go
generated
vendored
98
vendor/github.com/Azure/go-autorest/autorest/utility.go
generated
vendored
|
|
@ -1,15 +1,31 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/Azure/go-autorest/autorest/adal"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EncodedAs is a series of constants specifying various data encodings
|
// EncodedAs is a series of constants specifying various data encodings
|
||||||
|
|
@ -123,13 +139,38 @@ func MapToValues(m map[string]interface{}) url.Values {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
// String method converts interface v to string. If interface is a list, it
|
// AsStringSlice method converts interface{} to []string. This expects a
|
||||||
// joins list elements using separator.
|
//that the parameter passed to be a slice or array of a type that has the underlying
|
||||||
func String(v interface{}, sep ...string) string {
|
//type a string.
|
||||||
if len(sep) > 0 {
|
func AsStringSlice(s interface{}) ([]string, error) {
|
||||||
return ensureValueString(strings.Join(v.([]string), sep[0]))
|
v := reflect.ValueOf(s)
|
||||||
|
if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
|
||||||
|
return nil, NewError("autorest", "AsStringSlice", "the value's type is not an array.")
|
||||||
}
|
}
|
||||||
return ensureValueString(v)
|
stringSlice := make([]string, 0, v.Len())
|
||||||
|
|
||||||
|
for i := 0; i < v.Len(); i++ {
|
||||||
|
stringSlice = append(stringSlice, v.Index(i).String())
|
||||||
|
}
|
||||||
|
return stringSlice, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// String method converts interface v to string. If interface is a list, it
|
||||||
|
// joins list elements using the seperator. Note that only sep[0] will be used for
|
||||||
|
// joining if any separator is specified.
|
||||||
|
func String(v interface{}, sep ...string) string {
|
||||||
|
if len(sep) == 0 {
|
||||||
|
return ensureValueString(v)
|
||||||
|
}
|
||||||
|
stringSlice, ok := v.([]string)
|
||||||
|
if ok == false {
|
||||||
|
var err error
|
||||||
|
stringSlice, err = AsStringSlice(v)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("autorest: Couldn't convert value to a string %s.", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ensureValueString(strings.Join(stringSlice, sep[0]))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode method encodes url path and query parameters.
|
// Encode method encodes url path and query parameters.
|
||||||
|
|
@ -153,26 +194,25 @@ func queryEscape(s string) string {
|
||||||
return url.QueryEscape(s)
|
return url.QueryEscape(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method is same as Encode() method of "net/url" go package,
|
// ChangeToGet turns the specified http.Request into a GET (it assumes it wasn't).
|
||||||
// except it does not encode the query parameters because they
|
// This is mainly useful for long-running operations that use the Azure-AsyncOperation
|
||||||
// already come encoded. It formats values map in query format (bar=foo&a=b).
|
// header, so we change the initial PUT into a GET to retrieve the final result.
|
||||||
func createQuery(v url.Values) string {
|
func ChangeToGet(req *http.Request) *http.Request {
|
||||||
var buf bytes.Buffer
|
req.Method = "GET"
|
||||||
keys := make([]string, 0, len(v))
|
req.Body = nil
|
||||||
for k := range v {
|
req.ContentLength = 0
|
||||||
keys = append(keys, k)
|
req.Header.Del("Content-Length")
|
||||||
}
|
return req
|
||||||
sort.Strings(keys)
|
}
|
||||||
for _, k := range keys {
|
|
||||||
vs := v[k]
|
// IsTokenRefreshError returns true if the specified error implements the TokenRefreshError
|
||||||
prefix := url.QueryEscape(k) + "="
|
// interface. If err is a DetailedError it will walk the chain of Original errors.
|
||||||
for _, v := range vs {
|
func IsTokenRefreshError(err error) bool {
|
||||||
if buf.Len() > 0 {
|
if _, ok := err.(adal.TokenRefreshError); ok {
|
||||||
buf.WriteByte('&')
|
return true
|
||||||
}
|
}
|
||||||
buf.WriteString(prefix)
|
if de, ok := err.(DetailedError); ok {
|
||||||
buf.WriteString(v)
|
return IsTokenRefreshError(de.Original)
|
||||||
}
|
}
|
||||||
}
|
return false
|
||||||
return buf.String()
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
20
vendor/github.com/Azure/go-autorest/autorest/version.go
generated
vendored
20
vendor/github.com/Azure/go-autorest/autorest/version.go
generated
vendored
|
|
@ -1,5 +1,19 @@
|
||||||
package autorest
|
package autorest
|
||||||
|
|
||||||
|
// Copyright 2017 Microsoft Corporation
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -8,9 +22,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
major = 8
|
major = 9
|
||||||
minor = 0
|
minor = 8
|
||||||
patch = 0
|
patch = 1
|
||||||
tag = ""
|
tag = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
58
vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go
generated
vendored
58
vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go
generated
vendored
|
|
@ -2,6 +2,7 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -38,14 +39,18 @@ func (d DefaultRetryer) RetryRules(r *request.Request) time.Duration {
|
||||||
minTime := 30
|
minTime := 30
|
||||||
throttle := d.shouldThrottle(r)
|
throttle := d.shouldThrottle(r)
|
||||||
if throttle {
|
if throttle {
|
||||||
|
if delay, ok := getRetryDelay(r); ok {
|
||||||
|
return delay
|
||||||
|
}
|
||||||
|
|
||||||
minTime = 500
|
minTime = 500
|
||||||
}
|
}
|
||||||
|
|
||||||
retryCount := r.RetryCount
|
retryCount := r.RetryCount
|
||||||
if retryCount > 13 {
|
if throttle && retryCount > 8 {
|
||||||
retryCount = 13
|
|
||||||
} else if throttle && retryCount > 8 {
|
|
||||||
retryCount = 8
|
retryCount = 8
|
||||||
|
} else if retryCount > 13 {
|
||||||
|
retryCount = 13
|
||||||
}
|
}
|
||||||
|
|
||||||
delay := (1 << uint(retryCount)) * (seededRand.Intn(minTime) + minTime)
|
delay := (1 << uint(retryCount)) * (seededRand.Intn(minTime) + minTime)
|
||||||
|
|
@ -68,12 +73,49 @@ func (d DefaultRetryer) ShouldRetry(r *request.Request) bool {
|
||||||
|
|
||||||
// ShouldThrottle returns true if the request should be throttled.
|
// ShouldThrottle returns true if the request should be throttled.
|
||||||
func (d DefaultRetryer) shouldThrottle(r *request.Request) bool {
|
func (d DefaultRetryer) shouldThrottle(r *request.Request) bool {
|
||||||
if r.HTTPResponse.StatusCode == 502 ||
|
switch r.HTTPResponse.StatusCode {
|
||||||
r.HTTPResponse.StatusCode == 503 ||
|
case 429:
|
||||||
r.HTTPResponse.StatusCode == 504 {
|
case 502:
|
||||||
return true
|
case 503:
|
||||||
|
case 504:
|
||||||
|
default:
|
||||||
|
return r.IsErrorThrottle()
|
||||||
}
|
}
|
||||||
return r.IsErrorThrottle()
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will look in the Retry-After header, RFC 7231, for how long
|
||||||
|
// it will wait before attempting another request
|
||||||
|
func getRetryDelay(r *request.Request) (time.Duration, bool) {
|
||||||
|
if !canUseRetryAfterHeader(r) {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
delayStr := r.HTTPResponse.Header.Get("Retry-After")
|
||||||
|
if len(delayStr) == 0 {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
delay, err := strconv.Atoi(delayStr)
|
||||||
|
if err != nil {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return time.Duration(delay) * time.Second, true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Will look at the status code to see if the retry header pertains to
|
||||||
|
// the status code.
|
||||||
|
func canUseRetryAfterHeader(r *request.Request) bool {
|
||||||
|
switch r.HTTPResponse.StatusCode {
|
||||||
|
case 429:
|
||||||
|
case 503:
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// lockedSource is a thread-safe implementation of rand.Source
|
// lockedSource is a thread-safe implementation of rand.Source
|
||||||
|
|
|
||||||
2
vendor/github.com/aws/aws-sdk-go/aws/config.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/config.go
generated
vendored
|
|
@ -168,7 +168,7 @@ type Config struct {
|
||||||
//
|
//
|
||||||
EC2MetadataDisableTimeoutOverride *bool
|
EC2MetadataDisableTimeoutOverride *bool
|
||||||
|
|
||||||
// Instructs the endpiont to be generated for a service client to
|
// Instructs the endpoint to be generated for a service client to
|
||||||
// be the dual stack endpoint. The dual stack endpoint will support
|
// be the dual stack endpoint. The dual stack endpoint will support
|
||||||
// both IPv4 and IPv6 addressing.
|
// both IPv4 and IPv6 addressing.
|
||||||
//
|
//
|
||||||
|
|
|
||||||
34
vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
generated
vendored
34
vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
generated
vendored
|
|
@ -9,6 +9,7 @@ package defaults
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
|
@ -118,14 +119,43 @@ func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.P
|
||||||
return ec2RoleProvider(cfg, handlers)
|
return ec2RoleProvider(cfg, handlers)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var lookupHostFn = net.LookupHost
|
||||||
|
|
||||||
|
func isLoopbackHost(host string) (bool, error) {
|
||||||
|
ip := net.ParseIP(host)
|
||||||
|
if ip != nil {
|
||||||
|
return ip.IsLoopback(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Host is not an ip, perform lookup
|
||||||
|
addrs, err := lookupHostFn(host)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
for _, addr := range addrs {
|
||||||
|
if !net.ParseIP(addr).IsLoopback() {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
func localHTTPCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider {
|
func localHTTPCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider {
|
||||||
var errMsg string
|
var errMsg string
|
||||||
|
|
||||||
parsed, err := url.Parse(u)
|
parsed, err := url.Parse(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errMsg = fmt.Sprintf("invalid URL, %v", err)
|
errMsg = fmt.Sprintf("invalid URL, %v", err)
|
||||||
} else if host := aws.URLHostname(parsed); !(host == "localhost" || host == "127.0.0.1") {
|
} else {
|
||||||
errMsg = fmt.Sprintf("invalid host address, %q, only localhost and 127.0.0.1 are valid.", host)
|
host := aws.URLHostname(parsed)
|
||||||
|
if len(host) == 0 {
|
||||||
|
errMsg = "unable to parse host from local HTTP cred provider URL"
|
||||||
|
} else if isLoopback, loopbackErr := isLoopbackHost(host); loopbackErr != nil {
|
||||||
|
errMsg = fmt.Sprintf("failed to resolve host %q, %v", host, loopbackErr)
|
||||||
|
} else if !isLoopback {
|
||||||
|
errMsg = fmt.Sprintf("invalid endpoint host, %q, only loopback hosts are allowed.", host)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(errMsg) > 0 {
|
if len(errMsg) > 0 {
|
||||||
|
|
|
||||||
24
vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go
generated
vendored
24
vendor/github.com/aws/aws-sdk-go/aws/endpoints/decode.go
generated
vendored
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
)
|
)
|
||||||
|
|
@ -84,11 +85,34 @@ func decodeV3Endpoints(modelDef modelDefinition, opts DecodeModelOptions) (Resol
|
||||||
custAddEC2Metadata(p)
|
custAddEC2Metadata(p)
|
||||||
custAddS3DualStack(p)
|
custAddS3DualStack(p)
|
||||||
custRmIotDataService(p)
|
custRmIotDataService(p)
|
||||||
|
|
||||||
|
custFixCloudHSMv2SigningName(p)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ps, nil
|
return ps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func custFixCloudHSMv2SigningName(p *partition) {
|
||||||
|
// Workaround for aws/aws-sdk-go#1745 until the endpoint model can be
|
||||||
|
// fixed upstream. TODO remove this once the endpoints model is updated.
|
||||||
|
|
||||||
|
s, ok := p.Services["cloudhsmv2"]
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(s.Defaults.CredentialScope.Service) != 0 {
|
||||||
|
fmt.Fprintf(os.Stderr, "cloudhsmv2 signing name already set, ignoring override.\n")
|
||||||
|
// If the value is already set don't override
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
s.Defaults.CredentialScope.Service = "cloudhsm"
|
||||||
|
fmt.Fprintf(os.Stderr, "cloudhsmv2 signing name not set, overriding.\n")
|
||||||
|
|
||||||
|
p.Services["cloudhsmv2"] = s
|
||||||
|
}
|
||||||
|
|
||||||
func custAddS3DualStack(p *partition) {
|
func custAddS3DualStack(p *partition) {
|
||||||
if p.ID != "aws" {
|
if p.ID != "aws" {
|
||||||
return
|
return
|
||||||
|
|
|
||||||
317
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
317
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
|
|
@ -24,6 +24,7 @@ const (
|
||||||
EuCentral1RegionID = "eu-central-1" // EU (Frankfurt).
|
EuCentral1RegionID = "eu-central-1" // EU (Frankfurt).
|
||||||
EuWest1RegionID = "eu-west-1" // EU (Ireland).
|
EuWest1RegionID = "eu-west-1" // EU (Ireland).
|
||||||
EuWest2RegionID = "eu-west-2" // EU (London).
|
EuWest2RegionID = "eu-west-2" // EU (London).
|
||||||
|
EuWest3RegionID = "eu-west-3" // EU (Paris).
|
||||||
SaEast1RegionID = "sa-east-1" // South America (Sao Paulo).
|
SaEast1RegionID = "sa-east-1" // South America (Sao Paulo).
|
||||||
UsEast1RegionID = "us-east-1" // US East (N. Virginia).
|
UsEast1RegionID = "us-east-1" // US East (N. Virginia).
|
||||||
UsEast2RegionID = "us-east-2" // US East (Ohio).
|
UsEast2RegionID = "us-east-2" // US East (Ohio).
|
||||||
|
|
@ -33,7 +34,8 @@ const (
|
||||||
|
|
||||||
// AWS China partition's regions.
|
// AWS China partition's regions.
|
||||||
const (
|
const (
|
||||||
CnNorth1RegionID = "cn-north-1" // China (Beijing).
|
CnNorth1RegionID = "cn-north-1" // China (Beijing).
|
||||||
|
CnNorthwest1RegionID = "cn-northwest-1" // China (Ningxia).
|
||||||
)
|
)
|
||||||
|
|
||||||
// AWS GovCloud (US) partition's regions.
|
// AWS GovCloud (US) partition's regions.
|
||||||
|
|
@ -44,11 +46,13 @@ const (
|
||||||
// Service identifiers
|
// Service identifiers
|
||||||
const (
|
const (
|
||||||
AcmServiceID = "acm" // Acm.
|
AcmServiceID = "acm" // Acm.
|
||||||
|
ApiPricingServiceID = "api.pricing" // ApiPricing.
|
||||||
ApigatewayServiceID = "apigateway" // Apigateway.
|
ApigatewayServiceID = "apigateway" // Apigateway.
|
||||||
ApplicationAutoscalingServiceID = "application-autoscaling" // ApplicationAutoscaling.
|
ApplicationAutoscalingServiceID = "application-autoscaling" // ApplicationAutoscaling.
|
||||||
Appstream2ServiceID = "appstream2" // Appstream2.
|
Appstream2ServiceID = "appstream2" // Appstream2.
|
||||||
AthenaServiceID = "athena" // Athena.
|
AthenaServiceID = "athena" // Athena.
|
||||||
AutoscalingServiceID = "autoscaling" // Autoscaling.
|
AutoscalingServiceID = "autoscaling" // Autoscaling.
|
||||||
|
AutoscalingPlansServiceID = "autoscaling-plans" // AutoscalingPlans.
|
||||||
BatchServiceID = "batch" // Batch.
|
BatchServiceID = "batch" // Batch.
|
||||||
BudgetsServiceID = "budgets" // Budgets.
|
BudgetsServiceID = "budgets" // Budgets.
|
||||||
ClouddirectoryServiceID = "clouddirectory" // Clouddirectory.
|
ClouddirectoryServiceID = "clouddirectory" // Clouddirectory.
|
||||||
|
|
@ -69,6 +73,7 @@ const (
|
||||||
ConfigServiceID = "config" // Config.
|
ConfigServiceID = "config" // Config.
|
||||||
CurServiceID = "cur" // Cur.
|
CurServiceID = "cur" // Cur.
|
||||||
DatapipelineServiceID = "datapipeline" // Datapipeline.
|
DatapipelineServiceID = "datapipeline" // Datapipeline.
|
||||||
|
DaxServiceID = "dax" // Dax.
|
||||||
DevicefarmServiceID = "devicefarm" // Devicefarm.
|
DevicefarmServiceID = "devicefarm" // Devicefarm.
|
||||||
DirectconnectServiceID = "directconnect" // Directconnect.
|
DirectconnectServiceID = "directconnect" // Directconnect.
|
||||||
DiscoveryServiceID = "discovery" // Discovery.
|
DiscoveryServiceID = "discovery" // Discovery.
|
||||||
|
|
@ -220,6 +225,9 @@ var awsPartition = partition{
|
||||||
"eu-west-2": region{
|
"eu-west-2": region{
|
||||||
Description: "EU (London)",
|
Description: "EU (London)",
|
||||||
},
|
},
|
||||||
|
"eu-west-3": region{
|
||||||
|
Description: "EU (Paris)",
|
||||||
|
},
|
||||||
"sa-east-1": region{
|
"sa-east-1": region{
|
||||||
Description: "South America (Sao Paulo)",
|
Description: "South America (Sao Paulo)",
|
||||||
},
|
},
|
||||||
|
|
@ -249,6 +257,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -256,6 +265,17 @@ var awsPartition = partition{
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"api.pricing": service{
|
||||||
|
Defaults: endpoint{
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Service: "pricing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"ap-south-1": endpoint{},
|
||||||
|
"us-east-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"apigateway": service{
|
"apigateway": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
|
@ -268,6 +288,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -293,6 +314,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -319,6 +341,8 @@ var awsPartition = partition{
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
"ap-southeast-1": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
|
"ap-southeast-2": endpoint{},
|
||||||
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -339,6 +363,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -346,6 +371,22 @@ var awsPartition = partition{
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"autoscaling-plans": service{
|
||||||
|
Defaults: endpoint{
|
||||||
|
Hostname: "autoscaling.{region}.amazonaws.com",
|
||||||
|
Protocols: []string{"http", "https"},
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Service: "autoscaling-plans",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"ap-southeast-1": endpoint{},
|
||||||
|
"eu-west-1": endpoint{},
|
||||||
|
"us-east-1": endpoint{},
|
||||||
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-2": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"batch": service{
|
"batch": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
|
@ -397,6 +438,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -434,12 +476,23 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"cloudhsmv2": service{
|
"cloudhsmv2": service{
|
||||||
|
Defaults: endpoint{
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Service: "cloudhsm",
|
||||||
|
},
|
||||||
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"eu-west-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"ap-south-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
|
"ca-central-1": endpoint{},
|
||||||
|
"eu-central-1": endpoint{},
|
||||||
|
"eu-west-1": endpoint{},
|
||||||
|
"us-east-1": endpoint{},
|
||||||
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-1": endpoint{},
|
||||||
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"cloudsearch": service{
|
"cloudsearch": service{
|
||||||
|
|
@ -469,6 +522,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -480,6 +534,7 @@ var awsPartition = partition{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
|
"ap-northeast-2": endpoint{},
|
||||||
"ap-southeast-1": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"ca-central-1": endpoint{},
|
"ca-central-1": endpoint{},
|
||||||
|
|
@ -523,6 +578,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -552,8 +608,10 @@ var awsPartition = partition{
|
||||||
"codestar": service{
|
"codestar": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
"ap-northeast-1": endpoint{},
|
||||||
"ap-southeast-1": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
|
"ca-central-1": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
|
@ -623,6 +681,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -646,6 +705,18 @@ var awsPartition = partition{
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"dax": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"ap-northeast-1": endpoint{},
|
||||||
|
"ap-south-1": endpoint{},
|
||||||
|
"eu-west-1": endpoint{},
|
||||||
|
"sa-east-1": endpoint{},
|
||||||
|
"us-east-1": endpoint{},
|
||||||
|
"us-west-1": endpoint{},
|
||||||
|
"us-west-2": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"devicefarm": service{
|
"devicefarm": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
|
@ -664,6 +735,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -689,6 +761,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -701,6 +774,7 @@ var awsPartition = partition{
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
"ap-northeast-2": endpoint{},
|
"ap-northeast-2": endpoint{},
|
||||||
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-1": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"ca-central-1": endpoint{},
|
"ca-central-1": endpoint{},
|
||||||
|
|
@ -710,6 +784,7 @@ var awsPartition = partition{
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-1": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -727,6 +802,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"local": endpoint{
|
"local": endpoint{
|
||||||
Hostname: "localhost:8000",
|
Hostname: "localhost:8000",
|
||||||
Protocols: []string{"http"},
|
Protocols: []string{"http"},
|
||||||
|
|
@ -755,6 +831,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -777,12 +854,16 @@ var awsPartition = partition{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
|
"ap-northeast-2": endpoint{},
|
||||||
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-1": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"ca-central-1": endpoint{},
|
"ca-central-1": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
"us-west-1": endpoint{},
|
"us-west-1": endpoint{},
|
||||||
|
|
@ -793,12 +874,16 @@ var awsPartition = partition{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
|
"ap-northeast-2": endpoint{},
|
||||||
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-1": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"ca-central-1": endpoint{},
|
"ca-central-1": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
"us-west-1": endpoint{},
|
"us-west-1": endpoint{},
|
||||||
|
|
@ -817,6 +902,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -836,6 +922,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -868,6 +955,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -892,6 +980,7 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{
|
"us-east-1": endpoint{
|
||||||
SSLCommonName: "{service}.{region}.{dnsSuffix}",
|
SSLCommonName: "{service}.{region}.{dnsSuffix}",
|
||||||
|
|
@ -944,6 +1033,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -963,6 +1053,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -974,10 +1065,13 @@ var awsPartition = partition{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
|
"ap-southeast-1": endpoint{},
|
||||||
|
"ap-southeast-2": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-1": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -1008,11 +1102,13 @@ var awsPartition = partition{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
"ap-northeast-2": endpoint{},
|
"ap-northeast-2": endpoint{},
|
||||||
"ap-south-1": endpoint{},
|
"ap-south-1": endpoint{},
|
||||||
|
"ap-southeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"ca-central-1": endpoint{},
|
"ca-central-1": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
"us-west-1": endpoint{},
|
"us-west-1": endpoint{},
|
||||||
|
|
@ -1022,7 +1118,11 @@ var awsPartition = partition{
|
||||||
"glue": service{
|
"glue": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"us-east-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
|
"eu-west-1": endpoint{},
|
||||||
|
"us-east-1": endpoint{},
|
||||||
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"greengrass": service{
|
"greengrass": service{
|
||||||
|
|
@ -1031,6 +1131,7 @@ var awsPartition = partition{
|
||||||
Protocols: []string{"https"},
|
Protocols: []string{"https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
"ap-northeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
|
|
@ -1078,6 +1179,7 @@ var awsPartition = partition{
|
||||||
"ap-northeast-2": endpoint{},
|
"ap-northeast-2": endpoint{},
|
||||||
"ap-south-1": endpoint{},
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-west-1": endpoint{},
|
"us-west-1": endpoint{},
|
||||||
|
|
@ -1115,6 +1217,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1142,6 +1245,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1161,6 +1265,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1195,6 +1300,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1274,6 +1380,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1302,6 +1409,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1343,10 +1451,21 @@ var awsPartition = partition{
|
||||||
"polly": service{
|
"polly": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"eu-west-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"ap-northeast-2": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"ap-south-1": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
|
"ap-southeast-2": endpoint{},
|
||||||
|
"ca-central-1": endpoint{},
|
||||||
|
"eu-central-1": endpoint{},
|
||||||
|
"eu-west-1": endpoint{},
|
||||||
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
|
"sa-east-1": endpoint{},
|
||||||
|
"us-east-1": endpoint{},
|
||||||
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-1": endpoint{},
|
||||||
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rds": service{
|
"rds": service{
|
||||||
|
|
@ -1361,6 +1480,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{
|
"us-east-1": endpoint{
|
||||||
SSLCommonName: "{service}.{dnsSuffix}",
|
SSLCommonName: "{service}.{dnsSuffix}",
|
||||||
|
|
@ -1382,6 +1502,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1394,6 +1515,7 @@ var awsPartition = partition{
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
|
"us-east-2": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -1423,6 +1545,7 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
"eu-west-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -1438,26 +1561,27 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{
|
"ap-northeast-1": endpoint{
|
||||||
Hostname: "s3-ap-northeast-1.amazonaws.com",
|
Hostname: "s3.ap-northeast-1.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
},
|
},
|
||||||
"ap-northeast-2": endpoint{},
|
"ap-northeast-2": endpoint{},
|
||||||
"ap-south-1": endpoint{},
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-1": endpoint{
|
"ap-southeast-1": endpoint{
|
||||||
Hostname: "s3-ap-southeast-1.amazonaws.com",
|
Hostname: "s3.ap-southeast-1.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
},
|
},
|
||||||
"ap-southeast-2": endpoint{
|
"ap-southeast-2": endpoint{
|
||||||
Hostname: "s3-ap-southeast-2.amazonaws.com",
|
Hostname: "s3.ap-southeast-2.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
},
|
},
|
||||||
"ca-central-1": endpoint{},
|
"ca-central-1": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{
|
"eu-west-1": endpoint{
|
||||||
Hostname: "s3-eu-west-1.amazonaws.com",
|
Hostname: "s3.eu-west-1.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
},
|
},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"s3-external-1": endpoint{
|
"s3-external-1": endpoint{
|
||||||
Hostname: "s3-external-1.amazonaws.com",
|
Hostname: "s3-external-1.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
|
|
@ -1466,7 +1590,7 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"sa-east-1": endpoint{
|
"sa-east-1": endpoint{
|
||||||
Hostname: "s3-sa-east-1.amazonaws.com",
|
Hostname: "s3.sa-east-1.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
},
|
},
|
||||||
"us-east-1": endpoint{
|
"us-east-1": endpoint{
|
||||||
|
|
@ -1475,11 +1599,11 @@ var awsPartition = partition{
|
||||||
},
|
},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
"us-west-1": endpoint{
|
"us-west-1": endpoint{
|
||||||
Hostname: "s3-us-west-1.amazonaws.com",
|
Hostname: "s3.us-west-1.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
},
|
},
|
||||||
"us-west-2": endpoint{
|
"us-west-2": endpoint{
|
||||||
Hostname: "s3-us-west-2.amazonaws.com",
|
Hostname: "s3.us-west-2.amazonaws.com",
|
||||||
SignatureVersions: []string{"s3", "s3v4"},
|
SignatureVersions: []string{"s3", "s3v4"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -1507,14 +1631,18 @@ var awsPartition = partition{
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"ap-northeast-1": endpoint{},
|
"ap-northeast-1": endpoint{},
|
||||||
"ap-northeast-2": endpoint{},
|
"ap-northeast-2": endpoint{},
|
||||||
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-1": endpoint{},
|
"ap-southeast-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"ca-central-1": endpoint{},
|
"ca-central-1": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-1": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -1535,21 +1663,26 @@ var awsPartition = partition{
|
||||||
"ap-northeast-2": endpoint{},
|
"ap-northeast-2": endpoint{},
|
||||||
"ap-south-1": endpoint{},
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
|
"ca-central-1": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
"us-west-1": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"snowball": service{
|
"snowball": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
"ap-northeast-1": endpoint{},
|
||||||
"ap-south-1": endpoint{},
|
"ap-south-1": endpoint{},
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1571,6 +1704,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1593,6 +1727,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{
|
"us-east-1": endpoint{
|
||||||
SSLCommonName: "queue.{dnsSuffix}",
|
SSLCommonName: "queue.{dnsSuffix}",
|
||||||
|
|
@ -1614,6 +1749,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1646,6 +1782,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1670,6 +1807,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"local": endpoint{
|
"local": endpoint{
|
||||||
Hostname: "localhost:8000",
|
Hostname: "localhost:8000",
|
||||||
Protocols: []string{"http"},
|
Protocols: []string{"http"},
|
||||||
|
|
@ -1708,6 +1846,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-1-fips": endpoint{
|
"us-east-1-fips": endpoint{
|
||||||
|
|
@ -1757,6 +1896,7 @@ var awsPartition = partition{
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
"eu-west-2": endpoint{},
|
"eu-west-2": endpoint{},
|
||||||
|
"eu-west-3": endpoint{},
|
||||||
"sa-east-1": endpoint{},
|
"sa-east-1": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-east-2": endpoint{},
|
"us-east-2": endpoint{},
|
||||||
|
|
@ -1825,6 +1965,7 @@ var awsPartition = partition{
|
||||||
"ap-southeast-2": endpoint{},
|
"ap-southeast-2": endpoint{},
|
||||||
"eu-central-1": endpoint{},
|
"eu-central-1": endpoint{},
|
||||||
"eu-west-1": endpoint{},
|
"eu-west-1": endpoint{},
|
||||||
|
"eu-west-2": endpoint{},
|
||||||
"us-east-1": endpoint{},
|
"us-east-1": endpoint{},
|
||||||
"us-west-2": endpoint{},
|
"us-west-2": endpoint{},
|
||||||
},
|
},
|
||||||
|
|
@ -1875,8 +2016,17 @@ var awscnPartition = partition{
|
||||||
"cn-north-1": region{
|
"cn-north-1": region{
|
||||||
Description: "China (Beijing)",
|
Description: "China (Beijing)",
|
||||||
},
|
},
|
||||||
|
"cn-northwest-1": region{
|
||||||
|
Description: "China (Ningxia)",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Services: services{
|
Services: services{
|
||||||
|
"apigateway": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"cn-north-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"application-autoscaling": service{
|
"application-autoscaling": service{
|
||||||
Defaults: endpoint{
|
Defaults: endpoint{
|
||||||
Hostname: "autoscaling.{region}.amazonaws.com",
|
Hostname: "autoscaling.{region}.amazonaws.com",
|
||||||
|
|
@ -1886,7 +2036,8 @@ var awscnPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"autoscaling": service{
|
"autoscaling": service{
|
||||||
|
|
@ -1894,23 +2045,33 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"cloudformation": service{
|
"cloudformation": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"cloudtrail": service{
|
"cloudtrail": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"codedeploy": service{
|
"codedeploy": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"cognito-identity": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
},
|
},
|
||||||
|
|
@ -1918,13 +2079,15 @@ var awscnPartition = partition{
|
||||||
"config": service{
|
"config": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"directconnect": service{
|
"directconnect": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"dynamodb": service{
|
"dynamodb": service{
|
||||||
|
|
@ -1932,7 +2095,8 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"ec2": service{
|
"ec2": service{
|
||||||
|
|
@ -1940,7 +2104,8 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"ec2metadata": service{
|
"ec2metadata": service{
|
||||||
|
|
@ -1969,13 +2134,15 @@ var awscnPartition = partition{
|
||||||
"elasticache": service{
|
"elasticache": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"elasticbeanstalk": service{
|
"elasticbeanstalk": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"elasticloadbalancing": service{
|
"elasticloadbalancing": service{
|
||||||
|
|
@ -1983,7 +2150,8 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"https"},
|
Protocols: []string{"https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"elasticmapreduce": service{
|
"elasticmapreduce": service{
|
||||||
|
|
@ -1991,13 +2159,21 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"es": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"events": service{
|
"events": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"glacier": service{
|
"glacier": service{
|
||||||
|
|
@ -2005,7 +2181,8 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"iam": service{
|
"iam": service{
|
||||||
|
|
@ -2033,6 +2210,13 @@ var awscnPartition = partition{
|
||||||
},
|
},
|
||||||
"kinesis": service{
|
"kinesis": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"lambda": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
},
|
},
|
||||||
|
|
@ -2040,7 +2224,8 @@ var awscnPartition = partition{
|
||||||
"logs": service{
|
"logs": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"monitoring": service{
|
"monitoring": service{
|
||||||
|
|
@ -2048,19 +2233,22 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"rds": service{
|
"rds": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"redshift": service{
|
"redshift": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"s3": service{
|
"s3": service{
|
||||||
|
|
@ -2068,6 +2256,13 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
SignatureVersions: []string{"s3v4"},
|
SignatureVersions: []string{"s3v4"},
|
||||||
},
|
},
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"snowball": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
},
|
},
|
||||||
|
|
@ -2077,7 +2272,8 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"sqs": service{
|
"sqs": service{
|
||||||
|
|
@ -2086,13 +2282,15 @@ var awscnPartition = partition{
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"ssm": service{
|
"ssm": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"storagegateway": service{
|
"storagegateway": service{
|
||||||
|
|
@ -2109,19 +2307,22 @@ var awscnPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"sts": service{
|
"sts": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"swf": service{
|
"swf": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"cn-north-1": endpoint{},
|
"cn-north-1": endpoint{},
|
||||||
|
"cn-northwest-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"tagging": service{
|
"tagging": service{
|
||||||
|
|
@ -2215,10 +2416,22 @@ var awsusgovPartition = partition{
|
||||||
"us-gov-west-1": endpoint{},
|
"us-gov-west-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"dms": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"us-gov-west-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"dynamodb": service{
|
"dynamodb": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"us-gov-west-1": endpoint{},
|
"us-gov-west-1": endpoint{},
|
||||||
|
"us-gov-west-1-fips": endpoint{
|
||||||
|
Hostname: "dynamodb.us-gov-west-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"ec2": service{
|
"ec2": service{
|
||||||
|
|
@ -2238,12 +2451,24 @@ var awsusgovPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"ecs": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"us-gov-west-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"elasticache": service{
|
"elasticache": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"us-gov-west-1": endpoint{},
|
"us-gov-west-1": endpoint{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"elasticbeanstalk": service{
|
||||||
|
|
||||||
|
Endpoints: endpoints{
|
||||||
|
"us-gov-west-1": endpoint{},
|
||||||
|
},
|
||||||
|
},
|
||||||
"elasticloadbalancing": service{
|
"elasticloadbalancing": service{
|
||||||
|
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
|
|
@ -2347,7 +2572,7 @@ var awsusgovPartition = partition{
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"us-gov-west-1": endpoint{
|
"us-gov-west-1": endpoint{
|
||||||
Hostname: "s3-us-gov-west-1.amazonaws.com",
|
Hostname: "s3.us-gov-west-1.amazonaws.com",
|
||||||
Protocols: []string{"http", "https"},
|
Protocols: []string{"http", "https"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -2395,6 +2620,12 @@ var awsusgovPartition = partition{
|
||||||
},
|
},
|
||||||
Endpoints: endpoints{
|
Endpoints: endpoints{
|
||||||
"us-gov-west-1": endpoint{},
|
"us-gov-west-1": endpoint{},
|
||||||
|
"us-gov-west-1-fips": endpoint{
|
||||||
|
Hostname: "dynamodb.us-gov-west-1.amazonaws.com",
|
||||||
|
CredentialScope: credentialScope{
|
||||||
|
Region: "us-gov-west-1",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
"sts": service{
|
"sts": service{
|
||||||
|
|
|
||||||
140
vendor/github.com/aws/aws-sdk-go/aws/request/request.go
generated
vendored
140
vendor/github.com/aws/aws-sdk-go/aws/request/request.go
generated
vendored
|
|
@ -28,6 +28,10 @@ const (
|
||||||
// during body reads.
|
// during body reads.
|
||||||
ErrCodeResponseTimeout = "ResponseTimeout"
|
ErrCodeResponseTimeout = "ResponseTimeout"
|
||||||
|
|
||||||
|
// ErrCodeInvalidPresignExpire is returned when the expire time provided to
|
||||||
|
// presign is invalid
|
||||||
|
ErrCodeInvalidPresignExpire = "InvalidPresignExpireError"
|
||||||
|
|
||||||
// CanceledErrorCode is the error code that will be returned by an
|
// CanceledErrorCode is the error code that will be returned by an
|
||||||
// API request that was canceled. Requests given a aws.Context may
|
// API request that was canceled. Requests given a aws.Context may
|
||||||
// return this error when canceled.
|
// return this error when canceled.
|
||||||
|
|
@ -42,7 +46,6 @@ type Request struct {
|
||||||
|
|
||||||
Retryer
|
Retryer
|
||||||
Time time.Time
|
Time time.Time
|
||||||
ExpireTime time.Duration
|
|
||||||
Operation *Operation
|
Operation *Operation
|
||||||
HTTPRequest *http.Request
|
HTTPRequest *http.Request
|
||||||
HTTPResponse *http.Response
|
HTTPResponse *http.Response
|
||||||
|
|
@ -60,6 +63,11 @@ type Request struct {
|
||||||
LastSignedAt time.Time
|
LastSignedAt time.Time
|
||||||
DisableFollowRedirects bool
|
DisableFollowRedirects bool
|
||||||
|
|
||||||
|
// A value greater than 0 instructs the request to be signed as Presigned URL
|
||||||
|
// You should not set this field directly. Instead use Request's
|
||||||
|
// Presign or PresignRequest methods.
|
||||||
|
ExpireTime time.Duration
|
||||||
|
|
||||||
context aws.Context
|
context aws.Context
|
||||||
|
|
||||||
built bool
|
built bool
|
||||||
|
|
@ -104,6 +112,8 @@ func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers,
|
||||||
err = awserr.New("InvalidEndpointURL", "invalid endpoint uri", err)
|
err = awserr.New("InvalidEndpointURL", "invalid endpoint uri", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SanitizeHostForHeader(httpReq)
|
||||||
|
|
||||||
r := &Request{
|
r := &Request{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
ClientInfo: clientInfo,
|
ClientInfo: clientInfo,
|
||||||
|
|
@ -250,40 +260,59 @@ func (r *Request) SetReaderBody(reader io.ReadSeeker) {
|
||||||
|
|
||||||
// Presign returns the request's signed URL. Error will be returned
|
// Presign returns the request's signed URL. Error will be returned
|
||||||
// if the signing fails.
|
// if the signing fails.
|
||||||
func (r *Request) Presign(expireTime time.Duration) (string, error) {
|
//
|
||||||
r.ExpireTime = expireTime
|
// It is invalid to create a presigned URL with a expire duration 0 or less. An
|
||||||
|
// error is returned if expire duration is 0 or less.
|
||||||
|
func (r *Request) Presign(expire time.Duration) (string, error) {
|
||||||
|
r = r.copy()
|
||||||
|
|
||||||
|
// Presign requires all headers be hoisted. There is no way to retrieve
|
||||||
|
// the signed headers not hoisted without this. Making the presigned URL
|
||||||
|
// useless.
|
||||||
r.NotHoist = false
|
r.NotHoist = false
|
||||||
|
|
||||||
if r.Operation.BeforePresignFn != nil {
|
u, _, err := getPresignedURL(r, expire)
|
||||||
r = r.copy()
|
return u, err
|
||||||
err := r.Operation.BeforePresignFn(r)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
r.Sign()
|
|
||||||
if r.Error != nil {
|
|
||||||
return "", r.Error
|
|
||||||
}
|
|
||||||
return r.HTTPRequest.URL.String(), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PresignRequest behaves just like presign, with the addition of returning a
|
// PresignRequest behaves just like presign, with the addition of returning a
|
||||||
// set of headers that were signed.
|
// set of headers that were signed.
|
||||||
//
|
//
|
||||||
|
// It is invalid to create a presigned URL with a expire duration 0 or less. An
|
||||||
|
// error is returned if expire duration is 0 or less.
|
||||||
|
//
|
||||||
// Returns the URL string for the API operation with signature in the query string,
|
// Returns the URL string for the API operation with signature in the query string,
|
||||||
// and the HTTP headers that were included in the signature. These headers must
|
// and the HTTP headers that were included in the signature. These headers must
|
||||||
// be included in any HTTP request made with the presigned URL.
|
// be included in any HTTP request made with the presigned URL.
|
||||||
//
|
//
|
||||||
// To prevent hoisting any headers to the query string set NotHoist to true on
|
// To prevent hoisting any headers to the query string set NotHoist to true on
|
||||||
// this Request value prior to calling PresignRequest.
|
// this Request value prior to calling PresignRequest.
|
||||||
func (r *Request) PresignRequest(expireTime time.Duration) (string, http.Header, error) {
|
func (r *Request) PresignRequest(expire time.Duration) (string, http.Header, error) {
|
||||||
r.ExpireTime = expireTime
|
r = r.copy()
|
||||||
r.Sign()
|
return getPresignedURL(r, expire)
|
||||||
if r.Error != nil {
|
}
|
||||||
return "", nil, r.Error
|
|
||||||
|
func getPresignedURL(r *Request, expire time.Duration) (string, http.Header, error) {
|
||||||
|
if expire <= 0 {
|
||||||
|
return "", nil, awserr.New(
|
||||||
|
ErrCodeInvalidPresignExpire,
|
||||||
|
"presigned URL requires an expire duration greater than 0",
|
||||||
|
nil,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r.ExpireTime = expire
|
||||||
|
|
||||||
|
if r.Operation.BeforePresignFn != nil {
|
||||||
|
if err := r.Operation.BeforePresignFn(r); err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := r.Sign(); err != nil {
|
||||||
|
return "", nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil
|
return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -579,3 +608,72 @@ func shouldRetryCancel(r *Request) bool {
|
||||||
errStr != "net/http: request canceled while waiting for connection")
|
errStr != "net/http: request canceled while waiting for connection")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SanitizeHostForHeader removes default port from host and updates request.Host
|
||||||
|
func SanitizeHostForHeader(r *http.Request) {
|
||||||
|
host := getHost(r)
|
||||||
|
port := portOnly(host)
|
||||||
|
if port != "" && isDefaultPort(r.URL.Scheme, port) {
|
||||||
|
r.Host = stripPort(host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns host from request
|
||||||
|
func getHost(r *http.Request) string {
|
||||||
|
if r.Host != "" {
|
||||||
|
return r.Host
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.URL.Host
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hostname returns u.Host, without any port number.
|
||||||
|
//
|
||||||
|
// If Host is an IPv6 literal with a port number, Hostname returns the
|
||||||
|
// IPv6 literal without the square brackets. IPv6 literals may include
|
||||||
|
// a zone identifier.
|
||||||
|
//
|
||||||
|
// Copied from the Go 1.8 standard library (net/url)
|
||||||
|
func stripPort(hostport string) string {
|
||||||
|
colon := strings.IndexByte(hostport, ':')
|
||||||
|
if colon == -1 {
|
||||||
|
return hostport
|
||||||
|
}
|
||||||
|
if i := strings.IndexByte(hostport, ']'); i != -1 {
|
||||||
|
return strings.TrimPrefix(hostport[:i], "[")
|
||||||
|
}
|
||||||
|
return hostport[:colon]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Port returns the port part of u.Host, without the leading colon.
|
||||||
|
// If u.Host doesn't contain a port, Port returns an empty string.
|
||||||
|
//
|
||||||
|
// Copied from the Go 1.8 standard library (net/url)
|
||||||
|
func portOnly(hostport string) string {
|
||||||
|
colon := strings.IndexByte(hostport, ':')
|
||||||
|
if colon == -1 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if i := strings.Index(hostport, "]:"); i != -1 {
|
||||||
|
return hostport[i+len("]:"):]
|
||||||
|
}
|
||||||
|
if strings.Contains(hostport, "]") {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return hostport[colon+len(":"):]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns true if the specified URI is using the standard port
|
||||||
|
// (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs)
|
||||||
|
func isDefaultPort(scheme, port string) bool {
|
||||||
|
if port == "" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
lowerCaseScheme := strings.ToLower(scheme)
|
||||||
|
if (lowerCaseScheme == "http" && port == "80") || (lowerCaseScheme == "https" && port == "443") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
|
||||||
25
vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go
generated
vendored
25
vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go
generated
vendored
|
|
@ -142,13 +142,28 @@ func (r *Request) nextPageTokens() []interface{} {
|
||||||
tokens := []interface{}{}
|
tokens := []interface{}{}
|
||||||
tokenAdded := false
|
tokenAdded := false
|
||||||
for _, outToken := range r.Operation.OutputTokens {
|
for _, outToken := range r.Operation.OutputTokens {
|
||||||
v, _ := awsutil.ValuesAtPath(r.Data, outToken)
|
vs, _ := awsutil.ValuesAtPath(r.Data, outToken)
|
||||||
if len(v) > 0 {
|
if len(vs) == 0 {
|
||||||
tokens = append(tokens, v[0])
|
|
||||||
tokenAdded = true
|
|
||||||
} else {
|
|
||||||
tokens = append(tokens, nil)
|
tokens = append(tokens, nil)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
v := vs[0]
|
||||||
|
|
||||||
|
switch tv := v.(type) {
|
||||||
|
case *string:
|
||||||
|
if len(aws.StringValue(tv)) == 0 {
|
||||||
|
tokens = append(tokens, nil)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
case string:
|
||||||
|
if len(tv) == 0 {
|
||||||
|
tokens = append(tokens, nil)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tokenAdded = true
|
||||||
|
tokens = append(tokens, v)
|
||||||
}
|
}
|
||||||
if !tokenAdded {
|
if !tokenAdded {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
5
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
5
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
|
|
@ -7,6 +7,9 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// EnvProviderName provides a name of the provider when config is loaded from environment.
|
||||||
|
const EnvProviderName = "EnvConfigCredentials"
|
||||||
|
|
||||||
// envConfig is a collection of environment values the SDK will read
|
// envConfig is a collection of environment values the SDK will read
|
||||||
// setup config from. All environment values are optional. But some values
|
// setup config from. All environment values are optional. But some values
|
||||||
// such as credentials require multiple values to be complete or the values
|
// such as credentials require multiple values to be complete or the values
|
||||||
|
|
@ -157,7 +160,7 @@ func envConfigLoad(enableSharedConfig bool) envConfig {
|
||||||
if len(cfg.Creds.AccessKeyID) == 0 || len(cfg.Creds.SecretAccessKey) == 0 {
|
if len(cfg.Creds.AccessKeyID) == 0 || len(cfg.Creds.SecretAccessKey) == 0 {
|
||||||
cfg.Creds = credentials.Value{}
|
cfg.Creds = credentials.Value{}
|
||||||
} else {
|
} else {
|
||||||
cfg.Creds.ProviderName = "EnvConfigCredentials"
|
cfg.Creds.ProviderName = EnvProviderName
|
||||||
}
|
}
|
||||||
|
|
||||||
regionKeys := regionEnvKeys
|
regionKeys := regionEnvKeys
|
||||||
|
|
|
||||||
15
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
15
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
|
|
@ -268,7 +268,7 @@ type signingCtx struct {
|
||||||
// "X-Amz-Content-Sha256" header with a precomputed value. The signer will
|
// "X-Amz-Content-Sha256" header with a precomputed value. The signer will
|
||||||
// only compute the hash if the request header value is empty.
|
// only compute the hash if the request header value is empty.
|
||||||
func (v4 Signer) Sign(r *http.Request, body io.ReadSeeker, service, region string, signTime time.Time) (http.Header, error) {
|
func (v4 Signer) Sign(r *http.Request, body io.ReadSeeker, service, region string, signTime time.Time) (http.Header, error) {
|
||||||
return v4.signWithBody(r, body, service, region, 0, signTime)
|
return v4.signWithBody(r, body, service, region, 0, false, signTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Presign signs AWS v4 requests with the provided body, service name, region
|
// Presign signs AWS v4 requests with the provided body, service name, region
|
||||||
|
|
@ -302,10 +302,10 @@ func (v4 Signer) Sign(r *http.Request, body io.ReadSeeker, service, region strin
|
||||||
// presigned request's signature you can set the "X-Amz-Content-Sha256"
|
// presigned request's signature you can set the "X-Amz-Content-Sha256"
|
||||||
// HTTP header and that will be included in the request's signature.
|
// HTTP header and that will be included in the request's signature.
|
||||||
func (v4 Signer) Presign(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, signTime time.Time) (http.Header, error) {
|
func (v4 Signer) Presign(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, signTime time.Time) (http.Header, error) {
|
||||||
return v4.signWithBody(r, body, service, region, exp, signTime)
|
return v4.signWithBody(r, body, service, region, exp, true, signTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, signTime time.Time) (http.Header, error) {
|
func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, region string, exp time.Duration, isPresign bool, signTime time.Time) (http.Header, error) {
|
||||||
currentTimeFn := v4.currentTimeFn
|
currentTimeFn := v4.currentTimeFn
|
||||||
if currentTimeFn == nil {
|
if currentTimeFn == nil {
|
||||||
currentTimeFn = time.Now
|
currentTimeFn = time.Now
|
||||||
|
|
@ -317,7 +317,7 @@ func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, regi
|
||||||
Query: r.URL.Query(),
|
Query: r.URL.Query(),
|
||||||
Time: signTime,
|
Time: signTime,
|
||||||
ExpireTime: exp,
|
ExpireTime: exp,
|
||||||
isPresign: exp != 0,
|
isPresign: isPresign,
|
||||||
ServiceName: service,
|
ServiceName: service,
|
||||||
Region: region,
|
Region: region,
|
||||||
DisableURIPathEscaping: v4.DisableURIPathEscaping,
|
DisableURIPathEscaping: v4.DisableURIPathEscaping,
|
||||||
|
|
@ -339,6 +339,7 @@ func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, regi
|
||||||
return http.Header{}, err
|
return http.Header{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx.sanitizeHostForHeader()
|
||||||
ctx.assignAmzQueryValues()
|
ctx.assignAmzQueryValues()
|
||||||
ctx.build(v4.DisableHeaderHoisting)
|
ctx.build(v4.DisableHeaderHoisting)
|
||||||
|
|
||||||
|
|
@ -363,6 +364,10 @@ func (v4 Signer) signWithBody(r *http.Request, body io.ReadSeeker, service, regi
|
||||||
return ctx.SignedHeaderVals, nil
|
return ctx.SignedHeaderVals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ctx *signingCtx) sanitizeHostForHeader() {
|
||||||
|
request.SanitizeHostForHeader(ctx.Request)
|
||||||
|
}
|
||||||
|
|
||||||
func (ctx *signingCtx) handlePresignRemoval() {
|
func (ctx *signingCtx) handlePresignRemoval() {
|
||||||
if !ctx.isPresign {
|
if !ctx.isPresign {
|
||||||
return
|
return
|
||||||
|
|
@ -467,7 +472,7 @@ func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
signedHeaders, err := v4.signWithBody(req.HTTPRequest, req.GetBody(),
|
signedHeaders, err := v4.signWithBody(req.HTTPRequest, req.GetBody(),
|
||||||
name, region, req.ExpireTime, signingTime,
|
name, region, req.ExpireTime, req.ExpireTime > 0, signingTime,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
req.Error = err
|
req.Error = err
|
||||||
|
|
|
||||||
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
|
|
@ -5,4 +5,4 @@ package aws
|
||||||
const SDKName = "aws-sdk-go"
|
const SDKName = "aws-sdk-go"
|
||||||
|
|
||||||
// SDKVersion is the version of this SDK
|
// SDKVersion is the version of this SDK
|
||||||
const SDKVersion = "1.10.41"
|
const SDKVersion = "1.12.70"
|
||||||
|
|
|
||||||
76
vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go
generated
vendored
Normal file
76
vendor/github.com/aws/aws-sdk-go/private/protocol/jsonvalue.go
generated
vendored
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
package protocol
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EscapeMode is the mode that should be use for escaping a value
|
||||||
|
type EscapeMode uint
|
||||||
|
|
||||||
|
// The modes for escaping a value before it is marshaled, and unmarshaled.
|
||||||
|
const (
|
||||||
|
NoEscape EscapeMode = iota
|
||||||
|
Base64Escape
|
||||||
|
QuotedEscape
|
||||||
|
)
|
||||||
|
|
||||||
|
// EncodeJSONValue marshals the value into a JSON string, and optionally base64
|
||||||
|
// encodes the string before returning it.
|
||||||
|
//
|
||||||
|
// Will panic if the escape mode is unknown.
|
||||||
|
func EncodeJSONValue(v aws.JSONValue, escape EscapeMode) (string, error) {
|
||||||
|
b, err := json.Marshal(v)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch escape {
|
||||||
|
case NoEscape:
|
||||||
|
return string(b), nil
|
||||||
|
case Base64Escape:
|
||||||
|
return base64.StdEncoding.EncodeToString(b), nil
|
||||||
|
case QuotedEscape:
|
||||||
|
return strconv.Quote(string(b)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
panic(fmt.Sprintf("EncodeJSONValue called with unknown EscapeMode, %v", escape))
|
||||||
|
}
|
||||||
|
|
||||||
|
// DecodeJSONValue will attempt to decode the string input as a JSONValue.
|
||||||
|
// Optionally decoding base64 the value first before JSON unmarshaling.
|
||||||
|
//
|
||||||
|
// Will panic if the escape mode is unknown.
|
||||||
|
func DecodeJSONValue(v string, escape EscapeMode) (aws.JSONValue, error) {
|
||||||
|
var b []byte
|
||||||
|
var err error
|
||||||
|
|
||||||
|
switch escape {
|
||||||
|
case NoEscape:
|
||||||
|
b = []byte(v)
|
||||||
|
case Base64Escape:
|
||||||
|
b, err = base64.StdEncoding.DecodeString(v)
|
||||||
|
case QuotedEscape:
|
||||||
|
var u string
|
||||||
|
u, err = strconv.Unquote(v)
|
||||||
|
b = []byte(u)
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("DecodeJSONValue called with unknown EscapeMode, %v", escape))
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m := aws.JSONValue{}
|
||||||
|
err = json.Unmarshal(b, &m)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
4
vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go
generated
vendored
|
|
@ -121,6 +121,10 @@ func (q *queryParser) parseList(v url.Values, value reflect.Value, prefix string
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if _, ok := value.Interface().([]byte); ok {
|
||||||
|
return q.parseScalar(v, value, prefix, tag)
|
||||||
|
}
|
||||||
|
|
||||||
// check for unflattened list member
|
// check for unflattened list member
|
||||||
if !q.isEC2 && tag.Get("flattened") == "" {
|
if !q.isEC2 && tag.Get("flattened") == "" {
|
||||||
if listName := tag.Get("locationNameList"); listName == "" {
|
if listName := tag.Get("locationNameList"); listName == "" {
|
||||||
|
|
|
||||||
21
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go
generated
vendored
21
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go
generated
vendored
|
|
@ -4,7 +4,6 @@ package rest
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
@ -18,6 +17,7 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RFC822 returns an RFC822 formatted timestamp for AWS protocols
|
// RFC822 returns an RFC822 formatted timestamp for AWS protocols
|
||||||
|
|
@ -252,13 +252,12 @@ func EscapePath(path string, encodeSep bool) string {
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertType(v reflect.Value, tag reflect.StructTag) (string, error) {
|
func convertType(v reflect.Value, tag reflect.StructTag) (str string, err error) {
|
||||||
v = reflect.Indirect(v)
|
v = reflect.Indirect(v)
|
||||||
if !v.IsValid() {
|
if !v.IsValid() {
|
||||||
return "", errValueNotSet
|
return "", errValueNotSet
|
||||||
}
|
}
|
||||||
|
|
||||||
var str string
|
|
||||||
switch value := v.Interface().(type) {
|
switch value := v.Interface().(type) {
|
||||||
case string:
|
case string:
|
||||||
str = value
|
str = value
|
||||||
|
|
@ -273,17 +272,19 @@ func convertType(v reflect.Value, tag reflect.StructTag) (string, error) {
|
||||||
case time.Time:
|
case time.Time:
|
||||||
str = value.UTC().Format(RFC822)
|
str = value.UTC().Format(RFC822)
|
||||||
case aws.JSONValue:
|
case aws.JSONValue:
|
||||||
b, err := json.Marshal(value)
|
if len(value) == 0 {
|
||||||
if err != nil {
|
return "", errValueNotSet
|
||||||
return "", err
|
|
||||||
}
|
}
|
||||||
|
escaping := protocol.NoEscape
|
||||||
if tag.Get("location") == "header" {
|
if tag.Get("location") == "header" {
|
||||||
str = base64.StdEncoding.EncodeToString(b)
|
escaping = protocol.Base64Escape
|
||||||
} else {
|
}
|
||||||
str = string(b)
|
str, err = protocol.EncodeJSONValue(value, escaping)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("unable to encode JSONValue, %v", err)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
err := fmt.Errorf("Unsupported value for param %v (%s)", v.Interface(), v.Type())
|
err := fmt.Errorf("unsupported value for param %v (%s)", v.Interface(), v.Type())
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return str, nil
|
return str, nil
|
||||||
|
|
|
||||||
14
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go
generated
vendored
14
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go
generated
vendored
|
|
@ -3,7 +3,6 @@ package rest
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
@ -16,6 +15,7 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
)
|
)
|
||||||
|
|
||||||
// UnmarshalHandler is a named request handler for unmarshaling rest protocol requests
|
// UnmarshalHandler is a named request handler for unmarshaling rest protocol requests
|
||||||
|
|
@ -204,17 +204,11 @@ func unmarshalHeader(v reflect.Value, header string, tag reflect.StructTag) erro
|
||||||
}
|
}
|
||||||
v.Set(reflect.ValueOf(&t))
|
v.Set(reflect.ValueOf(&t))
|
||||||
case aws.JSONValue:
|
case aws.JSONValue:
|
||||||
b := []byte(header)
|
escaping := protocol.NoEscape
|
||||||
var err error
|
|
||||||
if tag.Get("location") == "header" {
|
if tag.Get("location") == "header" {
|
||||||
b, err = base64.StdEncoding.DecodeString(header)
|
escaping = protocol.Base64Escape
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
m, err := protocol.DecodeJSONValue(header, escaping)
|
||||||
m := aws.JSONValue{}
|
|
||||||
err = json.Unmarshal(b, &m)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
2340
vendor/github.com/aws/aws-sdk-go/service/s3/api.go
generated
vendored
2340
vendor/github.com/aws/aws-sdk-go/service/s3/api.go
generated
vendored
File diff suppressed because it is too large
Load diff
2
vendor/github.com/aws/aws-sdk-go/service/s3/doc.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/service/s3/doc.go
generated
vendored
|
|
@ -10,7 +10,7 @@
|
||||||
//
|
//
|
||||||
// Using the Client
|
// Using the Client
|
||||||
//
|
//
|
||||||
// To Amazon Simple Storage Service with the SDK use the New function to create
|
// To contact Amazon Simple Storage Service with the SDK use the New function to create
|
||||||
// a new service client. With that client you can make API requests to the service.
|
// a new service client. With that client you can make API requests to the service.
|
||||||
// These clients are safe to use concurrently.
|
// These clients are safe to use concurrently.
|
||||||
//
|
//
|
||||||
|
|
|
||||||
4
vendor/github.com/aws/aws-sdk-go/service/s3/doc_custom.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go/service/s3/doc_custom.go
generated
vendored
|
|
@ -35,7 +35,7 @@
|
||||||
//
|
//
|
||||||
// The s3manager package's Downloader provides concurrently downloading of Objects
|
// The s3manager package's Downloader provides concurrently downloading of Objects
|
||||||
// from S3. The Downloader will write S3 Object content with an io.WriterAt.
|
// from S3. The Downloader will write S3 Object content with an io.WriterAt.
|
||||||
// Once the Downloader instance is created you can call Upload concurrently from
|
// Once the Downloader instance is created you can call Download concurrently from
|
||||||
// multiple goroutines safely.
|
// multiple goroutines safely.
|
||||||
//
|
//
|
||||||
// // The session the S3 Downloader will use
|
// // The session the S3 Downloader will use
|
||||||
|
|
@ -56,7 +56,7 @@
|
||||||
// Key: aws.String(myString),
|
// Key: aws.String(myString),
|
||||||
// })
|
// })
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// return fmt.Errorf("failed to upload file, %v", err)
|
// return fmt.Errorf("failed to download file, %v", err)
|
||||||
// }
|
// }
|
||||||
// fmt.Printf("file downloaded, %d bytes\n", n)
|
// fmt.Printf("file downloaded, %d bytes\n", n)
|
||||||
//
|
//
|
||||||
|
|
|
||||||
62
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
62
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
|
|
@ -35,7 +35,7 @@ const opAssumeRole = "AssumeRole"
|
||||||
// fmt.Println(resp)
|
// fmt.Println(resp)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole
|
||||||
func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, output *AssumeRoleOutput) {
|
func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, output *AssumeRoleOutput) {
|
||||||
op := &request.Operation{
|
op := &request.Operation{
|
||||||
Name: opAssumeRole,
|
Name: opAssumeRole,
|
||||||
|
|
@ -168,7 +168,7 @@ func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, o
|
||||||
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
||||||
// in the IAM User Guide.
|
// in the IAM User Guide.
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole
|
||||||
func (c *STS) AssumeRole(input *AssumeRoleInput) (*AssumeRoleOutput, error) {
|
func (c *STS) AssumeRole(input *AssumeRoleInput) (*AssumeRoleOutput, error) {
|
||||||
req, out := c.AssumeRoleRequest(input)
|
req, out := c.AssumeRoleRequest(input)
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
|
|
@ -215,7 +215,7 @@ const opAssumeRoleWithSAML = "AssumeRoleWithSAML"
|
||||||
// fmt.Println(resp)
|
// fmt.Println(resp)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML
|
||||||
func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *request.Request, output *AssumeRoleWithSAMLOutput) {
|
func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *request.Request, output *AssumeRoleWithSAMLOutput) {
|
||||||
op := &request.Operation{
|
op := &request.Operation{
|
||||||
Name: opAssumeRoleWithSAML,
|
Name: opAssumeRoleWithSAML,
|
||||||
|
|
@ -341,7 +341,7 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re
|
||||||
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
||||||
// in the IAM User Guide.
|
// in the IAM User Guide.
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML
|
||||||
func (c *STS) AssumeRoleWithSAML(input *AssumeRoleWithSAMLInput) (*AssumeRoleWithSAMLOutput, error) {
|
func (c *STS) AssumeRoleWithSAML(input *AssumeRoleWithSAMLInput) (*AssumeRoleWithSAMLOutput, error) {
|
||||||
req, out := c.AssumeRoleWithSAMLRequest(input)
|
req, out := c.AssumeRoleWithSAMLRequest(input)
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
|
|
@ -388,7 +388,7 @@ const opAssumeRoleWithWebIdentity = "AssumeRoleWithWebIdentity"
|
||||||
// fmt.Println(resp)
|
// fmt.Println(resp)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity
|
||||||
func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityInput) (req *request.Request, output *AssumeRoleWithWebIdentityOutput) {
|
func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityInput) (req *request.Request, output *AssumeRoleWithWebIdentityOutput) {
|
||||||
op := &request.Operation{
|
op := &request.Operation{
|
||||||
Name: opAssumeRoleWithWebIdentity,
|
Name: opAssumeRoleWithWebIdentity,
|
||||||
|
|
@ -543,7 +543,7 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI
|
||||||
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
||||||
// in the IAM User Guide.
|
// in the IAM User Guide.
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity
|
||||||
func (c *STS) AssumeRoleWithWebIdentity(input *AssumeRoleWithWebIdentityInput) (*AssumeRoleWithWebIdentityOutput, error) {
|
func (c *STS) AssumeRoleWithWebIdentity(input *AssumeRoleWithWebIdentityInput) (*AssumeRoleWithWebIdentityOutput, error) {
|
||||||
req, out := c.AssumeRoleWithWebIdentityRequest(input)
|
req, out := c.AssumeRoleWithWebIdentityRequest(input)
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
|
|
@ -590,7 +590,7 @@ const opDecodeAuthorizationMessage = "DecodeAuthorizationMessage"
|
||||||
// fmt.Println(resp)
|
// fmt.Println(resp)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage
|
||||||
func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessageInput) (req *request.Request, output *DecodeAuthorizationMessageOutput) {
|
func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessageInput) (req *request.Request, output *DecodeAuthorizationMessageOutput) {
|
||||||
op := &request.Operation{
|
op := &request.Operation{
|
||||||
Name: opDecodeAuthorizationMessage,
|
Name: opDecodeAuthorizationMessage,
|
||||||
|
|
@ -655,7 +655,7 @@ func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessag
|
||||||
// invalid. This can happen if the token contains invalid characters, such as
|
// invalid. This can happen if the token contains invalid characters, such as
|
||||||
// linebreaks.
|
// linebreaks.
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage
|
||||||
func (c *STS) DecodeAuthorizationMessage(input *DecodeAuthorizationMessageInput) (*DecodeAuthorizationMessageOutput, error) {
|
func (c *STS) DecodeAuthorizationMessage(input *DecodeAuthorizationMessageInput) (*DecodeAuthorizationMessageOutput, error) {
|
||||||
req, out := c.DecodeAuthorizationMessageRequest(input)
|
req, out := c.DecodeAuthorizationMessageRequest(input)
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
|
|
@ -702,7 +702,7 @@ const opGetCallerIdentity = "GetCallerIdentity"
|
||||||
// fmt.Println(resp)
|
// fmt.Println(resp)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity
|
||||||
func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *request.Request, output *GetCallerIdentityOutput) {
|
func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *request.Request, output *GetCallerIdentityOutput) {
|
||||||
op := &request.Operation{
|
op := &request.Operation{
|
||||||
Name: opGetCallerIdentity,
|
Name: opGetCallerIdentity,
|
||||||
|
|
@ -730,7 +730,7 @@ func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *requ
|
||||||
//
|
//
|
||||||
// See the AWS API reference guide for AWS Security Token Service's
|
// See the AWS API reference guide for AWS Security Token Service's
|
||||||
// API operation GetCallerIdentity for usage and error information.
|
// API operation GetCallerIdentity for usage and error information.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity
|
||||||
func (c *STS) GetCallerIdentity(input *GetCallerIdentityInput) (*GetCallerIdentityOutput, error) {
|
func (c *STS) GetCallerIdentity(input *GetCallerIdentityInput) (*GetCallerIdentityOutput, error) {
|
||||||
req, out := c.GetCallerIdentityRequest(input)
|
req, out := c.GetCallerIdentityRequest(input)
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
|
|
@ -777,7 +777,7 @@ const opGetFederationToken = "GetFederationToken"
|
||||||
// fmt.Println(resp)
|
// fmt.Println(resp)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken
|
||||||
func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *request.Request, output *GetFederationTokenOutput) {
|
func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *request.Request, output *GetFederationTokenOutput) {
|
||||||
op := &request.Operation{
|
op := &request.Operation{
|
||||||
Name: opGetFederationToken,
|
Name: opGetFederationToken,
|
||||||
|
|
@ -899,7 +899,7 @@ func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *re
|
||||||
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
||||||
// in the IAM User Guide.
|
// in the IAM User Guide.
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken
|
||||||
func (c *STS) GetFederationToken(input *GetFederationTokenInput) (*GetFederationTokenOutput, error) {
|
func (c *STS) GetFederationToken(input *GetFederationTokenInput) (*GetFederationTokenOutput, error) {
|
||||||
req, out := c.GetFederationTokenRequest(input)
|
req, out := c.GetFederationTokenRequest(input)
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
|
|
@ -946,7 +946,7 @@ const opGetSessionToken = "GetSessionToken"
|
||||||
// fmt.Println(resp)
|
// fmt.Println(resp)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken
|
||||||
func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.Request, output *GetSessionTokenOutput) {
|
func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.Request, output *GetSessionTokenOutput) {
|
||||||
op := &request.Operation{
|
op := &request.Operation{
|
||||||
Name: opGetSessionToken,
|
Name: opGetSessionToken,
|
||||||
|
|
@ -1027,7 +1027,7 @@ func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.
|
||||||
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
// and Deactivating AWS STS in an AWS Region (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
||||||
// in the IAM User Guide.
|
// in the IAM User Guide.
|
||||||
//
|
//
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken
|
||||||
func (c *STS) GetSessionToken(input *GetSessionTokenInput) (*GetSessionTokenOutput, error) {
|
func (c *STS) GetSessionToken(input *GetSessionTokenInput) (*GetSessionTokenOutput, error) {
|
||||||
req, out := c.GetSessionTokenRequest(input)
|
req, out := c.GetSessionTokenRequest(input)
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
|
|
@ -1049,7 +1049,7 @@ func (c *STS) GetSessionTokenWithContext(ctx aws.Context, input *GetSessionToken
|
||||||
return out, req.Send()
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleRequest
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleRequest
|
||||||
type AssumeRoleInput struct {
|
type AssumeRoleInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1241,7 +1241,7 @@ func (s *AssumeRoleInput) SetTokenCode(v string) *AssumeRoleInput {
|
||||||
|
|
||||||
// Contains the response to a successful AssumeRole request, including temporary
|
// Contains the response to a successful AssumeRole request, including temporary
|
||||||
// AWS credentials that can be used to make AWS requests.
|
// AWS credentials that can be used to make AWS requests.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleResponse
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleResponse
|
||||||
type AssumeRoleOutput struct {
|
type AssumeRoleOutput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1295,7 +1295,7 @@ func (s *AssumeRoleOutput) SetPackedPolicySize(v int64) *AssumeRoleOutput {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAMLRequest
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAMLRequest
|
||||||
type AssumeRoleWithSAMLInput struct {
|
type AssumeRoleWithSAMLInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1436,7 +1436,7 @@ func (s *AssumeRoleWithSAMLInput) SetSAMLAssertion(v string) *AssumeRoleWithSAML
|
||||||
|
|
||||||
// Contains the response to a successful AssumeRoleWithSAML request, including
|
// Contains the response to a successful AssumeRoleWithSAML request, including
|
||||||
// temporary AWS credentials that can be used to make AWS requests.
|
// temporary AWS credentials that can be used to make AWS requests.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAMLResponse
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAMLResponse
|
||||||
type AssumeRoleWithSAMLOutput struct {
|
type AssumeRoleWithSAMLOutput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1548,7 +1548,7 @@ func (s *AssumeRoleWithSAMLOutput) SetSubjectType(v string) *AssumeRoleWithSAMLO
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentityRequest
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentityRequest
|
||||||
type AssumeRoleWithWebIdentityInput struct {
|
type AssumeRoleWithWebIdentityInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1711,7 +1711,7 @@ func (s *AssumeRoleWithWebIdentityInput) SetWebIdentityToken(v string) *AssumeRo
|
||||||
|
|
||||||
// Contains the response to a successful AssumeRoleWithWebIdentity request,
|
// Contains the response to a successful AssumeRoleWithWebIdentity request,
|
||||||
// including temporary AWS credentials that can be used to make AWS requests.
|
// including temporary AWS credentials that can be used to make AWS requests.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentityResponse
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentityResponse
|
||||||
type AssumeRoleWithWebIdentityOutput struct {
|
type AssumeRoleWithWebIdentityOutput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1804,7 +1804,7 @@ func (s *AssumeRoleWithWebIdentityOutput) SetSubjectFromWebIdentityToken(v strin
|
||||||
|
|
||||||
// The identifiers for the temporary security credentials that the operation
|
// The identifiers for the temporary security credentials that the operation
|
||||||
// returns.
|
// returns.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumedRoleUser
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumedRoleUser
|
||||||
type AssumedRoleUser struct {
|
type AssumedRoleUser struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1847,7 +1847,7 @@ func (s *AssumedRoleUser) SetAssumedRoleId(v string) *AssumedRoleUser {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AWS credentials for API authentication.
|
// AWS credentials for API authentication.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/Credentials
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/Credentials
|
||||||
type Credentials struct {
|
type Credentials struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1906,7 +1906,7 @@ func (s *Credentials) SetSessionToken(v string) *Credentials {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessageRequest
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessageRequest
|
||||||
type DecodeAuthorizationMessageInput struct {
|
type DecodeAuthorizationMessageInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1951,7 +1951,7 @@ func (s *DecodeAuthorizationMessageInput) SetEncodedMessage(v string) *DecodeAut
|
||||||
// A document that contains additional information about the authorization status
|
// A document that contains additional information about the authorization status
|
||||||
// of a request from an encoded message that is returned in response to an AWS
|
// of a request from an encoded message that is returned in response to an AWS
|
||||||
// request.
|
// request.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessageResponse
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessageResponse
|
||||||
type DecodeAuthorizationMessageOutput struct {
|
type DecodeAuthorizationMessageOutput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -1976,7 +1976,7 @@ func (s *DecodeAuthorizationMessageOutput) SetDecodedMessage(v string) *DecodeAu
|
||||||
}
|
}
|
||||||
|
|
||||||
// Identifiers for the federated user that is associated with the credentials.
|
// Identifiers for the federated user that is associated with the credentials.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/FederatedUser
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/FederatedUser
|
||||||
type FederatedUser struct {
|
type FederatedUser struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -2017,7 +2017,7 @@ func (s *FederatedUser) SetFederatedUserId(v string) *FederatedUser {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentityRequest
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentityRequest
|
||||||
type GetCallerIdentityInput struct {
|
type GetCallerIdentityInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
}
|
}
|
||||||
|
|
@ -2034,7 +2034,7 @@ func (s GetCallerIdentityInput) GoString() string {
|
||||||
|
|
||||||
// Contains the response to a successful GetCallerIdentity request, including
|
// Contains the response to a successful GetCallerIdentity request, including
|
||||||
// information about the entity making the request.
|
// information about the entity making the request.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentityResponse
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentityResponse
|
||||||
type GetCallerIdentityOutput struct {
|
type GetCallerIdentityOutput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -2080,7 +2080,7 @@ func (s *GetCallerIdentityOutput) SetUserId(v string) *GetCallerIdentityOutput {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationTokenRequest
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationTokenRequest
|
||||||
type GetFederationTokenInput struct {
|
type GetFederationTokenInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -2189,7 +2189,7 @@ func (s *GetFederationTokenInput) SetPolicy(v string) *GetFederationTokenInput {
|
||||||
|
|
||||||
// Contains the response to a successful GetFederationToken request, including
|
// Contains the response to a successful GetFederationToken request, including
|
||||||
// temporary AWS credentials that can be used to make AWS requests.
|
// temporary AWS credentials that can be used to make AWS requests.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationTokenResponse
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationTokenResponse
|
||||||
type GetFederationTokenOutput struct {
|
type GetFederationTokenOutput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -2242,7 +2242,7 @@ func (s *GetFederationTokenOutput) SetPackedPolicySize(v int64) *GetFederationTo
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionTokenRequest
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionTokenRequest
|
||||||
type GetSessionTokenInput struct {
|
type GetSessionTokenInput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
@ -2327,7 +2327,7 @@ func (s *GetSessionTokenInput) SetTokenCode(v string) *GetSessionTokenInput {
|
||||||
|
|
||||||
// Contains the response to a successful GetSessionToken request, including
|
// Contains the response to a successful GetSessionToken request, including
|
||||||
// temporary AWS credentials that can be used to make AWS requests.
|
// temporary AWS credentials that can be used to make AWS requests.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionTokenResponse
|
// See also, https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionTokenResponse
|
||||||
type GetSessionTokenOutput struct {
|
type GetSessionTokenOutput struct {
|
||||||
_ struct{} `type:"structure"`
|
_ struct{} `type:"structure"`
|
||||||
|
|
||||||
|
|
|
||||||
2
vendor/github.com/aws/aws-sdk-go/service/sts/doc.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/service/sts/doc.go
generated
vendored
|
|
@ -56,7 +56,7 @@
|
||||||
//
|
//
|
||||||
// Using the Client
|
// Using the Client
|
||||||
//
|
//
|
||||||
// To AWS Security Token Service with the SDK use the New function to create
|
// To contact AWS Security Token Service with the SDK use the New function to create
|
||||||
// a new service client. With that client you can make API requests to the service.
|
// a new service client. With that client you can make API requests to the service.
|
||||||
// These clients are safe to use concurrently.
|
// These clients are safe to use concurrently.
|
||||||
//
|
//
|
||||||
|
|
|
||||||
6
vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md
generated
vendored
6
vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md
generated
vendored
|
|
@ -1,5 +1,11 @@
|
||||||
## `jwt-go` Version History
|
## `jwt-go` Version History
|
||||||
|
|
||||||
|
#### 3.1.0
|
||||||
|
|
||||||
|
* Improvements to `jwt` command line tool
|
||||||
|
* Added `SkipClaimsValidation` option to `Parser`
|
||||||
|
* Documentation updates
|
||||||
|
|
||||||
#### 3.0.0
|
#### 3.0.0
|
||||||
|
|
||||||
* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code
|
* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code
|
||||||
|
|
|
||||||
3
vendor/github.com/diegomarangoni/gcscache/README.md
generated
vendored
3
vendor/github.com/diegomarangoni/gcscache/README.md
generated
vendored
|
|
@ -1,3 +0,0 @@
|
||||||
# GCS Cache
|
|
||||||
|
|
||||||
Golang cache library that saves objects to Google Cloud Storage (GCS) for usage within [imageproxy](https://github.com/willnorris/imageproxy).
|
|
||||||
112
vendor/github.com/diegomarangoni/gcscache/gcscache.go
generated
vendored
112
vendor/github.com/diegomarangoni/gcscache/gcscache.go
generated
vendored
|
|
@ -1,112 +0,0 @@
|
||||||
package gcscache
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/md5"
|
|
||||||
"encoding/hex"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"cloud.google.com/go/storage"
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"golang.org/x/oauth2/google"
|
|
||||||
"google.golang.org/api/option"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Cache struct {
|
|
||||||
pathPrefix string
|
|
||||||
bucket *storage.BucketHandle
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Cache) Get(key string) (resp []byte, ok bool) {
|
|
||||||
obj := c.bucket.Object(c.url(key))
|
|
||||||
|
|
||||||
rdr, err := obj.NewReader(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
return []byte{}, false
|
|
||||||
}
|
|
||||||
defer rdr.Close()
|
|
||||||
|
|
||||||
resp, err = ioutil.ReadAll(rdr)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("gcscache.Get failed: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return resp, err == nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Cache) Set(key string, resp []byte) {
|
|
||||||
obj := c.bucket.Object(c.url(key))
|
|
||||||
|
|
||||||
contentType := http.DetectContentType(resp)
|
|
||||||
|
|
||||||
w := obj.NewWriter(context.Background())
|
|
||||||
w.ContentType = contentType
|
|
||||||
w.ObjectAttrs.ContentType = contentType
|
|
||||||
|
|
||||||
_, err := w.Write(resp)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("gcscache.Set failed: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = w.Close()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("gcscache.Set failed: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Cache) Delete(key string) {
|
|
||||||
obj := c.bucket.Object(c.url(key))
|
|
||||||
|
|
||||||
err := obj.Delete(context.Background())
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("gcscache.Delete failed: %s", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Cache) url(key string) string {
|
|
||||||
key = cacheKeyToObjectKey(key)
|
|
||||||
if strings.HasSuffix(c.pathPrefix, "/") {
|
|
||||||
return c.pathPrefix + key
|
|
||||||
}
|
|
||||||
return c.pathPrefix + "/" + key
|
|
||||||
}
|
|
||||||
|
|
||||||
func cacheKeyToObjectKey(key string) string {
|
|
||||||
h := md5.New()
|
|
||||||
io.WriteString(h, key)
|
|
||||||
return hex.EncodeToString(h.Sum(nil))
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(bucketURL string) *Cache {
|
|
||||||
cfg, err := google.JWTConfigFromJSON([]byte(os.Getenv("GCP_PRIVATE_KEY")), storage.ScopeReadWrite)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
ts := cfg.TokenSource(context.Background())
|
|
||||||
opt := option.WithTokenSource(ts)
|
|
||||||
|
|
||||||
client, err := storage.NewClient(context.Background(), opt)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
r := regexp.MustCompile("gcs://([^/]+)(/(.+)?)?$")
|
|
||||||
if !r.MatchString(bucketURL) {
|
|
||||||
panic("Invalid bucket string format. Must match: gcs://bucket-name/path/prefix")
|
|
||||||
}
|
|
||||||
|
|
||||||
match := r.FindStringSubmatch(bucketURL)
|
|
||||||
|
|
||||||
bucketName := match[1]
|
|
||||||
pathPrefix := match[3]
|
|
||||||
|
|
||||||
return &Cache{
|
|
||||||
pathPrefix: pathPrefix,
|
|
||||||
bucket: client.Bucket(bucketName),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
18
vendor/github.com/disintegration/imaging/adjust.go
generated
vendored
18
vendor/github.com/disintegration/imaging/adjust.go
generated
vendored
|
|
@ -10,17 +10,17 @@ import (
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
//
|
//
|
||||||
// dstImage = imaging.AdjustFunc(
|
// dstImage = imaging.AdjustFunc(
|
||||||
// srcImage,
|
// srcImage,
|
||||||
// func(c color.NRGBA) color.NRGBA {
|
// func(c color.NRGBA) color.NRGBA {
|
||||||
// // shift the red channel by 16
|
// // shift the red channel by 16
|
||||||
// r := int(c.R) + 16
|
// r := int(c.R) + 16
|
||||||
// if r > 255 {
|
// if r > 255 {
|
||||||
// r = 255
|
// r = 255
|
||||||
// }
|
// }
|
||||||
// return color.NRGBA{uint8(r), c.G, c.B, c.A}
|
// return color.NRGBA{uint8(r), c.G, c.B, c.A}
|
||||||
// }
|
// }
|
||||||
// )
|
// )
|
||||||
//
|
//
|
||||||
func AdjustFunc(img image.Image, fn func(c color.NRGBA) color.NRGBA) *image.NRGBA {
|
func AdjustFunc(img image.Image, fn func(c color.NRGBA) color.NRGBA) *image.NRGBA {
|
||||||
src := toNRGBA(img)
|
src := toNRGBA(img)
|
||||||
|
|
|
||||||
312
vendor/github.com/disintegration/imaging/clone.go
generated
vendored
Normal file
312
vendor/github.com/disintegration/imaging/clone.go
generated
vendored
Normal file
|
|
@ -0,0 +1,312 @@
|
||||||
|
package imaging
|
||||||
|
|
||||||
|
import (
|
||||||
|
"image"
|
||||||
|
"image/color"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Clone returns a copy of the given image.
|
||||||
|
func Clone(img image.Image) *image.NRGBA {
|
||||||
|
dstBounds := img.Bounds().Sub(img.Bounds().Min)
|
||||||
|
dst := image.NewNRGBA(dstBounds)
|
||||||
|
|
||||||
|
switch src := img.(type) {
|
||||||
|
case *image.NRGBA:
|
||||||
|
copyNRGBA(dst, src)
|
||||||
|
case *image.NRGBA64:
|
||||||
|
copyNRGBA64(dst, src)
|
||||||
|
case *image.RGBA:
|
||||||
|
copyRGBA(dst, src)
|
||||||
|
case *image.RGBA64:
|
||||||
|
copyRGBA64(dst, src)
|
||||||
|
case *image.Gray:
|
||||||
|
copyGray(dst, src)
|
||||||
|
case *image.Gray16:
|
||||||
|
copyGray16(dst, src)
|
||||||
|
case *image.YCbCr:
|
||||||
|
copyYCbCr(dst, src)
|
||||||
|
case *image.Paletted:
|
||||||
|
copyPaletted(dst, src)
|
||||||
|
default:
|
||||||
|
copyImage(dst, src)
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyNRGBA(dst *image.NRGBA, src *image.NRGBA) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
rowSize := dstW * 4
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
||||||
|
copy(dst.Pix[di:di+rowSize], src.Pix[si:si+rowSize])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyNRGBA64(dst *image.NRGBA, src *image.NRGBA64) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
dst.Pix[di+0] = src.Pix[si+0]
|
||||||
|
dst.Pix[di+1] = src.Pix[si+2]
|
||||||
|
dst.Pix[di+2] = src.Pix[si+4]
|
||||||
|
dst.Pix[di+3] = src.Pix[si+6]
|
||||||
|
di += 4
|
||||||
|
si += 8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyRGBA(dst *image.NRGBA, src *image.RGBA) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
a := src.Pix[si+3]
|
||||||
|
dst.Pix[di+3] = a
|
||||||
|
|
||||||
|
switch a {
|
||||||
|
case 0:
|
||||||
|
dst.Pix[di+0] = 0
|
||||||
|
dst.Pix[di+1] = 0
|
||||||
|
dst.Pix[di+2] = 0
|
||||||
|
case 0xff:
|
||||||
|
dst.Pix[di+0] = src.Pix[si+0]
|
||||||
|
dst.Pix[di+1] = src.Pix[si+1]
|
||||||
|
dst.Pix[di+2] = src.Pix[si+2]
|
||||||
|
default:
|
||||||
|
var tmp uint16
|
||||||
|
tmp = uint16(src.Pix[si+0]) * 0xff / uint16(a)
|
||||||
|
dst.Pix[di+0] = uint8(tmp)
|
||||||
|
tmp = uint16(src.Pix[si+1]) * 0xff / uint16(a)
|
||||||
|
dst.Pix[di+1] = uint8(tmp)
|
||||||
|
tmp = uint16(src.Pix[si+2]) * 0xff / uint16(a)
|
||||||
|
dst.Pix[di+2] = uint8(tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
di += 4
|
||||||
|
si += 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyRGBA64(dst *image.NRGBA, src *image.RGBA64) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
a := src.Pix[si+6]
|
||||||
|
dst.Pix[di+3] = a
|
||||||
|
|
||||||
|
switch a {
|
||||||
|
case 0:
|
||||||
|
dst.Pix[di+0] = 0
|
||||||
|
dst.Pix[di+1] = 0
|
||||||
|
dst.Pix[di+2] = 0
|
||||||
|
case 0xff:
|
||||||
|
dst.Pix[di+0] = src.Pix[si+0]
|
||||||
|
dst.Pix[di+1] = src.Pix[si+2]
|
||||||
|
dst.Pix[di+2] = src.Pix[si+4]
|
||||||
|
default:
|
||||||
|
var tmp uint16
|
||||||
|
tmp = uint16(src.Pix[si+0]) * 0xff / uint16(a)
|
||||||
|
dst.Pix[di+0] = uint8(tmp)
|
||||||
|
tmp = uint16(src.Pix[si+2]) * 0xff / uint16(a)
|
||||||
|
dst.Pix[di+1] = uint8(tmp)
|
||||||
|
tmp = uint16(src.Pix[si+4]) * 0xff / uint16(a)
|
||||||
|
dst.Pix[di+2] = uint8(tmp)
|
||||||
|
}
|
||||||
|
|
||||||
|
di += 4
|
||||||
|
si += 8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyGray(dst *image.NRGBA, src *image.Gray) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
c := src.Pix[si]
|
||||||
|
dst.Pix[di+0] = c
|
||||||
|
dst.Pix[di+1] = c
|
||||||
|
dst.Pix[di+2] = c
|
||||||
|
dst.Pix[di+3] = 0xff
|
||||||
|
di += 4
|
||||||
|
si++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyGray16(dst *image.NRGBA, src *image.Gray16) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
c := src.Pix[si]
|
||||||
|
dst.Pix[di+0] = c
|
||||||
|
dst.Pix[di+1] = c
|
||||||
|
dst.Pix[di+2] = c
|
||||||
|
dst.Pix[di+3] = 0xff
|
||||||
|
di += 4
|
||||||
|
si += 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyYCbCr(dst *image.NRGBA, src *image.YCbCr) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
srcY := srcMinY + dstY
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
srcX := srcMinX + dstX
|
||||||
|
|
||||||
|
siy := (srcY-srcMinY)*src.YStride + (srcX - srcMinX)
|
||||||
|
|
||||||
|
var sic int
|
||||||
|
switch src.SubsampleRatio {
|
||||||
|
case image.YCbCrSubsampleRatio444:
|
||||||
|
sic = (srcY-srcMinY)*src.CStride + (srcX - srcMinX)
|
||||||
|
case image.YCbCrSubsampleRatio422:
|
||||||
|
sic = (srcY-srcMinY)*src.CStride + (srcX/2 - srcMinX/2)
|
||||||
|
case image.YCbCrSubsampleRatio420:
|
||||||
|
sic = (srcY/2-srcMinY/2)*src.CStride + (srcX/2 - srcMinX/2)
|
||||||
|
case image.YCbCrSubsampleRatio440:
|
||||||
|
sic = (srcY/2-srcMinY/2)*src.CStride + (srcX - srcMinX)
|
||||||
|
default:
|
||||||
|
sic = src.COffset(srcX, srcY)
|
||||||
|
}
|
||||||
|
|
||||||
|
y := int32(src.Y[siy])
|
||||||
|
cb := int32(src.Cb[sic]) - 128
|
||||||
|
cr := int32(src.Cr[sic]) - 128
|
||||||
|
|
||||||
|
r := (y<<16 + 91881*cr + 1<<15) >> 16
|
||||||
|
if r > 255 {
|
||||||
|
r = 255
|
||||||
|
} else if r < 0 {
|
||||||
|
r = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
g := (y<<16 - 22554*cb - 46802*cr + 1<<15) >> 16
|
||||||
|
if g > 255 {
|
||||||
|
g = 255
|
||||||
|
} else if g < 0 {
|
||||||
|
g = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
b := (y<<16 + 116130*cb + 1<<15) >> 16
|
||||||
|
if b > 255 {
|
||||||
|
b = 255
|
||||||
|
} else if b < 0 {
|
||||||
|
b = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
dst.Pix[di+0] = uint8(r)
|
||||||
|
dst.Pix[di+1] = uint8(g)
|
||||||
|
dst.Pix[di+2] = uint8(b)
|
||||||
|
dst.Pix[di+3] = 255
|
||||||
|
|
||||||
|
di += 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyPaletted(dst *image.NRGBA, src *image.Paletted) {
|
||||||
|
srcMinX := src.Rect.Min.X
|
||||||
|
srcMinY := src.Rect.Min.Y
|
||||||
|
dstW := dst.Rect.Dx()
|
||||||
|
dstH := dst.Rect.Dy()
|
||||||
|
plen := len(src.Palette)
|
||||||
|
pnew := make([]color.NRGBA, plen)
|
||||||
|
for i := 0; i < plen; i++ {
|
||||||
|
pnew[i] = color.NRGBAModel.Convert(src.Palette[i]).(color.NRGBA)
|
||||||
|
}
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
c := pnew[src.Pix[si]]
|
||||||
|
dst.Pix[di+0] = c.R
|
||||||
|
dst.Pix[di+1] = c.G
|
||||||
|
dst.Pix[di+2] = c.B
|
||||||
|
dst.Pix[di+3] = c.A
|
||||||
|
di += 4
|
||||||
|
si++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func copyImage(dst *image.NRGBA, src image.Image) {
|
||||||
|
srcMinX := src.Bounds().Min.X
|
||||||
|
srcMinY := src.Bounds().Min.Y
|
||||||
|
dstW := dst.Bounds().Dx()
|
||||||
|
dstH := dst.Bounds().Dy()
|
||||||
|
parallel(dstH, func(partStart, partEnd int) {
|
||||||
|
for dstY := partStart; dstY < partEnd; dstY++ {
|
||||||
|
di := dst.PixOffset(0, dstY)
|
||||||
|
for dstX := 0; dstX < dstW; dstX++ {
|
||||||
|
c := color.NRGBAModel.Convert(src.At(srcMinX+dstX, srcMinY+dstY)).(color.NRGBA)
|
||||||
|
dst.Pix[di+0] = c.R
|
||||||
|
dst.Pix[di+1] = c.G
|
||||||
|
dst.Pix[di+2] = c.B
|
||||||
|
dst.Pix[di+3] = c.A
|
||||||
|
di += 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// toNRGBA converts any image type to *image.NRGBA with min-point at (0, 0).
|
||||||
|
func toNRGBA(img image.Image) *image.NRGBA {
|
||||||
|
if img, ok := img.(*image.NRGBA); ok && img.Bounds().Min.Eq(image.ZP) {
|
||||||
|
return img
|
||||||
|
}
|
||||||
|
return Clone(img)
|
||||||
|
}
|
||||||
4
vendor/github.com/disintegration/imaging/effects.go
generated
vendored
4
vendor/github.com/disintegration/imaging/effects.go
generated
vendored
|
|
@ -14,7 +14,7 @@ func gaussianBlurKernel(x, sigma float64) float64 {
|
||||||
//
|
//
|
||||||
// Usage example:
|
// Usage example:
|
||||||
//
|
//
|
||||||
// dstImage := imaging.Blur(srcImage, 3.5)
|
// dstImage := imaging.Blur(srcImage, 3.5)
|
||||||
//
|
//
|
||||||
func Blur(img image.Image, sigma float64) *image.NRGBA {
|
func Blur(img image.Image, sigma float64) *image.NRGBA {
|
||||||
if sigma <= 0 {
|
if sigma <= 0 {
|
||||||
|
|
@ -138,7 +138,7 @@ func blurVertical(src *image.NRGBA, kernel []float64) *image.NRGBA {
|
||||||
//
|
//
|
||||||
// Usage example:
|
// Usage example:
|
||||||
//
|
//
|
||||||
// dstImage := imaging.Sharpen(srcImage, 3.5)
|
// dstImage := imaging.Sharpen(srcImage, 3.5)
|
||||||
//
|
//
|
||||||
func Sharpen(img image.Image, sigma float64) *image.NRGBA {
|
func Sharpen(img image.Image, sigma float64) *image.NRGBA {
|
||||||
if sigma <= 0 {
|
if sigma <= 0 {
|
||||||
|
|
|
||||||
256
vendor/github.com/disintegration/imaging/helpers.go
generated
vendored
256
vendor/github.com/disintegration/imaging/helpers.go
generated
vendored
|
|
@ -76,8 +76,32 @@ func Open(filename string) (image.Image, error) {
|
||||||
return img, err
|
return img, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type encodeConfig struct {
|
||||||
|
jpegQuality int
|
||||||
|
}
|
||||||
|
|
||||||
|
var defaultEncodeConfig = encodeConfig{
|
||||||
|
jpegQuality: 95,
|
||||||
|
}
|
||||||
|
|
||||||
|
// EncodeOption sets an optional parameter for the Encode and Save functions.
|
||||||
|
type EncodeOption func(*encodeConfig)
|
||||||
|
|
||||||
|
// JPEGQuality returns an EncodeOption that sets the output JPEG quality.
|
||||||
|
// Quality ranges from 1 to 100 inclusive, higher is better. Default is 95.
|
||||||
|
func JPEGQuality(quality int) EncodeOption {
|
||||||
|
return func(c *encodeConfig) {
|
||||||
|
c.jpegQuality = quality
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Encode writes the image img to w in the specified format (JPEG, PNG, GIF, TIFF or BMP).
|
// Encode writes the image img to w in the specified format (JPEG, PNG, GIF, TIFF or BMP).
|
||||||
func Encode(w io.Writer, img image.Image, format Format) error {
|
func Encode(w io.Writer, img image.Image, format Format, opts ...EncodeOption) error {
|
||||||
|
cfg := defaultEncodeConfig
|
||||||
|
for _, option := range opts {
|
||||||
|
option(&cfg)
|
||||||
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
switch format {
|
switch format {
|
||||||
case JPEG:
|
case JPEG:
|
||||||
|
|
@ -92,9 +116,9 @@ func Encode(w io.Writer, img image.Image, format Format) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if rgba != nil {
|
if rgba != nil {
|
||||||
err = jpeg.Encode(w, rgba, &jpeg.Options{Quality: 95})
|
err = jpeg.Encode(w, rgba, &jpeg.Options{Quality: cfg.jpegQuality})
|
||||||
} else {
|
} else {
|
||||||
err = jpeg.Encode(w, img, &jpeg.Options{Quality: 95})
|
err = jpeg.Encode(w, img, &jpeg.Options{Quality: cfg.jpegQuality})
|
||||||
}
|
}
|
||||||
|
|
||||||
case PNG:
|
case PNG:
|
||||||
|
|
@ -113,7 +137,16 @@ func Encode(w io.Writer, img image.Image, format Format) error {
|
||||||
|
|
||||||
// Save saves the image to file with the specified filename.
|
// Save saves the image to file with the specified filename.
|
||||||
// The format is determined from the filename extension: "jpg" (or "jpeg"), "png", "gif", "tif" (or "tiff") and "bmp" are supported.
|
// The format is determined from the filename extension: "jpg" (or "jpeg"), "png", "gif", "tif" (or "tiff") and "bmp" are supported.
|
||||||
func Save(img image.Image, filename string) (err error) {
|
//
|
||||||
|
// Examples:
|
||||||
|
//
|
||||||
|
// // Save the image as PNG.
|
||||||
|
// err := imaging.Save(img, "out.png")
|
||||||
|
//
|
||||||
|
// // Save the image as JPEG with optional quality parameter set to 80.
|
||||||
|
// err := imaging.Save(img, "out.jpg", imaging.JPEGQuality(80))
|
||||||
|
//
|
||||||
|
func Save(img image.Image, filename string, opts ...EncodeOption) (err error) {
|
||||||
formats := map[string]Format{
|
formats := map[string]Format{
|
||||||
".jpg": JPEG,
|
".jpg": JPEG,
|
||||||
".jpeg": JPEG,
|
".jpeg": JPEG,
|
||||||
|
|
@ -136,7 +169,7 @@ func Save(img image.Image, filename string) (err error) {
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
return Encode(file, img, f)
|
return Encode(file, img, f, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new image with the specified width and height, and fills it with the specified color.
|
// New creates a new image with the specified width and height, and fills it with the specified color.
|
||||||
|
|
@ -165,216 +198,3 @@ func New(width, height int, fillColor color.Color) *image.NRGBA {
|
||||||
|
|
||||||
return dst
|
return dst
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clone returns a copy of the given image.
|
|
||||||
func Clone(img image.Image) *image.NRGBA {
|
|
||||||
srcBounds := img.Bounds()
|
|
||||||
srcMinX := srcBounds.Min.X
|
|
||||||
srcMinY := srcBounds.Min.Y
|
|
||||||
|
|
||||||
dstBounds := srcBounds.Sub(srcBounds.Min)
|
|
||||||
dstW := dstBounds.Dx()
|
|
||||||
dstH := dstBounds.Dy()
|
|
||||||
dst := image.NewNRGBA(dstBounds)
|
|
||||||
|
|
||||||
switch src := img.(type) {
|
|
||||||
|
|
||||||
case *image.NRGBA:
|
|
||||||
rowSize := srcBounds.Dx() * 4
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
|
||||||
copy(dst.Pix[di:di+rowSize], src.Pix[si:si+rowSize])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
case *image.NRGBA64:
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
dst.Pix[di+0] = src.Pix[si+0]
|
|
||||||
dst.Pix[di+1] = src.Pix[si+2]
|
|
||||||
dst.Pix[di+2] = src.Pix[si+4]
|
|
||||||
dst.Pix[di+3] = src.Pix[si+6]
|
|
||||||
di += 4
|
|
||||||
si += 8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
case *image.RGBA:
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
a := src.Pix[si+3]
|
|
||||||
dst.Pix[di+3] = a
|
|
||||||
|
|
||||||
switch a {
|
|
||||||
case 0:
|
|
||||||
dst.Pix[di+0] = 0
|
|
||||||
dst.Pix[di+1] = 0
|
|
||||||
dst.Pix[di+2] = 0
|
|
||||||
case 0xff:
|
|
||||||
dst.Pix[di+0] = src.Pix[si+0]
|
|
||||||
dst.Pix[di+1] = src.Pix[si+1]
|
|
||||||
dst.Pix[di+2] = src.Pix[si+2]
|
|
||||||
default:
|
|
||||||
var tmp uint16
|
|
||||||
tmp = uint16(src.Pix[si+0]) * 0xff / uint16(a)
|
|
||||||
dst.Pix[di+0] = uint8(tmp)
|
|
||||||
tmp = uint16(src.Pix[si+1]) * 0xff / uint16(a)
|
|
||||||
dst.Pix[di+1] = uint8(tmp)
|
|
||||||
tmp = uint16(src.Pix[si+2]) * 0xff / uint16(a)
|
|
||||||
dst.Pix[di+2] = uint8(tmp)
|
|
||||||
}
|
|
||||||
|
|
||||||
di += 4
|
|
||||||
si += 4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
case *image.RGBA64:
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
a := src.Pix[si+6]
|
|
||||||
dst.Pix[di+3] = a
|
|
||||||
|
|
||||||
switch a {
|
|
||||||
case 0:
|
|
||||||
dst.Pix[di+0] = 0
|
|
||||||
dst.Pix[di+1] = 0
|
|
||||||
dst.Pix[di+2] = 0
|
|
||||||
case 0xff:
|
|
||||||
dst.Pix[di+0] = src.Pix[si+0]
|
|
||||||
dst.Pix[di+1] = src.Pix[si+2]
|
|
||||||
dst.Pix[di+2] = src.Pix[si+4]
|
|
||||||
default:
|
|
||||||
var tmp uint16
|
|
||||||
tmp = uint16(src.Pix[si+0]) * 0xff / uint16(a)
|
|
||||||
dst.Pix[di+0] = uint8(tmp)
|
|
||||||
tmp = uint16(src.Pix[si+2]) * 0xff / uint16(a)
|
|
||||||
dst.Pix[di+1] = uint8(tmp)
|
|
||||||
tmp = uint16(src.Pix[si+4]) * 0xff / uint16(a)
|
|
||||||
dst.Pix[di+2] = uint8(tmp)
|
|
||||||
}
|
|
||||||
|
|
||||||
di += 4
|
|
||||||
si += 8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
case *image.Gray:
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
c := src.Pix[si]
|
|
||||||
dst.Pix[di+0] = c
|
|
||||||
dst.Pix[di+1] = c
|
|
||||||
dst.Pix[di+2] = c
|
|
||||||
dst.Pix[di+3] = 0xff
|
|
||||||
di += 4
|
|
||||||
si += 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
case *image.Gray16:
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
c := src.Pix[si]
|
|
||||||
dst.Pix[di+0] = c
|
|
||||||
dst.Pix[di+1] = c
|
|
||||||
dst.Pix[di+2] = c
|
|
||||||
dst.Pix[di+3] = 0xff
|
|
||||||
di += 4
|
|
||||||
si += 2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
case *image.YCbCr:
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
srcX := srcMinX + dstX
|
|
||||||
srcY := srcMinY + dstY
|
|
||||||
siy := src.YOffset(srcX, srcY)
|
|
||||||
sic := src.COffset(srcX, srcY)
|
|
||||||
r, g, b := color.YCbCrToRGB(src.Y[siy], src.Cb[sic], src.Cr[sic])
|
|
||||||
dst.Pix[di+0] = r
|
|
||||||
dst.Pix[di+1] = g
|
|
||||||
dst.Pix[di+2] = b
|
|
||||||
dst.Pix[di+3] = 0xff
|
|
||||||
di += 4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
case *image.Paletted:
|
|
||||||
plen := len(src.Palette)
|
|
||||||
pnew := make([]color.NRGBA, plen)
|
|
||||||
for i := 0; i < plen; i++ {
|
|
||||||
pnew[i] = color.NRGBAModel.Convert(src.Palette[i]).(color.NRGBA)
|
|
||||||
}
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
si := src.PixOffset(srcMinX, srcMinY+dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
c := pnew[src.Pix[si]]
|
|
||||||
dst.Pix[di+0] = c.R
|
|
||||||
dst.Pix[di+1] = c.G
|
|
||||||
dst.Pix[di+2] = c.B
|
|
||||||
dst.Pix[di+3] = c.A
|
|
||||||
di += 4
|
|
||||||
si += 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
default:
|
|
||||||
parallel(dstH, func(partStart, partEnd int) {
|
|
||||||
for dstY := partStart; dstY < partEnd; dstY++ {
|
|
||||||
di := dst.PixOffset(0, dstY)
|
|
||||||
for dstX := 0; dstX < dstW; dstX++ {
|
|
||||||
c := color.NRGBAModel.Convert(img.At(srcMinX+dstX, srcMinY+dstY)).(color.NRGBA)
|
|
||||||
dst.Pix[di+0] = c.R
|
|
||||||
dst.Pix[di+1] = c.G
|
|
||||||
dst.Pix[di+2] = c.B
|
|
||||||
dst.Pix[di+3] = c.A
|
|
||||||
di += 4
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return dst
|
|
||||||
}
|
|
||||||
|
|
||||||
// toNRGBA converts any image type to *image.NRGBA with min-point at (0, 0).
|
|
||||||
func toNRGBA(img image.Image) *image.NRGBA {
|
|
||||||
srcBounds := img.Bounds()
|
|
||||||
if srcBounds.Min.X == 0 && srcBounds.Min.Y == 0 {
|
|
||||||
if src0, ok := img.(*image.NRGBA); ok {
|
|
||||||
return src0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Clone(img)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
2
vendor/github.com/disintegration/imaging/histogram.go
generated
vendored
2
vendor/github.com/disintegration/imaging/histogram.go
generated
vendored
|
|
@ -28,7 +28,7 @@ func Histogram(img image.Image) [256]float64 {
|
||||||
g := src.Pix[i+1]
|
g := src.Pix[i+1]
|
||||||
b := src.Pix[i+2]
|
b := src.Pix[i+2]
|
||||||
|
|
||||||
var y float32 = 0.299*float32(r) + 0.587*float32(g) + 0.114*float32(b)
|
y := 0.299*float32(r) + 0.587*float32(g) + 0.114*float32(b)
|
||||||
|
|
||||||
histogram[int(y+0.5)]++
|
histogram[int(y+0.5)]++
|
||||||
total++
|
total++
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue