Merge pull request #2455 from sargun/make-walk-faster
s3: improve walk performance
This commit is contained in:
commit
5cb406d511
92 changed files with 8973 additions and 2179 deletions
|
@ -88,13 +88,12 @@ func (bs *blobStore) Put(ctx context.Context, mediaType string, p []byte) (distr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *blobStore) Enumerate(ctx context.Context, ingester func(dgst digest.Digest) error) error {
|
func (bs *blobStore) Enumerate(ctx context.Context, ingester func(dgst digest.Digest) error) error {
|
||||||
|
|
||||||
specPath, err := pathFor(blobsPathSpec{})
|
specPath, err := pathFor(blobsPathSpec{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Walk(ctx, bs.driver, specPath, func(fileInfo driver.FileInfo) error {
|
return bs.driver.Walk(ctx, specPath, func(fileInfo driver.FileInfo) error {
|
||||||
// skip directories
|
// skip directories
|
||||||
if fileInfo.IsDir() {
|
if fileInfo.IsDir() {
|
||||||
return nil
|
return nil
|
||||||
|
@ -114,7 +113,6 @@ func (bs *blobStore) Enumerate(ctx context.Context, ingester func(dgst digest.Di
|
||||||
|
|
||||||
return ingester(digest)
|
return ingester(digest)
|
||||||
})
|
})
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// path returns the canonical path for the blob identified by digest. The blob
|
// path returns the canonical path for the blob identified by digest. The blob
|
||||||
|
|
|
@ -10,14 +10,11 @@ import (
|
||||||
"github.com/docker/distribution/registry/storage/driver"
|
"github.com/docker/distribution/registry/storage/driver"
|
||||||
)
|
)
|
||||||
|
|
||||||
// errFinishedWalk signals an early exit to the walk when the current query
|
|
||||||
// is satisfied.
|
|
||||||
var errFinishedWalk = errors.New("finished walk")
|
|
||||||
|
|
||||||
// Returns a list, or partial list, of repositories in the registry.
|
// Returns a list, or partial list, of repositories in the registry.
|
||||||
// Because it's a quite expensive operation, it should only be used when building up
|
// Because it's a quite expensive operation, it should only be used when building up
|
||||||
// an initial set of repositories.
|
// an initial set of repositories.
|
||||||
func (reg *registry) Repositories(ctx context.Context, repos []string, last string) (n int, err error) {
|
func (reg *registry) Repositories(ctx context.Context, repos []string, last string) (n int, err error) {
|
||||||
|
var finishedWalk bool
|
||||||
var foundRepos []string
|
var foundRepos []string
|
||||||
|
|
||||||
if len(repos) == 0 {
|
if len(repos) == 0 {
|
||||||
|
@ -29,7 +26,7 @@ func (reg *registry) Repositories(ctx context.Context, repos []string, last stri
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Walk(ctx, reg.blobStore.driver, root, func(fileInfo driver.FileInfo) error {
|
err = reg.blobStore.driver.Walk(ctx, root, func(fileInfo driver.FileInfo) error {
|
||||||
err := handleRepository(fileInfo, root, last, func(repoPath string) error {
|
err := handleRepository(fileInfo, root, last, func(repoPath string) error {
|
||||||
foundRepos = append(foundRepos, repoPath)
|
foundRepos = append(foundRepos, repoPath)
|
||||||
return nil
|
return nil
|
||||||
|
@ -40,7 +37,8 @@ func (reg *registry) Repositories(ctx context.Context, repos []string, last stri
|
||||||
|
|
||||||
// if we've filled our array, no need to walk any further
|
// if we've filled our array, no need to walk any further
|
||||||
if len(foundRepos) == len(repos) {
|
if len(foundRepos) == len(repos) {
|
||||||
return errFinishedWalk
|
finishedWalk = true
|
||||||
|
return driver.ErrSkipDir
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -48,14 +46,11 @@ func (reg *registry) Repositories(ctx context.Context, repos []string, last stri
|
||||||
|
|
||||||
n = copy(repos, foundRepos)
|
n = copy(repos, foundRepos)
|
||||||
|
|
||||||
switch err {
|
if err != nil {
|
||||||
case nil:
|
return n, err
|
||||||
// nil means that we completed walk and didn't fill buffer. No more
|
} else if !finishedWalk {
|
||||||
// records are available.
|
// We didn't fill buffer. No more records are available.
|
||||||
err = io.EOF
|
return n, io.EOF
|
||||||
case errFinishedWalk:
|
|
||||||
// more records are available.
|
|
||||||
err = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return n, err
|
return n, err
|
||||||
|
@ -68,7 +63,7 @@ func (reg *registry) Enumerate(ctx context.Context, ingester func(string) error)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Walk(ctx, reg.blobStore.driver, root, func(fileInfo driver.FileInfo) error {
|
err = reg.blobStore.driver.Walk(ctx, root, func(fileInfo driver.FileInfo) error {
|
||||||
return handleRepository(fileInfo, root, "", ingester)
|
return handleRepository(fileInfo, root, "", ingester)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -144,9 +139,9 @@ func handleRepository(fileInfo driver.FileInfo, root, last string, fn func(repoP
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ErrSkipDir
|
return driver.ErrSkipDir
|
||||||
} else if strings.HasPrefix(file, "_") {
|
} else if strings.HasPrefix(file, "_") {
|
||||||
return ErrSkipDir
|
return driver.ErrSkipDir
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -336,6 +336,12 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
return d.client.GetBlobSASURI(d.container, path, expiresTime, "r")
|
return d.client.GetBlobSASURI(d.container, path, expiresTime, "r")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
return storagedriver.WalkFallback(ctx, d, path, f)
|
||||||
|
}
|
||||||
|
|
||||||
// directDescendants will find direct descendants (blobs or virtual containers)
|
// directDescendants will find direct descendants (blobs or virtual containers)
|
||||||
// of from list of blob paths and will return their full paths. Elements in blobs
|
// of from list of blob paths and will return their full paths. Elements in blobs
|
||||||
// list must be prefixed with a "/" and
|
// list must be prefixed with a "/" and
|
||||||
|
|
|
@ -197,3 +197,15 @@ func (base *Base) URLFor(ctx context.Context, path string, options map[string]in
|
||||||
str, e := base.StorageDriver.URLFor(ctx, path, options)
|
str, e := base.StorageDriver.URLFor(ctx, path, options)
|
||||||
return str, base.setDriverName(e)
|
return str, base.setDriverName(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk wraps Walk of underlying storage driver.
|
||||||
|
func (base *Base) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
ctx, done := dcontext.WithTrace(ctx)
|
||||||
|
defer done("%s.Walk(%q)", base.Name(), path)
|
||||||
|
|
||||||
|
if !storagedriver.PathRegexp.MatchString(path) && path != "/" {
|
||||||
|
return storagedriver.InvalidPathError{Path: path, DriverName: base.StorageDriver.Name()}
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.setDriverName(base.StorageDriver.Walk(ctx, path, f))
|
||||||
|
}
|
||||||
|
|
|
@ -315,6 +315,12 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
return "", storagedriver.ErrUnsupportedMethod{}
|
return "", storagedriver.ErrUnsupportedMethod{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
return storagedriver.WalkFallback(ctx, d, path, f)
|
||||||
|
}
|
||||||
|
|
||||||
// fullPath returns the absolute path of a key within the Driver's storage.
|
// fullPath returns the absolute path of a key within the Driver's storage.
|
||||||
func (d *driver) fullPath(subPath string) string {
|
func (d *driver) fullPath(subPath string) string {
|
||||||
return path.Join(d.rootDirectory, subPath)
|
return path.Join(d.rootDirectory, subPath)
|
||||||
|
|
|
@ -779,6 +779,12 @@ func (d *driver) URLFor(context context.Context, path string, options map[string
|
||||||
return storage.SignedURL(d.bucket, name, opts)
|
return storage.SignedURL(d.bucket, name, opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
return storagedriver.WalkFallback(ctx, d, path, f)
|
||||||
|
}
|
||||||
|
|
||||||
func startSession(client *http.Client, bucket string, name string) (uri string, err error) {
|
func startSession(client *http.Client, bucket string, name string) (uri string, err error) {
|
||||||
u := &url.URL{
|
u := &url.URL{
|
||||||
Scheme: "https",
|
Scheme: "https",
|
||||||
|
|
|
@ -240,6 +240,12 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
return "", storagedriver.ErrUnsupportedMethod{}
|
return "", storagedriver.ErrUnsupportedMethod{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
return storagedriver.WalkFallback(ctx, d, path, f)
|
||||||
|
}
|
||||||
|
|
||||||
type writer struct {
|
type writer struct {
|
||||||
d *driver
|
d *driver
|
||||||
f *file
|
f *file
|
||||||
|
|
|
@ -479,6 +479,12 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
return signedURL, nil
|
return signedURL, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
return storagedriver.WalkFallback(ctx, d, path, f)
|
||||||
|
}
|
||||||
|
|
||||||
func (d *driver) ossPath(path string) string {
|
func (d *driver) ossPath(path string) string {
|
||||||
return strings.TrimLeft(strings.TrimRight(d.RootDirectory, "/")+path, "/")
|
return strings.TrimLeft(strings.TrimRight(d.RootDirectory, "/")+path, "/")
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/aws/session"
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
"github.com/aws/aws-sdk-go/service/s3"
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
|
|
||||||
|
dcontext "github.com/docker/distribution/context"
|
||||||
"github.com/docker/distribution/registry/client/transport"
|
"github.com/docker/distribution/registry/client/transport"
|
||||||
storagedriver "github.com/docker/distribution/registry/storage/driver"
|
storagedriver "github.com/docker/distribution/registry/storage/driver"
|
||||||
"github.com/docker/distribution/registry/storage/driver/base"
|
"github.com/docker/distribution/registry/storage/driver/base"
|
||||||
|
@ -874,6 +875,136 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
return req.Presign(expiresIn)
|
return req.Presign(expiresIn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, from string, f storagedriver.WalkFn) error {
|
||||||
|
path := from
|
||||||
|
if !strings.HasSuffix(path, "/") {
|
||||||
|
path = path + "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
prefix := ""
|
||||||
|
if d.s3Path("") == "" {
|
||||||
|
prefix = "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
var objectCount int64
|
||||||
|
if err := d.doWalk(ctx, &objectCount, d.s3Path(path), prefix, f); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// S3 doesn't have the concept of empty directories, so it'll return path not found if there are no objects
|
||||||
|
if objectCount == 0 {
|
||||||
|
return storagedriver.PathNotFoundError{Path: from}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type walkInfoContainer struct {
|
||||||
|
storagedriver.FileInfoFields
|
||||||
|
prefix *string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Path provides the full path of the target of this file info.
|
||||||
|
func (wi walkInfoContainer) Path() string {
|
||||||
|
return wi.FileInfoFields.Path
|
||||||
|
}
|
||||||
|
|
||||||
|
// Size returns current length in bytes of the file. The return value can
|
||||||
|
// be used to write to the end of the file at path. The value is
|
||||||
|
// meaningless if IsDir returns true.
|
||||||
|
func (wi walkInfoContainer) Size() int64 {
|
||||||
|
return wi.FileInfoFields.Size
|
||||||
|
}
|
||||||
|
|
||||||
|
// ModTime returns the modification time for the file. For backends that
|
||||||
|
// don't have a modification time, the creation time should be returned.
|
||||||
|
func (wi walkInfoContainer) ModTime() time.Time {
|
||||||
|
return wi.FileInfoFields.ModTime
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsDir returns true if the path is a directory.
|
||||||
|
func (wi walkInfoContainer) IsDir() bool {
|
||||||
|
return wi.FileInfoFields.IsDir
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *driver) doWalk(parentCtx context.Context, objectCount *int64, path, prefix string, f storagedriver.WalkFn) error {
|
||||||
|
var retError error
|
||||||
|
|
||||||
|
listObjectsInput := &s3.ListObjectsV2Input{
|
||||||
|
Bucket: aws.String(d.Bucket),
|
||||||
|
Prefix: aws.String(path),
|
||||||
|
Delimiter: aws.String("/"),
|
||||||
|
MaxKeys: aws.Int64(listMax),
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, done := dcontext.WithTrace(parentCtx)
|
||||||
|
defer done("s3aws.ListObjectsV2Pages(%s)", path)
|
||||||
|
listObjectErr := d.S3.ListObjectsV2PagesWithContext(ctx, listObjectsInput, func(objects *s3.ListObjectsV2Output, lastPage bool) bool {
|
||||||
|
|
||||||
|
*objectCount += *objects.KeyCount
|
||||||
|
walkInfos := make([]walkInfoContainer, 0, *objects.KeyCount)
|
||||||
|
|
||||||
|
for _, dir := range objects.CommonPrefixes {
|
||||||
|
commonPrefix := *dir.Prefix
|
||||||
|
walkInfos = append(walkInfos, walkInfoContainer{
|
||||||
|
prefix: dir.Prefix,
|
||||||
|
FileInfoFields: storagedriver.FileInfoFields{
|
||||||
|
IsDir: true,
|
||||||
|
Path: strings.Replace(commonPrefix[:len(commonPrefix)-1], d.s3Path(""), prefix, 1),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, file := range objects.Contents {
|
||||||
|
walkInfos = append(walkInfos, walkInfoContainer{
|
||||||
|
FileInfoFields: storagedriver.FileInfoFields{
|
||||||
|
IsDir: false,
|
||||||
|
Size: *file.Size,
|
||||||
|
ModTime: *file.LastModified,
|
||||||
|
Path: strings.Replace(*file.Key, d.s3Path(""), prefix, 1),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.SliceStable(walkInfos, func(i, j int) bool { return walkInfos[i].FileInfoFields.Path < walkInfos[j].FileInfoFields.Path })
|
||||||
|
|
||||||
|
for _, walkInfo := range walkInfos {
|
||||||
|
err := f(walkInfo)
|
||||||
|
|
||||||
|
if err == storagedriver.ErrSkipDir {
|
||||||
|
if walkInfo.IsDir() {
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
} else if err != nil {
|
||||||
|
retError = err
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if walkInfo.IsDir() {
|
||||||
|
if err := d.doWalk(ctx, objectCount, *walkInfo.prefix, prefix, f); err != nil {
|
||||||
|
retError = err
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
if retError != nil {
|
||||||
|
return retError
|
||||||
|
}
|
||||||
|
|
||||||
|
if listObjectErr != nil {
|
||||||
|
return listObjectErr
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (d *driver) s3Path(path string) string {
|
func (d *driver) s3Path(path string) string {
|
||||||
return strings.TrimLeft(strings.TrimRight(d.RootDirectory, "/")+path, "/")
|
return strings.TrimLeft(strings.TrimRight(d.RootDirectory, "/")+path, "/")
|
||||||
}
|
}
|
||||||
|
|
|
@ -546,6 +546,12 @@ func (d *Driver) S3BucketKey(path string) string {
|
||||||
return d.StorageDriver.(*driver).s3Path(path)
|
return d.StorageDriver.(*driver).s3Path(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
return storagedriver.WalkFallback(ctx, d, path, f)
|
||||||
|
}
|
||||||
|
|
||||||
func parseError(path string, err error) error {
|
func parseError(path string, err error) error {
|
||||||
if s3Err, ok := err.(*s3.Error); ok && s3Err.Code == "NoSuchKey" {
|
if s3Err, ok := err.(*s3.Error); ok && s3Err.Code == "NoSuchKey" {
|
||||||
return storagedriver.PathNotFoundError{Path: path}
|
return storagedriver.PathNotFoundError{Path: path}
|
||||||
|
|
|
@ -83,6 +83,13 @@ type StorageDriver interface {
|
||||||
// May return an ErrUnsupportedMethod in certain StorageDriver
|
// May return an ErrUnsupportedMethod in certain StorageDriver
|
||||||
// implementations.
|
// implementations.
|
||||||
URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error)
|
URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error)
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file.
|
||||||
|
// If the returned error from the WalkFn is ErrSkipDir and fileInfo refers
|
||||||
|
// to a directory, the directory will not be entered and Walk
|
||||||
|
// will continue the traversal. If fileInfo refers to a normal file, processing stops
|
||||||
|
Walk(ctx context.Context, path string, f WalkFn) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileWriter provides an abstraction for an opened writable file-like object in
|
// FileWriter provides an abstraction for an opened writable file-like object in
|
||||||
|
|
|
@ -644,6 +644,12 @@ func (d *driver) URLFor(ctx context.Context, path string, options map[string]int
|
||||||
return tempURL, nil
|
return tempURL, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Walk traverses a filesystem defined within driver, starting
|
||||||
|
// from the given path, calling f on each file
|
||||||
|
func (d *driver) Walk(ctx context.Context, path string, f storagedriver.WalkFn) error {
|
||||||
|
return storagedriver.WalkFallback(ctx, d, path, f)
|
||||||
|
}
|
||||||
|
|
||||||
func (d *driver) swiftPath(path string) string {
|
func (d *driver) swiftPath(path string) string {
|
||||||
return strings.TrimLeft(strings.TrimRight(d.Prefix+"/files"+path, "/"), "/")
|
return strings.TrimLeft(strings.TrimRight(d.Prefix+"/files"+path, "/"), "/")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
package storage
|
package driver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
storageDriver "github.com/docker/distribution/registry/storage/driver"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ErrSkipDir is used as a return value from onFileFunc to indicate that
|
// ErrSkipDir is used as a return value from onFileFunc to indicate that
|
||||||
|
@ -15,14 +12,14 @@ import (
|
||||||
var ErrSkipDir = errors.New("skip this directory")
|
var ErrSkipDir = errors.New("skip this directory")
|
||||||
|
|
||||||
// WalkFn is called once per file by Walk
|
// WalkFn is called once per file by Walk
|
||||||
// If the returned error is ErrSkipDir and fileInfo refers
|
type WalkFn func(fileInfo FileInfo) error
|
||||||
// to a directory, the directory will not be entered and Walk
|
|
||||||
// will continue the traversal. Otherwise Walk will return
|
|
||||||
type WalkFn func(fileInfo storageDriver.FileInfo) error
|
|
||||||
|
|
||||||
// Walk traverses a filesystem defined within driver, starting
|
// WalkFallback traverses a filesystem defined within driver, starting
|
||||||
// from the given path, calling f on each file
|
// from the given path, calling f on each file. It uses the List method and Stat to drive itself.
|
||||||
func Walk(ctx context.Context, driver storageDriver.StorageDriver, from string, f WalkFn) error {
|
// If the returned error from the WalkFn is ErrSkipDir and fileInfo refers
|
||||||
|
// to a directory, the directory will not be entered and Walk
|
||||||
|
// will continue the traversal. If fileInfo refers to a normal file, processing stops
|
||||||
|
func WalkFallback(ctx context.Context, driver StorageDriver, from string, f WalkFn) error {
|
||||||
children, err := driver.List(ctx, from)
|
children, err := driver.List(ctx, from)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -38,22 +35,18 @@ func Walk(ctx context.Context, driver storageDriver.StorageDriver, from string,
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = f(fileInfo)
|
err = f(fileInfo)
|
||||||
skipDir := (err == ErrSkipDir)
|
if err == nil && fileInfo.IsDir() {
|
||||||
if err != nil && !skipDir {
|
if err := WalkFallback(ctx, driver, child, f); err != nil {
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if fileInfo.IsDir() && !skipDir {
|
|
||||||
if err := Walk(ctx, driver, child, f); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
} else if err == ErrSkipDir {
|
||||||
|
// Stop iteration if it's a file, otherwise noop if it's a directory
|
||||||
|
if !fileInfo.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// pushError formats an error type given a path and an error
|
|
||||||
// and pushes it to a slice of errors
|
|
||||||
func pushError(errors []error, path string, err error) []error {
|
|
||||||
return append(errors, fmt.Errorf("%s: %s", path, err))
|
|
||||||
}
|
|
9
registry/storage/error.go
Normal file
9
registry/storage/error.go
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
// pushError formats an error type given a path and an error
|
||||||
|
// and pushes it to a slice of errors
|
||||||
|
func pushError(errors []error, path string, err error) []error {
|
||||||
|
return append(errors, fmt.Errorf("%s: %s", path, err))
|
||||||
|
}
|
|
@ -237,7 +237,7 @@ func (lbs *linkedBlobStore) Enumerate(ctx context.Context, ingestor func(digest.
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = Walk(ctx, lbs.blobStore.driver, rootPath, func(fileInfo driver.FileInfo) error {
|
return lbs.driver.Walk(ctx, rootPath, func(fileInfo driver.FileInfo) error {
|
||||||
// exit early if directory...
|
// exit early if directory...
|
||||||
if fileInfo.IsDir() {
|
if fileInfo.IsDir() {
|
||||||
return nil
|
return nil
|
||||||
|
@ -273,12 +273,6 @@ func (lbs *linkedBlobStore) Enumerate(ctx context.Context, ingestor func(digest.
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lbs *linkedBlobStore) mount(ctx context.Context, sourceRepo reference.Named, dgst digest.Digest, sourceStat *distribution.Descriptor) (distribution.Descriptor, error) {
|
func (lbs *linkedBlobStore) mount(ctx context.Context, sourceRepo reference.Named, dgst digest.Digest, sourceStat *distribution.Descriptor) (distribution.Descriptor, error) {
|
||||||
|
|
|
@ -67,7 +67,7 @@ func getOutstandingUploads(ctx context.Context, driver storageDriver.StorageDriv
|
||||||
return uploads, append(errors, err)
|
return uploads, append(errors, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = Walk(ctx, driver, root, func(fileInfo storageDriver.FileInfo) error {
|
err = driver.Walk(ctx, root, func(fileInfo storageDriver.FileInfo) error {
|
||||||
filePath := fileInfo.Path()
|
filePath := fileInfo.Path()
|
||||||
_, file := path.Split(filePath)
|
_, file := path.Split(filePath)
|
||||||
if file[0] == '_' {
|
if file[0] == '_' {
|
||||||
|
@ -75,7 +75,7 @@ func getOutstandingUploads(ctx context.Context, driver storageDriver.StorageDriv
|
||||||
inUploadDir = (file == "_uploads")
|
inUploadDir = (file == "_uploads")
|
||||||
|
|
||||||
if fileInfo.IsDir() && !inUploadDir {
|
if fileInfo.IsDir() && !inUploadDir {
|
||||||
return ErrSkipDir
|
return storageDriver.ErrSkipDir
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,7 +142,7 @@ func TestPurgeMissingStartedAt(t *testing.T) {
|
||||||
oneHourAgo := time.Now().Add(-1 * time.Hour)
|
oneHourAgo := time.Now().Add(-1 * time.Hour)
|
||||||
fs, ctx := testUploadFS(t, 1, "test-repo", oneHourAgo)
|
fs, ctx := testUploadFS(t, 1, "test-repo", oneHourAgo)
|
||||||
|
|
||||||
err := Walk(ctx, fs, "/", func(fileInfo driver.FileInfo) error {
|
err := fs.Walk(ctx, "/", func(fileInfo driver.FileInfo) error {
|
||||||
filePath := fileInfo.Path()
|
filePath := fileInfo.Path()
|
||||||
_, file := path.Split(filePath)
|
_, file := path.Split(filePath)
|
||||||
|
|
||||||
|
|
|
@ -1,152 +0,0 @@
|
||||||
package storage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"sort"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/docker/distribution/registry/storage/driver"
|
|
||||||
"github.com/docker/distribution/registry/storage/driver/inmemory"
|
|
||||||
)
|
|
||||||
|
|
||||||
func testFS(t *testing.T) (driver.StorageDriver, map[string]string, context.Context) {
|
|
||||||
d := inmemory.New()
|
|
||||||
ctx := context.Background()
|
|
||||||
|
|
||||||
expected := map[string]string{
|
|
||||||
"/a": "dir",
|
|
||||||
"/a/b": "dir",
|
|
||||||
"/a/b/c": "dir",
|
|
||||||
"/a/b/c/d": "file",
|
|
||||||
"/a/b/c/e": "file",
|
|
||||||
"/a/b/f": "dir",
|
|
||||||
"/a/b/f/g": "file",
|
|
||||||
"/a/b/f/h": "file",
|
|
||||||
"/a/b/f/i": "file",
|
|
||||||
"/z": "dir",
|
|
||||||
"/z/y": "file",
|
|
||||||
}
|
|
||||||
|
|
||||||
for p, typ := range expected {
|
|
||||||
if typ != "file" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := d.PutContent(ctx, p, []byte(p)); err != nil {
|
|
||||||
t.Fatalf("unable to put content into fixture: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return d, expected, ctx
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWalkErrors(t *testing.T) {
|
|
||||||
d, expected, ctx := testFS(t)
|
|
||||||
fileCount := len(expected)
|
|
||||||
err := Walk(ctx, d, "", func(fileInfo driver.FileInfo) error {
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err == nil {
|
|
||||||
t.Error("Expected invalid root err")
|
|
||||||
}
|
|
||||||
|
|
||||||
errEarlyExpected := fmt.Errorf("Early termination")
|
|
||||||
|
|
||||||
err = Walk(ctx, d, "/", func(fileInfo driver.FileInfo) error {
|
|
||||||
// error on the 2nd file
|
|
||||||
if fileInfo.Path() == "/a/b" {
|
|
||||||
return errEarlyExpected
|
|
||||||
}
|
|
||||||
|
|
||||||
delete(expected, fileInfo.Path())
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if len(expected) != fileCount-1 {
|
|
||||||
t.Error("Walk failed to terminate with error")
|
|
||||||
}
|
|
||||||
if err != errEarlyExpected {
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("expected an error due to early termination")
|
|
||||||
} else {
|
|
||||||
t.Error(err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = Walk(ctx, d, "/nonexistent", func(fileInfo driver.FileInfo) error {
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err == nil {
|
|
||||||
t.Errorf("Expected missing file err")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWalk(t *testing.T) {
|
|
||||||
d, expected, ctx := testFS(t)
|
|
||||||
var traversed []string
|
|
||||||
err := Walk(ctx, d, "/", func(fileInfo driver.FileInfo) error {
|
|
||||||
filePath := fileInfo.Path()
|
|
||||||
filetype, ok := expected[filePath]
|
|
||||||
if !ok {
|
|
||||||
t.Fatalf("Unexpected file in walk: %q", filePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
if fileInfo.IsDir() {
|
|
||||||
if filetype != "dir" {
|
|
||||||
t.Errorf("Unexpected file type: %q", filePath)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if filetype != "file" {
|
|
||||||
t.Errorf("Unexpected file type: %q", filePath)
|
|
||||||
}
|
|
||||||
|
|
||||||
// each file has its own path as the contents. If the length
|
|
||||||
// doesn't match the path length, fail.
|
|
||||||
if fileInfo.Size() != int64(len(fileInfo.Path())) {
|
|
||||||
t.Fatalf("unexpected size for %q: %v != %v",
|
|
||||||
fileInfo.Path(), fileInfo.Size(), len(fileInfo.Path()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
delete(expected, filePath)
|
|
||||||
traversed = append(traversed, filePath)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if len(expected) > 0 {
|
|
||||||
t.Errorf("Missed files in walk: %q", expected)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !sort.StringsAreSorted(traversed) {
|
|
||||||
t.Errorf("result should be sorted: %v", traversed)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf(err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWalkSkipDir(t *testing.T) {
|
|
||||||
d, expected, ctx := testFS(t)
|
|
||||||
err := Walk(ctx, d, "/", func(fileInfo driver.FileInfo) error {
|
|
||||||
filePath := fileInfo.Path()
|
|
||||||
if filePath == "/a/b" {
|
|
||||||
// skip processing /a/b/c and /a/b/c/d
|
|
||||||
return ErrSkipDir
|
|
||||||
}
|
|
||||||
delete(expected, filePath)
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf(err.Error())
|
|
||||||
}
|
|
||||||
if _, ok := expected["/a/b/c"]; !ok {
|
|
||||||
t.Errorf("/a/b/c not skipped")
|
|
||||||
}
|
|
||||||
if _, ok := expected["/a/b/c/d"]; !ok {
|
|
||||||
t.Errorf("/a/b/c/d not skipped")
|
|
||||||
}
|
|
||||||
if _, ok := expected["/a/b/c/e"]; !ok {
|
|
||||||
t.Errorf("/a/b/c/e not skipped")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
github.com/Azure/azure-sdk-for-go 088007b3b08cc02b27f2eadfdcd870958460ce7e
|
github.com/Azure/azure-sdk-for-go 088007b3b08cc02b27f2eadfdcd870958460ce7e
|
||||||
github.com/Azure/go-autorest ec5f4903f77ed9927ac95b19ab8e44ada64c1356
|
github.com/Azure/go-autorest ec5f4903f77ed9927ac95b19ab8e44ada64c1356
|
||||||
github.com/sirupsen/logrus 3d4380f53a34dcdc95f0c1db702615992b38d9a4
|
github.com/sirupsen/logrus 3d4380f53a34dcdc95f0c1db702615992b38d9a4
|
||||||
github.com/aws/aws-sdk-go c6fc52983ea2375810aa38ddb5370e9cdf611716
|
github.com/aws/aws-sdk-go 5bcc0a238d880469f949fc7cd24e35f32ab80cbd
|
||||||
github.com/bshuster-repo/logrus-logstash-hook d2c0ecc1836d91814e15e23bb5dc309c3ef51f4a
|
github.com/bshuster-repo/logrus-logstash-hook d2c0ecc1836d91814e15e23bb5dc309c3ef51f4a
|
||||||
github.com/bugsnag/bugsnag-go b1d153021fcd90ca3f080db36bec96dc690fb274
|
github.com/bugsnag/bugsnag-go b1d153021fcd90ca3f080db36bec96dc690fb274
|
||||||
github.com/bugsnag/osext 0dd3f918b21bec95ace9dc86c7e70266cfc5c702
|
github.com/bugsnag/osext 0dd3f918b21bec95ace9dc86c7e70266cfc5c702
|
||||||
|
|
460
vendor/github.com/aws/aws-sdk-go/README.md
generated
vendored
460
vendor/github.com/aws/aws-sdk-go/README.md
generated
vendored
|
@ -1,11 +1,6 @@
|
||||||
# AWS SDK for Go
|
[![API Reference](http://img.shields.io/badge/api-reference-blue.svg)](http://docs.aws.amazon.com/sdk-for-go/api) [![Join the chat at https://gitter.im/aws/aws-sdk-go](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/aws/aws-sdk-go?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://img.shields.io/travis/aws/aws-sdk-go.svg)](https://travis-ci.org/aws/aws-sdk-go) [![Apache V2 License](http://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt)
|
||||||
|
|
||||||
<span style="display: inline-block;">
|
# AWS SDK for Go
|
||||||
[![API Reference](http://img.shields.io/badge/api-reference-blue.svg)](http://docs.aws.amazon.com/sdk-for-go/api)
|
|
||||||
[![Join the chat at https://gitter.im/aws/aws-sdk-go](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/aws/aws-sdk-go?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
||||||
[![Build Status](https://img.shields.io/travis/aws/aws-sdk-go.svg)](https://travis-ci.org/aws/aws-sdk-go)
|
|
||||||
[![Apache V2 License](http://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt)
|
|
||||||
</span>
|
|
||||||
|
|
||||||
aws-sdk-go is the official AWS SDK for the Go programming language.
|
aws-sdk-go is the official AWS SDK for the Go programming language.
|
||||||
|
|
||||||
|
@ -30,7 +25,23 @@ These two processes will still include the `vendor` folder and it should be dele
|
||||||
|
|
||||||
rm -rf $GOPATH/src/github.com/aws/aws-sdk-go/vendor
|
rm -rf $GOPATH/src/github.com/aws/aws-sdk-go/vendor
|
||||||
|
|
||||||
|
## Getting Help
|
||||||
|
|
||||||
|
Please use these community resources for getting help. We use the GitHub issues for tracking bugs and feature requests.
|
||||||
|
|
||||||
|
* Ask a question on [StackOverflow](http://stackoverflow.com/) and tag it with the [`aws-sdk-go`](http://stackoverflow.com/questions/tagged/aws-sdk-go) tag.
|
||||||
|
* Come join the AWS SDK for Go community chat on [gitter](https://gitter.im/aws/aws-sdk-go).
|
||||||
|
* Open a support ticket with [AWS Support](http://docs.aws.amazon.com/awssupport/latest/user/getting-started.html).
|
||||||
|
* If you think you may have found a bug, please open an [issue](https://github.com/aws/aws-sdk-go/issues/new).
|
||||||
|
|
||||||
|
## Opening Issues
|
||||||
|
|
||||||
|
If you encounter a bug with the AWS SDK for Go we would like to hear about it. Search the [existing issues](https://github.com/aws/aws-sdk-go/issues) and see if others are also experiencing the issue before opening a new issue. Please include the version of AWS SDK for Go, Go language, and OS you’re using. Please also include repro case when appropriate.
|
||||||
|
|
||||||
|
The GitHub issues are intended for bug reports and feature requests. For help and questions with using AWS SDK for GO please make use of the resources listed in the [Getting Help](https://github.com/aws/aws-sdk-go#getting-help) section. Keeping the list of open issues lean will help us respond in a timely manner.
|
||||||
|
|
||||||
## Reference Documentation
|
## Reference Documentation
|
||||||
|
|
||||||
[`Getting Started Guide`](https://aws.amazon.com/sdk-for-go/) - This document is a general introduction how to configure and make requests with the SDK. If this is your first time using the SDK, this documentation and the API documentation will help you get started. This document focuses on the syntax and behavior of the SDK. The [Service Developer Guide](https://aws.amazon.com/documentation/) will help you get started using specific AWS services.
|
[`Getting Started Guide`](https://aws.amazon.com/sdk-for-go/) - This document is a general introduction how to configure and make requests with the SDK. If this is your first time using the SDK, this documentation and the API documentation will help you get started. This document focuses on the syntax and behavior of the SDK. The [Service Developer Guide](https://aws.amazon.com/documentation/) will help you get started using specific AWS services.
|
||||||
|
|
||||||
[`SDK API Reference Documentation`](https://docs.aws.amazon.com/sdk-for-go/api/) - Use this document to look up all API operation input and output parameters for AWS services supported by the SDK. The API reference also includes documentation of the SDK, and examples how to using the SDK, service client API operations, and API operation require parameters.
|
[`SDK API Reference Documentation`](https://docs.aws.amazon.com/sdk-for-go/api/) - Use this document to look up all API operation input and output parameters for AWS services supported by the SDK. The API reference also includes documentation of the SDK, and examples how to using the SDK, service client API operations, and API operation require parameters.
|
||||||
|
@ -39,80 +50,397 @@ These two processes will still include the `vendor` folder and it should be dele
|
||||||
|
|
||||||
[`SDK Examples`](https://github.com/aws/aws-sdk-go/tree/master/example) - Included in the SDK's repo are a several hand crafted examples using the SDK features and AWS services.
|
[`SDK Examples`](https://github.com/aws/aws-sdk-go/tree/master/example) - Included in the SDK's repo are a several hand crafted examples using the SDK features and AWS services.
|
||||||
|
|
||||||
## Configuring Credentials
|
## Overview of SDK's Packages
|
||||||
|
|
||||||
Before using the SDK, ensure that you've configured credentials. The best
|
The SDK is composed of two main components, SDK core, and service clients.
|
||||||
way to configure credentials on a development machine is to use the
|
The SDK core packages are all available under the aws package at the root of
|
||||||
`~/.aws/credentials` file, which might look like:
|
the SDK. Each client for a supported AWS service is available within its own
|
||||||
|
package under the service folder at the root of the SDK.
|
||||||
|
|
||||||
```
|
* aws - SDK core, provides common shared types such as Config, Logger,
|
||||||
[default]
|
and utilities to make working with API parameters easier.
|
||||||
aws_access_key_id = AKID1234567890
|
|
||||||
aws_secret_access_key = MY-SECRET-KEY
|
|
||||||
```
|
|
||||||
|
|
||||||
You can learn more about the credentials file from this
|
* awserr - Provides the error interface that the SDK will use for all
|
||||||
[blog post](http://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs).
|
errors that occur in the SDK's processing. This includes service API
|
||||||
|
response errors as well. The Error type is made up of a code and message.
|
||||||
|
Cast the SDK's returned error type to awserr.Error and call the Code
|
||||||
|
method to compare returned error to specific error codes. See the package's
|
||||||
|
documentation for additional values that can be extracted such as RequestID.
|
||||||
|
|
||||||
Alternatively, you can set the following environment variables:
|
* credentials - Provides the types and built in credentials providers
|
||||||
|
the SDK will use to retrieve AWS credentials to make API requests with.
|
||||||
|
Nested under this folder are also additional credentials providers such as
|
||||||
|
stscreds for assuming IAM roles, and ec2rolecreds for EC2 Instance roles.
|
||||||
|
|
||||||
```
|
* endpoints - Provides the AWS Regions and Endpoints metadata for the SDK.
|
||||||
AWS_ACCESS_KEY_ID=AKID1234567890
|
Use this to lookup AWS service endpoint information such as which services
|
||||||
AWS_SECRET_ACCESS_KEY=MY-SECRET-KEY
|
are in a region, and what regions a service is in. Constants are also provided
|
||||||
```
|
for all region identifiers, e.g UsWest2RegionID for "us-west-2".
|
||||||
|
|
||||||
### AWS shared config file (`~/.aws/config`)
|
* session - Provides initial default configuration, and load
|
||||||
The AWS SDK for Go added support the shared config file in release [v1.3.0](https://github.com/aws/aws-sdk-go/releases/tag/v1.3.0). You can opt into enabling support for the shared config by setting the environment variable `AWS_SDK_LOAD_CONFIG` to a truthy value. See the [Session](https://github.com/aws/aws-sdk-go/wiki/sessions) wiki for more information about this feature.
|
configuration from external sources such as environment and shared
|
||||||
|
credentials file.
|
||||||
|
|
||||||
## Using the Go SDK
|
* request - Provides the API request sending, and retry logic for the SDK.
|
||||||
|
This package also includes utilities for defining your own request
|
||||||
|
retryer, and configuring how the SDK processes the request.
|
||||||
|
|
||||||
To use a service in the SDK, create a service variable by calling the `New()`
|
* service - Clients for AWS services. All services supported by the SDK are
|
||||||
function. Once you have a service client, you can call API operations which each
|
available under this folder.
|
||||||
return response data and a possible error.
|
|
||||||
|
|
||||||
To list a set of instance IDs from EC2, you could run:
|
## How to Use the SDK's AWS Service Clients
|
||||||
|
|
||||||
|
The SDK includes the Go types and utilities you can use to make requests to
|
||||||
|
AWS service APIs. Within the service folder at the root of the SDK you'll find
|
||||||
|
a package for each AWS service the SDK supports. All service clients follows
|
||||||
|
a common pattern of creation and usage.
|
||||||
|
|
||||||
|
When creating a client for an AWS service you'll first need to have a Session
|
||||||
|
value constructed. The Session provides shared configuration that can be shared
|
||||||
|
between your service clients. When service clients are created you can pass
|
||||||
|
in additional configuration via the aws.Config type to override configuration
|
||||||
|
provided by in the Session to create service client instances with custom
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
Once the service's client is created you can use it to make API requests the
|
||||||
|
AWS service. These clients are safe to use concurrently.
|
||||||
|
|
||||||
|
## Configuring the SDK
|
||||||
|
|
||||||
|
In the AWS SDK for Go, you can configure settings for service clients, such
|
||||||
|
as the log level and maximum number of retries. Most settings are optional;
|
||||||
|
however, for each service client, you must specify a region and your credentials.
|
||||||
|
The SDK uses these values to send requests to the correct AWS region and sign
|
||||||
|
requests with the correct credentials. You can specify these values as part
|
||||||
|
of a session or as environment variables.
|
||||||
|
|
||||||
|
See the SDK's [configuration guide][config_guide] for more information.
|
||||||
|
|
||||||
|
See the [session][session_pkg] package documentation for more information on how to use Session
|
||||||
|
with the SDK.
|
||||||
|
|
||||||
|
See the [Config][config_typ] type in the [aws][aws_pkg] package for more information on configuration
|
||||||
|
options.
|
||||||
|
|
||||||
|
[config_guide]: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html
|
||||||
|
[session_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/session/
|
||||||
|
[config_typ]: https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
||||||
|
[aws_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/
|
||||||
|
|
||||||
|
### Configuring Credentials
|
||||||
|
|
||||||
|
When using the SDK you'll generally need your AWS credentials to authenticate
|
||||||
|
with AWS services. The SDK supports multiple methods of supporting these
|
||||||
|
credentials. By default the SDK will source credentials automatically from
|
||||||
|
its default credential chain. See the session package for more information
|
||||||
|
on this chain, and how to configure it. The common items in the credential
|
||||||
|
chain are the following:
|
||||||
|
|
||||||
|
* Environment Credentials - Set of environment variables that are useful
|
||||||
|
when sub processes are created for specific roles.
|
||||||
|
|
||||||
|
* Shared Credentials file (~/.aws/credentials) - This file stores your
|
||||||
|
credentials based on a profile name and is useful for local development.
|
||||||
|
|
||||||
|
* EC2 Instance Role Credentials - Use EC2 Instance Role to assign credentials
|
||||||
|
to application running on an EC2 instance. This removes the need to manage
|
||||||
|
credential files in production.
|
||||||
|
|
||||||
|
Credentials can be configured in code as well by setting the Config's Credentials
|
||||||
|
value to a custom provider or using one of the providers included with the
|
||||||
|
SDK to bypass the default credential chain and use a custom one. This is
|
||||||
|
helpful when you want to instruct the SDK to only use a specific set of
|
||||||
|
credentials or providers.
|
||||||
|
|
||||||
|
This example creates a credential provider for assuming an IAM role, "myRoleARN"
|
||||||
|
and configures the S3 service client to use that role for API requests.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
// Initial credentials loaded from SDK's default credential chain. Such as
|
||||||
|
// the environment, shared credentials (~/.aws/credentials), or EC2 Instance
|
||||||
|
// Role. These credentials will be used to to make the STS Assume Role API.
|
||||||
|
sess := session.Must(session.NewSession())
|
||||||
|
|
||||||
import (
|
// Create the credentials from AssumeRoleProvider to assume the role
|
||||||
"fmt"
|
// referenced by the "myRoleARN" ARN.
|
||||||
|
creds := stscreds.NewCredentials(sess, "myRoleArn")
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
// Create service client value configured for credentials
|
||||||
"github.com/aws/aws-sdk-go/aws/session"
|
// from assumed role.
|
||||||
"github.com/aws/aws-sdk-go/service/ec2"
|
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
sess, err := session.NewSession()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create an EC2 service object in the "us-west-2" region
|
|
||||||
// Note that you can also configure your region globally by
|
|
||||||
// exporting the AWS_REGION environment variable
|
|
||||||
svc := ec2.New(sess, &aws.Config{Region: aws.String("us-west-2")})
|
|
||||||
|
|
||||||
// Call the DescribeInstances Operation
|
|
||||||
resp, err := svc.DescribeInstances(nil)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// resp has all of the response data, pull out instance IDs:
|
|
||||||
fmt.Println("> Number of reservation sets: ", len(resp.Reservations))
|
|
||||||
for idx, res := range resp.Reservations {
|
|
||||||
fmt.Println(" > Number of instances: ", len(res.Instances))
|
|
||||||
for _, inst := range resp.Reservations[idx].Instances {
|
|
||||||
fmt.Println(" - Instance ID: ", *inst.InstanceId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
You can find more information and operations in our
|
See the [credentials][credentials_pkg] package documentation for more information on credential
|
||||||
[API documentation](http://docs.aws.amazon.com/sdk-for-go/api/).
|
providers included with the SDK, and how to customize the SDK's usage of
|
||||||
|
credentials.
|
||||||
|
|
||||||
|
The SDK has support for the shared configuration file (~/.aws/config). This
|
||||||
|
support can be enabled by setting the environment variable, "AWS_SDK_LOAD_CONFIG=1",
|
||||||
|
or enabling the feature in code when creating a Session via the
|
||||||
|
Option's SharedConfigState parameter.
|
||||||
|
|
||||||
|
```go
|
||||||
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
|
SharedConfigState: session.SharedConfigEnable,
|
||||||
|
}))
|
||||||
|
```
|
||||||
|
|
||||||
|
[credentials_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials
|
||||||
|
|
||||||
|
### Configuring AWS Region
|
||||||
|
|
||||||
|
In addition to the credentials you'll need to specify the region the SDK
|
||||||
|
will use to make AWS API requests to. In the SDK you can specify the region
|
||||||
|
either with an environment variable, or directly in code when a Session or
|
||||||
|
service client is created. The last value specified in code wins if the region
|
||||||
|
is specified multiple ways.
|
||||||
|
|
||||||
|
To set the region via the environment variable set the "AWS_REGION" to the
|
||||||
|
region you want to the SDK to use. Using this method to set the region will
|
||||||
|
allow you to run your application in multiple regions without needing additional
|
||||||
|
code in the application to select the region.
|
||||||
|
|
||||||
|
AWS_REGION=us-west-2
|
||||||
|
|
||||||
|
The endpoints package includes constants for all regions the SDK knows. The
|
||||||
|
values are all suffixed with RegionID. These values are helpful, because they
|
||||||
|
reduce the need to type the region string manually.
|
||||||
|
|
||||||
|
To set the region on a Session use the aws package's Config struct parameter
|
||||||
|
Region to the AWS region you want the service clients created from the session to
|
||||||
|
use. This is helpful when you want to create multiple service clients, and
|
||||||
|
all of the clients make API requests to the same region.
|
||||||
|
|
||||||
|
```go
|
||||||
|
sess := session.Must(session.NewSession(&aws.Config{
|
||||||
|
Region: aws.String(endpoints.UsWest2RegionID),
|
||||||
|
}))
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [endpoints][endpoints_pkg] package for the AWS Regions and Endpoints metadata.
|
||||||
|
|
||||||
|
In addition to setting the region when creating a Session you can also set
|
||||||
|
the region on a per service client bases. This overrides the region of a
|
||||||
|
Session. This is helpful when you want to create service clients in specific
|
||||||
|
regions different from the Session's region.
|
||||||
|
|
||||||
|
```go
|
||||||
|
svc := s3.New(sess, &aws.Config{
|
||||||
|
Region: aws.String(endpoints.UsWest2RegionID),
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
See the [Config][config_typ] type in the [aws][aws_pkg] package for more information and additional
|
||||||
|
options such as setting the Endpoint, and other service client configuration options.
|
||||||
|
|
||||||
|
[endpoints_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/
|
||||||
|
|
||||||
|
## Making API Requests
|
||||||
|
|
||||||
|
Once the client is created you can make an API request to the service.
|
||||||
|
Each API method takes a input parameter, and returns the service response
|
||||||
|
and an error. The SDK provides methods for making the API call in multiple ways.
|
||||||
|
|
||||||
|
In this list we'll use the S3 ListObjects API as an example for the different
|
||||||
|
ways of making API requests.
|
||||||
|
|
||||||
|
* ListObjects - Base API operation that will make the API request to the service.
|
||||||
|
|
||||||
|
* ListObjectsRequest - API methods suffixed with Request will construct the
|
||||||
|
API request, but not send it. This is also helpful when you want to get a
|
||||||
|
presigned URL for a request, and share the presigned URL instead of your
|
||||||
|
application making the request directly.
|
||||||
|
|
||||||
|
* ListObjectsPages - Same as the base API operation, but uses a callback to
|
||||||
|
automatically handle pagination of the API's response.
|
||||||
|
|
||||||
|
* ListObjectsWithContext - Same as base API operation, but adds support for
|
||||||
|
the Context pattern. This is helpful for controlling the canceling of in
|
||||||
|
flight requests. See the Go standard library context package for more
|
||||||
|
information. This method also takes request package's Option functional
|
||||||
|
options as the variadic argument for modifying how the request will be
|
||||||
|
made, or extracting information from the raw HTTP response.
|
||||||
|
|
||||||
|
* ListObjectsPagesWithContext - same as ListObjectsPages, but adds support for
|
||||||
|
the Context pattern. Similar to ListObjectsWithContext this method also
|
||||||
|
takes the request package's Option function option types as the variadic
|
||||||
|
argument.
|
||||||
|
|
||||||
|
In addition to the API operations the SDK also includes several higher level
|
||||||
|
methods that abstract checking for and waiting for an AWS resource to be in
|
||||||
|
a desired state. In this list we'll use WaitUntilBucketExists to demonstrate
|
||||||
|
the different forms of waiters.
|
||||||
|
|
||||||
|
* WaitUntilBucketExists. - Method to make API request to query an AWS service for
|
||||||
|
a resource's state. Will return successfully when that state is accomplished.
|
||||||
|
|
||||||
|
* WaitUntilBucketExistsWithContext - Same as WaitUntilBucketExists, but adds
|
||||||
|
support for the Context pattern. In addition these methods take request
|
||||||
|
package's WaiterOptions to configure the waiter, and how underlying request
|
||||||
|
will be made by the SDK.
|
||||||
|
|
||||||
|
The API method will document which error codes the service might return for
|
||||||
|
the operation. These errors will also be available as const strings prefixed
|
||||||
|
with "ErrCode" in the service client's package. If there are no errors listed
|
||||||
|
in the API's SDK documentation you'll need to consult the AWS service's API
|
||||||
|
documentation for the errors that could be returned.
|
||||||
|
|
||||||
|
```go
|
||||||
|
ctx := context.Background()
|
||||||
|
|
||||||
|
result, err := svc.GetObjectWithContext(ctx, &s3.GetObjectInput{
|
||||||
|
Bucket: aws.String("my-bucket"),
|
||||||
|
Key: aws.String("my-key"),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
// Cast err to awserr.Error to handle specific error codes.
|
||||||
|
aerr, ok := err.(awserr.Error)
|
||||||
|
if ok && aerr.Code() == s3.ErrCodeNoSuchKey {
|
||||||
|
// Specific error code handling
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure to close the body when done with it for S3 GetObject APIs or
|
||||||
|
// will leak connections.
|
||||||
|
defer result.Body.Close()
|
||||||
|
|
||||||
|
fmt.Println("Object Size:", aws.StringValue(result.ContentLength))
|
||||||
|
```
|
||||||
|
|
||||||
|
### API Request Pagination and Resource Waiters
|
||||||
|
|
||||||
|
Pagination helper methods are suffixed with "Pages", and provide the
|
||||||
|
functionality needed to round trip API page requests. Pagination methods
|
||||||
|
take a callback function that will be called for each page of the API's response.
|
||||||
|
|
||||||
|
```go
|
||||||
|
objects := []string{}
|
||||||
|
err := svc.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{
|
||||||
|
Bucket: aws.String(myBucket),
|
||||||
|
}, func(p *s3.ListObjectsOutput, lastPage bool) bool {
|
||||||
|
for _, o := range p.Contents {
|
||||||
|
objects = append(objects, aws.StringValue(o.Key))
|
||||||
|
}
|
||||||
|
return true // continue paging
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("failed to list objects for bucket, %s, %v", myBucket, err))
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("Objects in bucket:", objects)
|
||||||
|
```
|
||||||
|
|
||||||
|
Waiter helper methods provide the functionality to wait for an AWS resource
|
||||||
|
state. These methods abstract the logic needed to to check the state of an
|
||||||
|
AWS resource, and wait until that resource is in a desired state. The waiter
|
||||||
|
will block until the resource is in the state that is desired, an error occurs,
|
||||||
|
or the waiter times out. If a resource times out the error code returned will
|
||||||
|
be request.WaiterResourceNotReadyErrorCode.
|
||||||
|
|
||||||
|
```go
|
||||||
|
err := svc.WaitUntilBucketExistsWithContext(ctx, &s3.HeadBucketInput{
|
||||||
|
Bucket: aws.String(myBucket),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
aerr, ok := err.(awserr.Error)
|
||||||
|
if ok && aerr.Code() == request.WaiterResourceNotReadyErrorCode {
|
||||||
|
fmt.Fprintf(os.Stderr, "timed out while waiting for bucket to exist")
|
||||||
|
}
|
||||||
|
panic(fmt.Errorf("failed to wait for bucket to exist, %v", err))
|
||||||
|
}
|
||||||
|
fmt.Println("Bucket", myBucket, "exists")
|
||||||
|
```
|
||||||
|
|
||||||
|
## Complete SDK Example
|
||||||
|
|
||||||
|
This example shows a complete working Go file which will upload a file to S3
|
||||||
|
and use the Context pattern to implement timeout logic that will cancel the
|
||||||
|
request if it takes too long. This example highlights how to use sessions,
|
||||||
|
create a service client, make a request, handle the error, and process the
|
||||||
|
response.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
|
"github.com/aws/aws-sdk-go/service/s3"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Uploads a file to S3 given a bucket and object key. Also takes a duration
|
||||||
|
// value to terminate the update if it doesn't complete within that time.
|
||||||
|
//
|
||||||
|
// The AWS Region needs to be provided in the AWS shared config or on the
|
||||||
|
// environment variable as `AWS_REGION`. Credentials also must be provided
|
||||||
|
// Will default to shared config file, but can load from environment if provided.
|
||||||
|
//
|
||||||
|
// Usage:
|
||||||
|
// # Upload myfile.txt to myBucket/myKey. Must complete within 10 minutes or will fail
|
||||||
|
// go run withContext.go -b mybucket -k myKey -d 10m < myfile.txt
|
||||||
|
func main() {
|
||||||
|
var bucket, key string
|
||||||
|
var timeout time.Duration
|
||||||
|
|
||||||
|
flag.StringVar(&bucket, "b", "", "Bucket name.")
|
||||||
|
flag.StringVar(&key, "k", "", "Object key name.")
|
||||||
|
flag.DurationVar(&timeout, "d", 0, "Upload timeout.")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
// All clients require a Session. The Session provides the client with
|
||||||
|
// shared configuration such as region, endpoint, and credentials. A
|
||||||
|
// Session should be shared where possible to take advantage of
|
||||||
|
// configuration and credential caching. See the session package for
|
||||||
|
// more information.
|
||||||
|
sess := session.Must(session.NewSession())
|
||||||
|
|
||||||
|
// Create a new instance of the service's client with a Session.
|
||||||
|
// Optional aws.Config values can also be provided as variadic arguments
|
||||||
|
// to the New function. This option allows you to provide service
|
||||||
|
// specific configuration.
|
||||||
|
svc := s3.New(sess)
|
||||||
|
|
||||||
|
// Create a context with a timeout that will abort the upload if it takes
|
||||||
|
// more than the passed in timeout.
|
||||||
|
ctx := context.Background()
|
||||||
|
var cancelFn func()
|
||||||
|
if timeout > 0 {
|
||||||
|
ctx, cancelFn = context.WithTimeout(ctx, timeout)
|
||||||
|
}
|
||||||
|
// Ensure the context is canceled to prevent leaking.
|
||||||
|
// See context package for more information, https://golang.org/pkg/context/
|
||||||
|
defer cancelFn()
|
||||||
|
|
||||||
|
// Uploads the object to S3. The Context will interrupt the request if the
|
||||||
|
// timeout expires.
|
||||||
|
_, err := svc.PutObjectWithContext(ctx, &s3.PutObjectInput{
|
||||||
|
Bucket: aws.String(bucket),
|
||||||
|
Key: aws.String(key),
|
||||||
|
Body: os.Stdin,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
if aerr, ok := err.(awserr.Error); ok && aerr.Code() == request.CanceledErrorCode {
|
||||||
|
// If the SDK can determine the request or retry delay was canceled
|
||||||
|
// by a context the CanceledErrorCode error code will be returned.
|
||||||
|
fmt.Fprintf(os.Stderr, "upload canceled due to timeout, %v\n", err)
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(os.Stderr, "failed to upload object, %v\n", err)
|
||||||
|
}
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("successfully uploaded file to %s/%s\n", bucket, key)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|
69
vendor/github.com/aws/aws-sdk-go/aws/client/client.go
generated
vendored
69
vendor/github.com/aws/aws-sdk-go/aws/client/client.go
generated
vendored
|
@ -2,7 +2,6 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http/httputil"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||||
|
@ -24,6 +23,13 @@ type ConfigProvider interface {
|
||||||
ClientConfig(serviceName string, cfgs ...*aws.Config) Config
|
ClientConfig(serviceName string, cfgs ...*aws.Config) Config
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfigNoResolveEndpointProvider same as ConfigProvider except it will not
|
||||||
|
// resolve the endpoint automatically. The service client's endpoint must be
|
||||||
|
// provided via the aws.Config.Endpoint field.
|
||||||
|
type ConfigNoResolveEndpointProvider interface {
|
||||||
|
ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) Config
|
||||||
|
}
|
||||||
|
|
||||||
// A Client implements the base client request and response handling
|
// A Client implements the base client request and response handling
|
||||||
// used by all service clients.
|
// used by all service clients.
|
||||||
type Client struct {
|
type Client struct {
|
||||||
|
@ -39,7 +45,7 @@ func New(cfg aws.Config, info metadata.ClientInfo, handlers request.Handlers, op
|
||||||
svc := &Client{
|
svc := &Client{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
ClientInfo: info,
|
ClientInfo: info,
|
||||||
Handlers: handlers,
|
Handlers: handlers.Copy(),
|
||||||
}
|
}
|
||||||
|
|
||||||
switch retryer, ok := cfg.Retryer.(request.Retryer); {
|
switch retryer, ok := cfg.Retryer.(request.Retryer); {
|
||||||
|
@ -79,61 +85,6 @@ func (c *Client) AddDebugHandlers() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Handlers.Send.PushFront(logRequest)
|
c.Handlers.Send.PushFrontNamed(request.NamedHandler{Name: "awssdk.client.LogRequest", Fn: logRequest})
|
||||||
c.Handlers.Send.PushBack(logResponse)
|
c.Handlers.Send.PushBackNamed(request.NamedHandler{Name: "awssdk.client.LogResponse", Fn: logResponse})
|
||||||
}
|
|
||||||
|
|
||||||
const logReqMsg = `DEBUG: Request %s/%s Details:
|
|
||||||
---[ REQUEST POST-SIGN ]-----------------------------
|
|
||||||
%s
|
|
||||||
-----------------------------------------------------`
|
|
||||||
|
|
||||||
const logReqErrMsg = `DEBUG ERROR: Request %s/%s:
|
|
||||||
---[ REQUEST DUMP ERROR ]-----------------------------
|
|
||||||
%s
|
|
||||||
-----------------------------------------------------`
|
|
||||||
|
|
||||||
func logRequest(r *request.Request) {
|
|
||||||
logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody)
|
|
||||||
dumpedBody, err := httputil.DumpRequestOut(r.HTTPRequest, logBody)
|
|
||||||
if err != nil {
|
|
||||||
r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, r.ClientInfo.ServiceName, r.Operation.Name, err))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if logBody {
|
|
||||||
// Reset the request body because dumpRequest will re-wrap the r.HTTPRequest's
|
|
||||||
// Body as a NoOpCloser and will not be reset after read by the HTTP
|
|
||||||
// client reader.
|
|
||||||
r.ResetBody()
|
|
||||||
}
|
|
||||||
|
|
||||||
r.Config.Logger.Log(fmt.Sprintf(logReqMsg, r.ClientInfo.ServiceName, r.Operation.Name, string(dumpedBody)))
|
|
||||||
}
|
|
||||||
|
|
||||||
const logRespMsg = `DEBUG: Response %s/%s Details:
|
|
||||||
---[ RESPONSE ]--------------------------------------
|
|
||||||
%s
|
|
||||||
-----------------------------------------------------`
|
|
||||||
|
|
||||||
const logRespErrMsg = `DEBUG ERROR: Response %s/%s:
|
|
||||||
---[ RESPONSE DUMP ERROR ]-----------------------------
|
|
||||||
%s
|
|
||||||
-----------------------------------------------------`
|
|
||||||
|
|
||||||
func logResponse(r *request.Request) {
|
|
||||||
var msg = "no response data"
|
|
||||||
if r.HTTPResponse != nil {
|
|
||||||
logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody)
|
|
||||||
dumpedBody, err := httputil.DumpResponse(r.HTTPResponse, logBody)
|
|
||||||
if err != nil {
|
|
||||||
r.Config.Logger.Log(fmt.Sprintf(logRespErrMsg, r.ClientInfo.ServiceName, r.Operation.Name, err))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg = string(dumpedBody)
|
|
||||||
} else if r.Error != nil {
|
|
||||||
msg = r.Error.Error()
|
|
||||||
}
|
|
||||||
r.Config.Logger.Log(fmt.Sprintf(logRespMsg, r.ClientInfo.ServiceName, r.Operation.Name, msg))
|
|
||||||
}
|
}
|
||||||
|
|
68
vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go
generated
vendored
68
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"
|
||||||
|
|
||||||
|
@ -15,11 +16,11 @@ import (
|
||||||
// the MaxRetries method:
|
// the MaxRetries method:
|
||||||
//
|
//
|
||||||
// type retryer struct {
|
// type retryer struct {
|
||||||
// service.DefaultRetryer
|
// client.DefaultRetryer
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// // This implementation always has 100 max retries
|
// // This implementation always has 100 max retries
|
||||||
// func (d retryer) MaxRetries() uint { return 100 }
|
// func (d retryer) MaxRetries() int { return 100 }
|
||||||
type DefaultRetryer struct {
|
type DefaultRetryer struct {
|
||||||
NumMaxRetries int
|
NumMaxRetries int
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -54,6 +59,12 @@ func (d DefaultRetryer) RetryRules(r *request.Request) time.Duration {
|
||||||
|
|
||||||
// ShouldRetry returns true if the request should be retried.
|
// ShouldRetry returns true if the request should be retried.
|
||||||
func (d DefaultRetryer) ShouldRetry(r *request.Request) bool {
|
func (d DefaultRetryer) ShouldRetry(r *request.Request) bool {
|
||||||
|
// If one of the other handlers already set the retry state
|
||||||
|
// we don't want to override it based on the service's state
|
||||||
|
if r.Retryable != nil {
|
||||||
|
return *r.Retryable
|
||||||
|
}
|
||||||
|
|
||||||
if r.HTTPResponse.StatusCode >= 500 {
|
if r.HTTPResponse.StatusCode >= 500 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -62,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
|
||||||
|
|
108
vendor/github.com/aws/aws-sdk-go/aws/client/logger.go
generated
vendored
Normal file
108
vendor/github.com/aws/aws-sdk-go/aws/client/logger.go
generated
vendored
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http/httputil"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
const logReqMsg = `DEBUG: Request %s/%s Details:
|
||||||
|
---[ REQUEST POST-SIGN ]-----------------------------
|
||||||
|
%s
|
||||||
|
-----------------------------------------------------`
|
||||||
|
|
||||||
|
const logReqErrMsg = `DEBUG ERROR: Request %s/%s:
|
||||||
|
---[ REQUEST DUMP ERROR ]-----------------------------
|
||||||
|
%s
|
||||||
|
------------------------------------------------------`
|
||||||
|
|
||||||
|
type logWriter struct {
|
||||||
|
// Logger is what we will use to log the payload of a response.
|
||||||
|
Logger aws.Logger
|
||||||
|
// buf stores the contents of what has been read
|
||||||
|
buf *bytes.Buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (logger *logWriter) Write(b []byte) (int, error) {
|
||||||
|
return logger.buf.Write(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
type teeReaderCloser struct {
|
||||||
|
// io.Reader will be a tee reader that is used during logging.
|
||||||
|
// This structure will read from a body and write the contents to a logger.
|
||||||
|
io.Reader
|
||||||
|
// Source is used just to close when we are done reading.
|
||||||
|
Source io.ReadCloser
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reader *teeReaderCloser) Close() error {
|
||||||
|
return reader.Source.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func logRequest(r *request.Request) {
|
||||||
|
logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody)
|
||||||
|
dumpedBody, err := httputil.DumpRequestOut(r.HTTPRequest, logBody)
|
||||||
|
if err != nil {
|
||||||
|
r.Config.Logger.Log(fmt.Sprintf(logReqErrMsg, r.ClientInfo.ServiceName, r.Operation.Name, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if logBody {
|
||||||
|
// Reset the request body because dumpRequest will re-wrap the r.HTTPRequest's
|
||||||
|
// Body as a NoOpCloser and will not be reset after read by the HTTP
|
||||||
|
// client reader.
|
||||||
|
r.ResetBody()
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Config.Logger.Log(fmt.Sprintf(logReqMsg, r.ClientInfo.ServiceName, r.Operation.Name, string(dumpedBody)))
|
||||||
|
}
|
||||||
|
|
||||||
|
const logRespMsg = `DEBUG: Response %s/%s Details:
|
||||||
|
---[ RESPONSE ]--------------------------------------
|
||||||
|
%s
|
||||||
|
-----------------------------------------------------`
|
||||||
|
|
||||||
|
const logRespErrMsg = `DEBUG ERROR: Response %s/%s:
|
||||||
|
---[ RESPONSE DUMP ERROR ]-----------------------------
|
||||||
|
%s
|
||||||
|
-----------------------------------------------------`
|
||||||
|
|
||||||
|
func logResponse(r *request.Request) {
|
||||||
|
lw := &logWriter{r.Config.Logger, bytes.NewBuffer(nil)}
|
||||||
|
r.HTTPResponse.Body = &teeReaderCloser{
|
||||||
|
Reader: io.TeeReader(r.HTTPResponse.Body, lw),
|
||||||
|
Source: r.HTTPResponse.Body,
|
||||||
|
}
|
||||||
|
|
||||||
|
handlerFn := func(req *request.Request) {
|
||||||
|
body, err := httputil.DumpResponse(req.HTTPResponse, false)
|
||||||
|
if err != nil {
|
||||||
|
lw.Logger.Log(fmt.Sprintf(logRespErrMsg, req.ClientInfo.ServiceName, req.Operation.Name, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
b, err := ioutil.ReadAll(lw.buf)
|
||||||
|
if err != nil {
|
||||||
|
lw.Logger.Log(fmt.Sprintf(logRespErrMsg, req.ClientInfo.ServiceName, req.Operation.Name, err))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
lw.Logger.Log(fmt.Sprintf(logRespMsg, req.ClientInfo.ServiceName, req.Operation.Name, string(body)))
|
||||||
|
if req.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody) {
|
||||||
|
lw.Logger.Log(string(b))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handlerName = "awsdk.client.LogResponse.ResponseBody"
|
||||||
|
|
||||||
|
r.Handlers.Unmarshal.SetBackNamed(request.NamedHandler{
|
||||||
|
Name: handlerName, Fn: handlerFn,
|
||||||
|
})
|
||||||
|
r.Handlers.UnmarshalError.SetBackNamed(request.NamedHandler{
|
||||||
|
Name: handlerName, Fn: handlerFn,
|
||||||
|
})
|
||||||
|
}
|
34
vendor/github.com/aws/aws-sdk-go/aws/config.go
generated
vendored
34
vendor/github.com/aws/aws-sdk-go/aws/config.go
generated
vendored
|
@ -22,9 +22,9 @@ type RequestRetryer interface{}
|
||||||
//
|
//
|
||||||
// // Create Session with MaxRetry configuration to be shared by multiple
|
// // Create Session with MaxRetry configuration to be shared by multiple
|
||||||
// // service clients.
|
// // service clients.
|
||||||
// sess, err := session.NewSession(&aws.Config{
|
// sess := session.Must(session.NewSession(&aws.Config{
|
||||||
// MaxRetries: aws.Int(3),
|
// MaxRetries: aws.Int(3),
|
||||||
// })
|
// }))
|
||||||
//
|
//
|
||||||
// // Create S3 service client with a specific Region.
|
// // Create S3 service client with a specific Region.
|
||||||
// svc := s3.New(sess, &aws.Config{
|
// svc := s3.New(sess, &aws.Config{
|
||||||
|
@ -53,6 +53,13 @@ type Config struct {
|
||||||
// to use based on region.
|
// to use based on region.
|
||||||
EndpointResolver endpoints.Resolver
|
EndpointResolver endpoints.Resolver
|
||||||
|
|
||||||
|
// EnforceShouldRetryCheck is used in the AfterRetryHandler to always call
|
||||||
|
// ShouldRetry regardless of whether or not if request.Retryable is set.
|
||||||
|
// This will utilize ShouldRetry method of custom retryers. If EnforceShouldRetryCheck
|
||||||
|
// is not set, then ShouldRetry will only be called if request.Retryable is nil.
|
||||||
|
// Proper handling of the request.Retryable field is important when setting this field.
|
||||||
|
EnforceShouldRetryCheck *bool
|
||||||
|
|
||||||
// The region to send requests to. This parameter is required and must
|
// The region to send requests to. This parameter is required and must
|
||||||
// be configured globally or on a per-client basis unless otherwise
|
// be configured globally or on a per-client basis unless otherwise
|
||||||
// noted. A full list of regions is found in the "Regions and Endpoints"
|
// noted. A full list of regions is found in the "Regions and Endpoints"
|
||||||
|
@ -88,7 +95,7 @@ type Config struct {
|
||||||
// recoverable failures.
|
// recoverable failures.
|
||||||
//
|
//
|
||||||
// When nil or the value does not implement the request.Retryer interface,
|
// When nil or the value does not implement the request.Retryer interface,
|
||||||
// the request.DefaultRetryer will be used.
|
// the client.DefaultRetryer will be used.
|
||||||
//
|
//
|
||||||
// When both Retryer and MaxRetries are non-nil, the former is used and
|
// When both Retryer and MaxRetries are non-nil, the former is used and
|
||||||
// the latter ignored.
|
// the latter ignored.
|
||||||
|
@ -154,7 +161,8 @@ type Config struct {
|
||||||
// the EC2Metadata overriding the timeout for default credentials chain.
|
// the EC2Metadata overriding the timeout for default credentials chain.
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
// sess, err := session.NewSession(aws.NewConfig().WithEC2MetadataDiableTimeoutOverride(true))
|
// sess := session.Must(session.NewSession(aws.NewConfig()
|
||||||
|
// .WithEC2MetadataDiableTimeoutOverride(true)))
|
||||||
//
|
//
|
||||||
// svc := s3.New(sess)
|
// svc := s3.New(sess)
|
||||||
//
|
//
|
||||||
|
@ -174,7 +182,7 @@ type Config struct {
|
||||||
//
|
//
|
||||||
// Only supported with.
|
// Only supported with.
|
||||||
//
|
//
|
||||||
// sess, err := session.NewSession()
|
// sess := session.Must(session.NewSession())
|
||||||
//
|
//
|
||||||
// svc := s3.New(sess, &aws.Config{
|
// svc := s3.New(sess, &aws.Config{
|
||||||
// UseDualStack: aws.Bool(true),
|
// UseDualStack: aws.Bool(true),
|
||||||
|
@ -186,13 +194,19 @@ type Config struct {
|
||||||
// request delays. This value should only be used for testing. To adjust
|
// request delays. This value should only be used for testing. To adjust
|
||||||
// the delay of a request see the aws/client.DefaultRetryer and
|
// the delay of a request see the aws/client.DefaultRetryer and
|
||||||
// aws/request.Retryer.
|
// aws/request.Retryer.
|
||||||
|
//
|
||||||
|
// SleepDelay will prevent any Context from being used for canceling retry
|
||||||
|
// delay of an API operation. It is recommended to not use SleepDelay at all
|
||||||
|
// and specify a Retryer instead.
|
||||||
SleepDelay func(time.Duration)
|
SleepDelay func(time.Duration)
|
||||||
|
|
||||||
// DisableRestProtocolURICleaning will not clean the URL path when making rest protocol requests.
|
// DisableRestProtocolURICleaning will not clean the URL path when making rest protocol requests.
|
||||||
// Will default to false. This would only be used for empty directory names in s3 requests.
|
// Will default to false. This would only be used for empty directory names in s3 requests.
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
// sess, err := session.NewSession(&aws.Config{DisableRestProtocolURICleaning: aws.Bool(true))
|
// sess := session.Must(session.NewSession(&aws.Config{
|
||||||
|
// DisableRestProtocolURICleaning: aws.Bool(true),
|
||||||
|
// }))
|
||||||
//
|
//
|
||||||
// svc := s3.New(sess)
|
// svc := s3.New(sess)
|
||||||
// out, err := svc.GetObject(&s3.GetObjectInput {
|
// out, err := svc.GetObject(&s3.GetObjectInput {
|
||||||
|
@ -207,9 +221,9 @@ type Config struct {
|
||||||
//
|
//
|
||||||
// // Create Session with MaxRetry configuration to be shared by multiple
|
// // Create Session with MaxRetry configuration to be shared by multiple
|
||||||
// // service clients.
|
// // service clients.
|
||||||
// sess, err := session.NewSession(aws.NewConfig().
|
// sess := session.Must(session.NewSession(aws.NewConfig().
|
||||||
// WithMaxRetries(3),
|
// WithMaxRetries(3),
|
||||||
// )
|
// ))
|
||||||
//
|
//
|
||||||
// // Create S3 service client with a specific Region.
|
// // Create S3 service client with a specific Region.
|
||||||
// svc := s3.New(sess, aws.NewConfig().
|
// svc := s3.New(sess, aws.NewConfig().
|
||||||
|
@ -436,6 +450,10 @@ func mergeInConfig(dst *Config, other *Config) {
|
||||||
if other.DisableRestProtocolURICleaning != nil {
|
if other.DisableRestProtocolURICleaning != nil {
|
||||||
dst.DisableRestProtocolURICleaning = other.DisableRestProtocolURICleaning
|
dst.DisableRestProtocolURICleaning = other.DisableRestProtocolURICleaning
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if other.EnforceShouldRetryCheck != nil {
|
||||||
|
dst.EnforceShouldRetryCheck = other.EnforceShouldRetryCheck
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy will return a shallow copy of the Config object. If any additional
|
// Copy will return a shallow copy of the Config object. If any additional
|
||||||
|
|
71
vendor/github.com/aws/aws-sdk-go/aws/context.go
generated
vendored
Normal file
71
vendor/github.com/aws/aws-sdk-go/aws/context.go
generated
vendored
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
package aws
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Context is an copy of the Go v1.7 stdlib's context.Context interface.
|
||||||
|
// It is represented as a SDK interface to enable you to use the "WithContext"
|
||||||
|
// API methods with Go v1.6 and a Context type such as golang.org/x/net/context.
|
||||||
|
//
|
||||||
|
// See https://golang.org/pkg/context on how to use contexts.
|
||||||
|
type Context interface {
|
||||||
|
// Deadline returns the time when work done on behalf of this context
|
||||||
|
// should be canceled. Deadline returns ok==false when no deadline is
|
||||||
|
// set. Successive calls to Deadline return the same results.
|
||||||
|
Deadline() (deadline time.Time, ok bool)
|
||||||
|
|
||||||
|
// Done returns a channel that's closed when work done on behalf of this
|
||||||
|
// context should be canceled. Done may return nil if this context can
|
||||||
|
// never be canceled. Successive calls to Done return the same value.
|
||||||
|
Done() <-chan struct{}
|
||||||
|
|
||||||
|
// Err returns a non-nil error value after Done is closed. Err returns
|
||||||
|
// Canceled if the context was canceled or DeadlineExceeded if the
|
||||||
|
// context's deadline passed. No other values for Err are defined.
|
||||||
|
// After Done is closed, successive calls to Err return the same value.
|
||||||
|
Err() error
|
||||||
|
|
||||||
|
// Value returns the value associated with this context for key, or nil
|
||||||
|
// if no value is associated with key. Successive calls to Value with
|
||||||
|
// the same key returns the same result.
|
||||||
|
//
|
||||||
|
// Use context values only for request-scoped data that transits
|
||||||
|
// processes and API boundaries, not for passing optional parameters to
|
||||||
|
// functions.
|
||||||
|
Value(key interface{}) interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// BackgroundContext returns a context that will never be canceled, has no
|
||||||
|
// values, and no deadline. This context is used by the SDK to provide
|
||||||
|
// backwards compatibility with non-context API operations and functionality.
|
||||||
|
//
|
||||||
|
// Go 1.6 and before:
|
||||||
|
// This context function is equivalent to context.Background in the Go stdlib.
|
||||||
|
//
|
||||||
|
// Go 1.7 and later:
|
||||||
|
// The context returned will be the value returned by context.Background()
|
||||||
|
//
|
||||||
|
// See https://golang.org/pkg/context for more information on Contexts.
|
||||||
|
func BackgroundContext() Context {
|
||||||
|
return backgroundCtx
|
||||||
|
}
|
||||||
|
|
||||||
|
// SleepWithContext will wait for the timer duration to expire, or the context
|
||||||
|
// is canceled. Which ever happens first. If the context is canceled the Context's
|
||||||
|
// error will be returned.
|
||||||
|
//
|
||||||
|
// Expects Context to always return a non-nil error if the Done channel is closed.
|
||||||
|
func SleepWithContext(ctx Context, dur time.Duration) error {
|
||||||
|
t := time.NewTimer(dur)
|
||||||
|
defer t.Stop()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-t.C:
|
||||||
|
break
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
41
vendor/github.com/aws/aws-sdk-go/aws/context_1_6.go
generated
vendored
Normal file
41
vendor/github.com/aws/aws-sdk-go/aws/context_1_6.go
generated
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
// +build !go1.7
|
||||||
|
|
||||||
|
package aws
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
// An emptyCtx is a copy of the Go 1.7 context.emptyCtx type. This is copied to
|
||||||
|
// provide a 1.6 and 1.5 safe version of context that is compatible with Go
|
||||||
|
// 1.7's Context.
|
||||||
|
//
|
||||||
|
// An emptyCtx is never canceled, has no values, and has no deadline. It is not
|
||||||
|
// struct{}, since vars of this type must have distinct addresses.
|
||||||
|
type emptyCtx int
|
||||||
|
|
||||||
|
func (*emptyCtx) Deadline() (deadline time.Time, ok bool) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*emptyCtx) Done() <-chan struct{} {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*emptyCtx) Err() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*emptyCtx) Value(key interface{}) interface{} {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *emptyCtx) String() string {
|
||||||
|
switch e {
|
||||||
|
case backgroundCtx:
|
||||||
|
return "aws.BackgroundContext"
|
||||||
|
}
|
||||||
|
return "unknown empty Context"
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
backgroundCtx = new(emptyCtx)
|
||||||
|
)
|
9
vendor/github.com/aws/aws-sdk-go/aws/context_1_7.go
generated
vendored
Normal file
9
vendor/github.com/aws/aws-sdk-go/aws/context_1_7.go
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
// +build go1.7
|
||||||
|
|
||||||
|
package aws
|
||||||
|
|
||||||
|
import "context"
|
||||||
|
|
||||||
|
var (
|
||||||
|
backgroundCtx = context.Background()
|
||||||
|
)
|
18
vendor/github.com/aws/aws-sdk-go/aws/convert_types.go
generated
vendored
18
vendor/github.com/aws/aws-sdk-go/aws/convert_types.go
generated
vendored
|
@ -311,6 +311,24 @@ func TimeValue(v *time.Time) time.Time {
|
||||||
return time.Time{}
|
return time.Time{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SecondsTimeValue converts an int64 pointer to a time.Time value
|
||||||
|
// representing seconds since Epoch or time.Time{} if the pointer is nil.
|
||||||
|
func SecondsTimeValue(v *int64) time.Time {
|
||||||
|
if v != nil {
|
||||||
|
return time.Unix((*v / 1000), 0)
|
||||||
|
}
|
||||||
|
return time.Time{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MillisecondsTimeValue converts an int64 pointer to a time.Time value
|
||||||
|
// representing milliseconds sinch Epoch or time.Time{} if the pointer is nil.
|
||||||
|
func MillisecondsTimeValue(v *int64) time.Time {
|
||||||
|
if v != nil {
|
||||||
|
return time.Unix(0, (*v * 1000000))
|
||||||
|
}
|
||||||
|
return time.Time{}
|
||||||
|
}
|
||||||
|
|
||||||
// TimeUnixMilli returns a Unix timestamp in milliseconds from "January 1, 1970 UTC".
|
// TimeUnixMilli returns a Unix timestamp in milliseconds from "January 1, 1970 UTC".
|
||||||
// The result is undefined if the Unix time cannot be represented by an int64.
|
// The result is undefined if the Unix time cannot be represented by an int64.
|
||||||
// Which includes calling TimeUnixMilli on a zero Time is undefined.
|
// Which includes calling TimeUnixMilli on a zero Time is undefined.
|
||||||
|
|
132
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go
generated
vendored
132
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go
generated
vendored
|
@ -27,7 +27,7 @@ type lener interface {
|
||||||
// or will use the HTTPRequest.Header's "Content-Length" if defined. If unable
|
// or will use the HTTPRequest.Header's "Content-Length" if defined. If unable
|
||||||
// to determine request body length and no "Content-Length" was specified it will panic.
|
// to determine request body length and no "Content-Length" was specified it will panic.
|
||||||
//
|
//
|
||||||
// The Content-Length will only be aded to the request if the length of the body
|
// The Content-Length will only be added to the request if the length of the body
|
||||||
// is greater than 0. If the body is empty or the current `Content-Length`
|
// is greater than 0. If the body is empty or the current `Content-Length`
|
||||||
// header is <= 0, the header will also be stripped.
|
// header is <= 0, the header will also be stripped.
|
||||||
var BuildContentLengthHandler = request.NamedHandler{Name: "core.BuildContentLengthHandler", Fn: func(r *request.Request) {
|
var BuildContentLengthHandler = request.NamedHandler{Name: "core.BuildContentLengthHandler", Fn: func(r *request.Request) {
|
||||||
|
@ -71,8 +71,8 @@ var reStatusCode = regexp.MustCompile(`^(\d{3})`)
|
||||||
|
|
||||||
// ValidateReqSigHandler is a request handler to ensure that the request's
|
// ValidateReqSigHandler is a request handler to ensure that the request's
|
||||||
// signature doesn't expire before it is sent. This can happen when a request
|
// signature doesn't expire before it is sent. This can happen when a request
|
||||||
// is built and signed signficantly before it is sent. Or significant delays
|
// is built and signed significantly before it is sent. Or significant delays
|
||||||
// occur whne retrying requests that would cause the signature to expire.
|
// occur when retrying requests that would cause the signature to expire.
|
||||||
var ValidateReqSigHandler = request.NamedHandler{
|
var ValidateReqSigHandler = request.NamedHandler{
|
||||||
Name: "core.ValidateReqSigHandler",
|
Name: "core.ValidateReqSigHandler",
|
||||||
Fn: func(r *request.Request) {
|
Fn: func(r *request.Request) {
|
||||||
|
@ -98,44 +98,95 @@ var ValidateReqSigHandler = request.NamedHandler{
|
||||||
}
|
}
|
||||||
|
|
||||||
// SendHandler is a request handler to send service request using HTTP client.
|
// SendHandler is a request handler to send service request using HTTP client.
|
||||||
var SendHandler = request.NamedHandler{Name: "core.SendHandler", Fn: func(r *request.Request) {
|
var SendHandler = request.NamedHandler{
|
||||||
var err error
|
Name: "core.SendHandler",
|
||||||
r.HTTPResponse, err = r.Config.HTTPClient.Do(r.HTTPRequest)
|
Fn: func(r *request.Request) {
|
||||||
if err != nil {
|
sender := sendFollowRedirects
|
||||||
// Prevent leaking if an HTTPResponse was returned. Clean up
|
if r.DisableFollowRedirects {
|
||||||
// the body.
|
sender = sendWithoutFollowRedirects
|
||||||
if r.HTTPResponse != nil {
|
|
||||||
r.HTTPResponse.Body.Close()
|
|
||||||
}
|
}
|
||||||
// Capture the case where url.Error is returned for error processing
|
|
||||||
// response. e.g. 301 without location header comes back as string
|
if request.NoBody == r.HTTPRequest.Body {
|
||||||
// error and r.HTTPResponse is nil. Other url redirect errors will
|
// Strip off the request body if the NoBody reader was used as a
|
||||||
// comeback in a similar method.
|
// place holder for a request body. This prevents the SDK from
|
||||||
if e, ok := err.(*url.Error); ok && e.Err != nil {
|
// making requests with a request body when it would be invalid
|
||||||
if s := reStatusCode.FindStringSubmatch(e.Err.Error()); s != nil {
|
// to do so.
|
||||||
code, _ := strconv.ParseInt(s[1], 10, 64)
|
//
|
||||||
r.HTTPResponse = &http.Response{
|
// Use a shallow copy of the http.Request to ensure the race condition
|
||||||
StatusCode: int(code),
|
// of transport on Body will not trigger
|
||||||
Status: http.StatusText(int(code)),
|
reqOrig, reqCopy := r.HTTPRequest, *r.HTTPRequest
|
||||||
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
|
reqCopy.Body = nil
|
||||||
}
|
r.HTTPRequest = &reqCopy
|
||||||
return
|
defer func() {
|
||||||
}
|
r.HTTPRequest = reqOrig
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
if r.HTTPResponse == nil {
|
|
||||||
// Add a dummy request response object to ensure the HTTPResponse
|
var err error
|
||||||
// value is consistent.
|
r.HTTPResponse, err = sender(r)
|
||||||
|
if err != nil {
|
||||||
|
handleSendError(r, err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendFollowRedirects(r *request.Request) (*http.Response, error) {
|
||||||
|
return r.Config.HTTPClient.Do(r.HTTPRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendWithoutFollowRedirects(r *request.Request) (*http.Response, error) {
|
||||||
|
transport := r.Config.HTTPClient.Transport
|
||||||
|
if transport == nil {
|
||||||
|
transport = http.DefaultTransport
|
||||||
|
}
|
||||||
|
|
||||||
|
return transport.RoundTrip(r.HTTPRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSendError(r *request.Request, err error) {
|
||||||
|
// Prevent leaking if an HTTPResponse was returned. Clean up
|
||||||
|
// the body.
|
||||||
|
if r.HTTPResponse != nil {
|
||||||
|
r.HTTPResponse.Body.Close()
|
||||||
|
}
|
||||||
|
// Capture the case where url.Error is returned for error processing
|
||||||
|
// response. e.g. 301 without location header comes back as string
|
||||||
|
// error and r.HTTPResponse is nil. Other URL redirect errors will
|
||||||
|
// comeback in a similar method.
|
||||||
|
if e, ok := err.(*url.Error); ok && e.Err != nil {
|
||||||
|
if s := reStatusCode.FindStringSubmatch(e.Err.Error()); s != nil {
|
||||||
|
code, _ := strconv.ParseInt(s[1], 10, 64)
|
||||||
r.HTTPResponse = &http.Response{
|
r.HTTPResponse = &http.Response{
|
||||||
StatusCode: int(0),
|
StatusCode: int(code),
|
||||||
Status: http.StatusText(int(0)),
|
Status: http.StatusText(int(code)),
|
||||||
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
|
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
// Catch all other request errors.
|
|
||||||
r.Error = awserr.New("RequestError", "send request failed", err)
|
|
||||||
r.Retryable = aws.Bool(true) // network errors are retryable
|
|
||||||
}
|
}
|
||||||
}}
|
if r.HTTPResponse == nil {
|
||||||
|
// Add a dummy request response object to ensure the HTTPResponse
|
||||||
|
// value is consistent.
|
||||||
|
r.HTTPResponse = &http.Response{
|
||||||
|
StatusCode: int(0),
|
||||||
|
Status: http.StatusText(int(0)),
|
||||||
|
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Catch all other request errors.
|
||||||
|
r.Error = awserr.New("RequestError", "send request failed", err)
|
||||||
|
r.Retryable = aws.Bool(true) // network errors are retryable
|
||||||
|
|
||||||
|
// Override the error with a context canceled error, if that was canceled.
|
||||||
|
ctx := r.Context()
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
r.Error = awserr.New(request.CanceledErrorCode,
|
||||||
|
"request context canceled", ctx.Err())
|
||||||
|
r.Retryable = aws.Bool(false)
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ValidateResponseHandler is a request handler to validate service response.
|
// ValidateResponseHandler is a request handler to validate service response.
|
||||||
var ValidateResponseHandler = request.NamedHandler{Name: "core.ValidateResponseHandler", Fn: func(r *request.Request) {
|
var ValidateResponseHandler = request.NamedHandler{Name: "core.ValidateResponseHandler", Fn: func(r *request.Request) {
|
||||||
|
@ -150,13 +201,22 @@ var ValidateResponseHandler = request.NamedHandler{Name: "core.ValidateResponseH
|
||||||
var AfterRetryHandler = request.NamedHandler{Name: "core.AfterRetryHandler", Fn: func(r *request.Request) {
|
var AfterRetryHandler = request.NamedHandler{Name: "core.AfterRetryHandler", Fn: func(r *request.Request) {
|
||||||
// If one of the other handlers already set the retry state
|
// If one of the other handlers already set the retry state
|
||||||
// we don't want to override it based on the service's state
|
// we don't want to override it based on the service's state
|
||||||
if r.Retryable == nil {
|
if r.Retryable == nil || aws.BoolValue(r.Config.EnforceShouldRetryCheck) {
|
||||||
r.Retryable = aws.Bool(r.ShouldRetry(r))
|
r.Retryable = aws.Bool(r.ShouldRetry(r))
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.WillRetry() {
|
if r.WillRetry() {
|
||||||
r.RetryDelay = r.RetryRules(r)
|
r.RetryDelay = r.RetryRules(r)
|
||||||
r.Config.SleepDelay(r.RetryDelay)
|
|
||||||
|
if sleepFn := r.Config.SleepDelay; sleepFn != nil {
|
||||||
|
// Support SleepDelay for backwards compatibility and testing
|
||||||
|
sleepFn(r.RetryDelay)
|
||||||
|
} else if err := aws.SleepWithContext(r.Context(), r.RetryDelay); err != nil {
|
||||||
|
r.Error = awserr.New(request.CanceledErrorCode,
|
||||||
|
"request context canceled", err)
|
||||||
|
r.Retryable = aws.Bool(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// when the expired token exception occurs the credentials
|
// when the expired token exception occurs the credentials
|
||||||
// need to be expired locally so that the next request to
|
// need to be expired locally so that the next request to
|
||||||
|
|
14
vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go
generated
vendored
14
vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go
generated
vendored
|
@ -13,7 +13,7 @@ var (
|
||||||
//
|
//
|
||||||
// @readonly
|
// @readonly
|
||||||
ErrNoValidProvidersFoundInChain = awserr.New("NoCredentialProviders",
|
ErrNoValidProvidersFoundInChain = awserr.New("NoCredentialProviders",
|
||||||
`no valid providers in chain. Deprecated.
|
`no valid providers in chain. Deprecated.
|
||||||
For verbose messaging see aws.Config.CredentialsChainVerboseErrors`,
|
For verbose messaging see aws.Config.CredentialsChainVerboseErrors`,
|
||||||
nil)
|
nil)
|
||||||
)
|
)
|
||||||
|
@ -39,16 +39,18 @@ var (
|
||||||
// does not return any credentials ChainProvider will return the error
|
// does not return any credentials ChainProvider will return the error
|
||||||
// ErrNoValidProvidersFoundInChain
|
// ErrNoValidProvidersFoundInChain
|
||||||
//
|
//
|
||||||
// creds := NewChainCredentials(
|
// creds := credentials.NewChainCredentials(
|
||||||
// []Provider{
|
// []credentials.Provider{
|
||||||
// &EnvProvider{},
|
// &credentials.EnvProvider{},
|
||||||
// &EC2RoleProvider{
|
// &ec2rolecreds.EC2RoleProvider{
|
||||||
// Client: ec2metadata.New(sess),
|
// Client: ec2metadata.New(sess),
|
||||||
// },
|
// },
|
||||||
// })
|
// })
|
||||||
//
|
//
|
||||||
// // Usage of ChainCredentials with aws.Config
|
// // Usage of ChainCredentials with aws.Config
|
||||||
// svc := ec2.New(&aws.Config{Credentials: creds})
|
// svc := ec2.New(session.Must(session.NewSession(&aws.Config{
|
||||||
|
// Credentials: creds,
|
||||||
|
// })))
|
||||||
//
|
//
|
||||||
type ChainProvider struct {
|
type ChainProvider struct {
|
||||||
Providers []Provider
|
Providers []Provider
|
||||||
|
|
33
vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go
generated
vendored
33
vendor/github.com/aws/aws-sdk-go/aws/credentials/credentials.go
generated
vendored
|
@ -14,7 +14,7 @@
|
||||||
//
|
//
|
||||||
// Example of using the environment variable credentials.
|
// Example of using the environment variable credentials.
|
||||||
//
|
//
|
||||||
// creds := NewEnvCredentials()
|
// creds := credentials.NewEnvCredentials()
|
||||||
//
|
//
|
||||||
// // Retrieve the credentials value
|
// // Retrieve the credentials value
|
||||||
// credValue, err := creds.Get()
|
// credValue, err := creds.Get()
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
// This may be helpful to proactively expire credentials and refresh them sooner
|
// This may be helpful to proactively expire credentials and refresh them sooner
|
||||||
// than they would naturally expire on their own.
|
// than they would naturally expire on their own.
|
||||||
//
|
//
|
||||||
// creds := NewCredentials(&EC2RoleProvider{})
|
// creds := credentials.NewCredentials(&ec2rolecreds.EC2RoleProvider{})
|
||||||
// creds.Expire()
|
// creds.Expire()
|
||||||
// credsValue, err := creds.Get()
|
// credsValue, err := creds.Get()
|
||||||
// // New credentials will be retrieved instead of from cache.
|
// // New credentials will be retrieved instead of from cache.
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
// func (m *MyProvider) Retrieve() (Value, error) {...}
|
// func (m *MyProvider) Retrieve() (Value, error) {...}
|
||||||
// func (m *MyProvider) IsExpired() bool {...}
|
// func (m *MyProvider) IsExpired() bool {...}
|
||||||
//
|
//
|
||||||
// creds := NewCredentials(&MyProvider{})
|
// creds := credentials.NewCredentials(&MyProvider{})
|
||||||
// credValue, err := creds.Get()
|
// credValue, err := creds.Get()
|
||||||
//
|
//
|
||||||
package credentials
|
package credentials
|
||||||
|
@ -60,7 +60,9 @@ import (
|
||||||
// when making service API calls. For example, when accessing public
|
// when making service API calls. For example, when accessing public
|
||||||
// s3 buckets.
|
// s3 buckets.
|
||||||
//
|
//
|
||||||
// svc := s3.New(&aws.Config{Credentials: AnonymousCredentials})
|
// svc := s3.New(session.Must(session.NewSession(&aws.Config{
|
||||||
|
// Credentials: credentials.AnonymousCredentials,
|
||||||
|
// })))
|
||||||
// // Access public S3 buckets.
|
// // Access public S3 buckets.
|
||||||
//
|
//
|
||||||
// @readonly
|
// @readonly
|
||||||
|
@ -88,7 +90,7 @@ type Value struct {
|
||||||
// The Provider should not need to implement its own mutexes, because
|
// The Provider should not need to implement its own mutexes, because
|
||||||
// that will be managed by Credentials.
|
// that will be managed by Credentials.
|
||||||
type Provider interface {
|
type Provider interface {
|
||||||
// Refresh returns nil if it successfully retrieved the value.
|
// Retrieve returns nil if it successfully retrieved the value.
|
||||||
// Error is returned if the value were not obtainable, or empty.
|
// Error is returned if the value were not obtainable, or empty.
|
||||||
Retrieve() (Value, error)
|
Retrieve() (Value, error)
|
||||||
|
|
||||||
|
@ -97,6 +99,27 @@ type Provider interface {
|
||||||
IsExpired() bool
|
IsExpired() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// An ErrorProvider is a stub credentials provider that always returns an error
|
||||||
|
// this is used by the SDK when construction a known provider is not possible
|
||||||
|
// due to an error.
|
||||||
|
type ErrorProvider struct {
|
||||||
|
// The error to be returned from Retrieve
|
||||||
|
Err error
|
||||||
|
|
||||||
|
// The provider name to set on the Retrieved returned Value
|
||||||
|
ProviderName string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve will always return the error that the ErrorProvider was created with.
|
||||||
|
func (p ErrorProvider) Retrieve() (Value, error) {
|
||||||
|
return Value{ProviderName: p.ProviderName}, p.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsExpired will always return not expired.
|
||||||
|
func (p ErrorProvider) IsExpired() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
// A Expiry provides shared expiration logic to be used by credentials
|
// A Expiry provides shared expiration logic to be used by credentials
|
||||||
// providers to implement expiry functionality.
|
// providers to implement expiry functionality.
|
||||||
//
|
//
|
||||||
|
|
1
vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go
generated
vendored
1
vendor/github.com/aws/aws-sdk-go/aws/credentials/env_provider.go
generated
vendored
|
@ -29,6 +29,7 @@ var (
|
||||||
// Environment variables used:
|
// Environment variables used:
|
||||||
//
|
//
|
||||||
// * Access Key ID: AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY
|
// * Access Key ID: AWS_ACCESS_KEY_ID or AWS_ACCESS_KEY
|
||||||
|
//
|
||||||
// * Secret Access Key: AWS_SECRET_ACCESS_KEY or AWS_SECRET_KEY
|
// * Secret Access Key: AWS_SECRET_ACCESS_KEY or AWS_SECRET_KEY
|
||||||
type EnvProvider struct {
|
type EnvProvider struct {
|
||||||
retrieved bool
|
retrieved bool
|
||||||
|
|
33
vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go
generated
vendored
33
vendor/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go
generated
vendored
|
@ -3,11 +3,11 @@ package credentials
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/go-ini/ini"
|
"github.com/go-ini/ini"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/shareddefaults"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SharedCredsProviderName provides a name of SharedCreds provider
|
// SharedCredsProviderName provides a name of SharedCreds provider
|
||||||
|
@ -15,8 +15,6 @@ const SharedCredsProviderName = "SharedCredentialsProvider"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrSharedCredentialsHomeNotFound is emitted when the user directory cannot be found.
|
// ErrSharedCredentialsHomeNotFound is emitted when the user directory cannot be found.
|
||||||
//
|
|
||||||
// @readonly
|
|
||||||
ErrSharedCredentialsHomeNotFound = awserr.New("UserHomeNotFound", "user home directory not found.", nil)
|
ErrSharedCredentialsHomeNotFound = awserr.New("UserHomeNotFound", "user home directory not found.", nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -117,22 +115,23 @@ func loadProfile(filename, profile string) (Value, error) {
|
||||||
//
|
//
|
||||||
// Will return an error if the user's home directory path cannot be found.
|
// Will return an error if the user's home directory path cannot be found.
|
||||||
func (p *SharedCredentialsProvider) filename() (string, error) {
|
func (p *SharedCredentialsProvider) filename() (string, error) {
|
||||||
if p.Filename == "" {
|
if len(p.Filename) != 0 {
|
||||||
if p.Filename = os.Getenv("AWS_SHARED_CREDENTIALS_FILE"); p.Filename != "" {
|
return p.Filename, nil
|
||||||
return p.Filename, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
homeDir := os.Getenv("HOME") // *nix
|
|
||||||
if homeDir == "" { // Windows
|
|
||||||
homeDir = os.Getenv("USERPROFILE")
|
|
||||||
}
|
|
||||||
if homeDir == "" {
|
|
||||||
return "", ErrSharedCredentialsHomeNotFound
|
|
||||||
}
|
|
||||||
|
|
||||||
p.Filename = filepath.Join(homeDir, ".aws", "credentials")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if p.Filename = os.Getenv("AWS_SHARED_CREDENTIALS_FILE"); len(p.Filename) != 0 {
|
||||||
|
return p.Filename, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if home := shareddefaults.UserHomeDir(); len(home) == 0 {
|
||||||
|
// Backwards compatibility of home directly not found error being returned.
|
||||||
|
// This error is too verbose, failure when opening the file would of been
|
||||||
|
// a better error to return.
|
||||||
|
return "", ErrSharedCredentialsHomeNotFound
|
||||||
|
}
|
||||||
|
|
||||||
|
p.Filename = shareddefaults.SharedCredentialsFilename()
|
||||||
|
|
||||||
return p.Filename, nil
|
return p.Filename, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
159
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go
generated
vendored
159
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go
generated
vendored
|
@ -1,7 +1,81 @@
|
||||||
// Package stscreds are credential Providers to retrieve STS AWS credentials.
|
/*
|
||||||
//
|
Package stscreds are credential Providers to retrieve STS AWS credentials.
|
||||||
// STS provides multiple ways to retrieve credentials which can be used when making
|
|
||||||
// future AWS service API operation calls.
|
STS provides multiple ways to retrieve credentials which can be used when making
|
||||||
|
future AWS service API operation calls.
|
||||||
|
|
||||||
|
The SDK will ensure that per instance of credentials.Credentials all requests
|
||||||
|
to refresh the credentials will be synchronized. But, the SDK is unable to
|
||||||
|
ensure synchronous usage of the AssumeRoleProvider if the value is shared
|
||||||
|
between multiple Credentials, Sessions or service clients.
|
||||||
|
|
||||||
|
Assume Role
|
||||||
|
|
||||||
|
To assume an IAM role using STS with the SDK you can create a new Credentials
|
||||||
|
with the SDKs's stscreds package.
|
||||||
|
|
||||||
|
// Initial credentials loaded from SDK's default credential chain. Such as
|
||||||
|
// the environment, shared credentials (~/.aws/credentials), or EC2 Instance
|
||||||
|
// Role. These credentials will be used to to make the STS Assume Role API.
|
||||||
|
sess := session.Must(session.NewSession())
|
||||||
|
|
||||||
|
// Create the credentials from AssumeRoleProvider to assume the role
|
||||||
|
// referenced by the "myRoleARN" ARN.
|
||||||
|
creds := stscreds.NewCredentials(sess, "myRoleArn")
|
||||||
|
|
||||||
|
// Create service client value configured for credentials
|
||||||
|
// from assumed role.
|
||||||
|
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
||||||
|
|
||||||
|
Assume Role with static MFA Token
|
||||||
|
|
||||||
|
To assume an IAM role with a MFA token you can either specify a MFA token code
|
||||||
|
directly or provide a function to prompt the user each time the credentials
|
||||||
|
need to refresh the role's credentials. Specifying the TokenCode should be used
|
||||||
|
for short lived operations that will not need to be refreshed, and when you do
|
||||||
|
not want to have direct control over the user provides their MFA token.
|
||||||
|
|
||||||
|
With TokenCode the AssumeRoleProvider will be not be able to refresh the role's
|
||||||
|
credentials.
|
||||||
|
|
||||||
|
// Create the credentials from AssumeRoleProvider to assume the role
|
||||||
|
// referenced by the "myRoleARN" ARN using the MFA token code provided.
|
||||||
|
creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) {
|
||||||
|
p.SerialNumber = aws.String("myTokenSerialNumber")
|
||||||
|
p.TokenCode = aws.String("00000000")
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create service client value configured for credentials
|
||||||
|
// from assumed role.
|
||||||
|
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
||||||
|
|
||||||
|
Assume Role with MFA Token Provider
|
||||||
|
|
||||||
|
To assume an IAM role with MFA for longer running tasks where the credentials
|
||||||
|
may need to be refreshed setting the TokenProvider field of AssumeRoleProvider
|
||||||
|
will allow the credential provider to prompt for new MFA token code when the
|
||||||
|
role's credentials need to be refreshed.
|
||||||
|
|
||||||
|
The StdinTokenProvider function is available to prompt on stdin to retrieve
|
||||||
|
the MFA token code from the user. You can also implement custom prompts by
|
||||||
|
satisfing the TokenProvider function signature.
|
||||||
|
|
||||||
|
Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will
|
||||||
|
have undesirable results as the StdinTokenProvider will not be synchronized. A
|
||||||
|
single Credentials with an AssumeRoleProvider can be shared safely.
|
||||||
|
|
||||||
|
// Create the credentials from AssumeRoleProvider to assume the role
|
||||||
|
// referenced by the "myRoleARN" ARN. Prompting for MFA token from stdin.
|
||||||
|
creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) {
|
||||||
|
p.SerialNumber = aws.String("myTokenSerialNumber")
|
||||||
|
p.TokenProvider = stscreds.StdinTokenProvider
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create service client value configured for credentials
|
||||||
|
// from assumed role.
|
||||||
|
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
||||||
|
|
||||||
|
*/
|
||||||
package stscreds
|
package stscreds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -9,11 +83,31 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"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/client"
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
"github.com/aws/aws-sdk-go/service/sts"
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// StdinTokenProvider will prompt on stdout and read from stdin for a string value.
|
||||||
|
// An error is returned if reading from stdin fails.
|
||||||
|
//
|
||||||
|
// Use this function go read MFA tokens from stdin. The function makes no attempt
|
||||||
|
// to make atomic prompts from stdin across multiple gorouties.
|
||||||
|
//
|
||||||
|
// Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will
|
||||||
|
// have undesirable results as the StdinTokenProvider will not be synchronized. A
|
||||||
|
// single Credentials with an AssumeRoleProvider can be shared safely
|
||||||
|
//
|
||||||
|
// Will wait forever until something is provided on the stdin.
|
||||||
|
func StdinTokenProvider() (string, error) {
|
||||||
|
var v string
|
||||||
|
fmt.Printf("Assume Role MFA token code: ")
|
||||||
|
_, err := fmt.Scanln(&v)
|
||||||
|
|
||||||
|
return v, err
|
||||||
|
}
|
||||||
|
|
||||||
// ProviderName provides a name of AssumeRole provider
|
// ProviderName provides a name of AssumeRole provider
|
||||||
const ProviderName = "AssumeRoleProvider"
|
const ProviderName = "AssumeRoleProvider"
|
||||||
|
|
||||||
|
@ -27,8 +121,15 @@ type AssumeRoler interface {
|
||||||
var DefaultDuration = time.Duration(15) * time.Minute
|
var DefaultDuration = time.Duration(15) * time.Minute
|
||||||
|
|
||||||
// AssumeRoleProvider retrieves temporary credentials from the STS service, and
|
// AssumeRoleProvider retrieves temporary credentials from the STS service, and
|
||||||
// keeps track of their expiration time. This provider must be used explicitly,
|
// keeps track of their expiration time.
|
||||||
// as it is not included in the credentials chain.
|
//
|
||||||
|
// This credential provider will be used by the SDKs default credential change
|
||||||
|
// when shared configuration is enabled, and the shared config or shared credentials
|
||||||
|
// file configure assume role. See Session docs for how to do this.
|
||||||
|
//
|
||||||
|
// AssumeRoleProvider does not provide any synchronization and it is not safe
|
||||||
|
// to share this value across multiple Credentials, Sessions, or service clients
|
||||||
|
// without also sharing the same Credentials instance.
|
||||||
type AssumeRoleProvider struct {
|
type AssumeRoleProvider struct {
|
||||||
credentials.Expiry
|
credentials.Expiry
|
||||||
|
|
||||||
|
@ -65,8 +166,23 @@ type AssumeRoleProvider struct {
|
||||||
// assumed requires MFA (that is, if the policy includes a condition that tests
|
// assumed requires MFA (that is, if the policy includes a condition that tests
|
||||||
// for MFA). If the role being assumed requires MFA and if the TokenCode value
|
// for MFA). If the role being assumed requires MFA and if the TokenCode value
|
||||||
// is missing or expired, the AssumeRole call returns an "access denied" error.
|
// is missing or expired, the AssumeRole call returns an "access denied" error.
|
||||||
|
//
|
||||||
|
// If SerialNumber is set and neither TokenCode nor TokenProvider are also
|
||||||
|
// set an error will be returned.
|
||||||
TokenCode *string
|
TokenCode *string
|
||||||
|
|
||||||
|
// Async method of providing MFA token code for assuming an IAM role with MFA.
|
||||||
|
// The value returned by the function will be used as the TokenCode in the Retrieve
|
||||||
|
// call. See StdinTokenProvider for a provider that prompts and reads from stdin.
|
||||||
|
//
|
||||||
|
// This token provider will be called when ever the assumed role's
|
||||||
|
// credentials need to be refreshed when SerialNumber is also set and
|
||||||
|
// TokenCode is not set.
|
||||||
|
//
|
||||||
|
// If both TokenCode and TokenProvider is set, TokenProvider will be used and
|
||||||
|
// TokenCode is ignored.
|
||||||
|
TokenProvider func() (string, error)
|
||||||
|
|
||||||
// ExpiryWindow will allow the credentials to trigger refreshing prior to
|
// ExpiryWindow will allow the credentials to trigger refreshing prior to
|
||||||
// the credentials actually expiring. This is beneficial so race conditions
|
// the credentials actually expiring. This is beneficial so race conditions
|
||||||
// with expiring credentials do not cause request to fail unexpectedly
|
// with expiring credentials do not cause request to fail unexpectedly
|
||||||
|
@ -85,6 +201,10 @@ type AssumeRoleProvider struct {
|
||||||
//
|
//
|
||||||
// Takes a Config provider to create the STS client. The ConfigProvider is
|
// Takes a Config provider to create the STS client. The ConfigProvider is
|
||||||
// satisfied by the session.Session type.
|
// satisfied by the session.Session type.
|
||||||
|
//
|
||||||
|
// It is safe to share the returned Credentials with multiple Sessions and
|
||||||
|
// service clients. All access to the credentials and refreshing them
|
||||||
|
// will be synchronized.
|
||||||
func NewCredentials(c client.ConfigProvider, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials {
|
func NewCredentials(c client.ConfigProvider, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials {
|
||||||
p := &AssumeRoleProvider{
|
p := &AssumeRoleProvider{
|
||||||
Client: sts.New(c),
|
Client: sts.New(c),
|
||||||
|
@ -103,7 +223,11 @@ func NewCredentials(c client.ConfigProvider, roleARN string, options ...func(*As
|
||||||
// AssumeRoleProvider. The credentials will expire every 15 minutes and the
|
// AssumeRoleProvider. The credentials will expire every 15 minutes and the
|
||||||
// role will be named after a nanosecond timestamp of this operation.
|
// role will be named after a nanosecond timestamp of this operation.
|
||||||
//
|
//
|
||||||
// Takes an AssumeRoler which can be satisfiede by the STS client.
|
// Takes an AssumeRoler which can be satisfied by the STS client.
|
||||||
|
//
|
||||||
|
// It is safe to share the returned Credentials with multiple Sessions and
|
||||||
|
// service clients. All access to the credentials and refreshing them
|
||||||
|
// will be synchronized.
|
||||||
func NewCredentialsWithClient(svc AssumeRoler, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials {
|
func NewCredentialsWithClient(svc AssumeRoler, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials {
|
||||||
p := &AssumeRoleProvider{
|
p := &AssumeRoleProvider{
|
||||||
Client: svc,
|
Client: svc,
|
||||||
|
@ -139,12 +263,25 @@ func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) {
|
||||||
if p.Policy != nil {
|
if p.Policy != nil {
|
||||||
input.Policy = p.Policy
|
input.Policy = p.Policy
|
||||||
}
|
}
|
||||||
if p.SerialNumber != nil && p.TokenCode != nil {
|
if p.SerialNumber != nil {
|
||||||
input.SerialNumber = p.SerialNumber
|
if p.TokenCode != nil {
|
||||||
input.TokenCode = p.TokenCode
|
input.SerialNumber = p.SerialNumber
|
||||||
|
input.TokenCode = p.TokenCode
|
||||||
|
} else if p.TokenProvider != nil {
|
||||||
|
input.SerialNumber = p.SerialNumber
|
||||||
|
code, err := p.TokenProvider()
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, err
|
||||||
|
}
|
||||||
|
input.TokenCode = aws.String(code)
|
||||||
|
} else {
|
||||||
|
return credentials.Value{ProviderName: ProviderName},
|
||||||
|
awserr.New("AssumeRoleTokenNotAvailable",
|
||||||
|
"assume role with MFA enabled, but neither TokenCode nor TokenProvider are set", nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
roleOutput, err := p.Client.AssumeRole(input)
|
|
||||||
|
|
||||||
|
roleOutput, err := p.Client.AssumeRole(input)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return credentials.Value{ProviderName: ProviderName}, err
|
return credentials.Value{ProviderName: ProviderName}, err
|
||||||
}
|
}
|
||||||
|
|
47
vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
generated
vendored
47
vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
generated
vendored
|
@ -10,10 +10,12 @@ package defaults
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"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/corehandlers"
|
"github.com/aws/aws-sdk-go/aws/corehandlers"
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
|
"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
|
||||||
|
@ -56,7 +58,6 @@ func Config() *aws.Config {
|
||||||
WithMaxRetries(aws.UseServiceDefaultRetries).
|
WithMaxRetries(aws.UseServiceDefaultRetries).
|
||||||
WithLogger(aws.NewDefaultLogger()).
|
WithLogger(aws.NewDefaultLogger()).
|
||||||
WithLogLevel(aws.LogOff).
|
WithLogLevel(aws.LogOff).
|
||||||
WithSleepDelay(time.Sleep).
|
|
||||||
WithEndpointResolver(endpoints.DefaultResolver())
|
WithEndpointResolver(endpoints.DefaultResolver())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,23 +98,51 @@ func CredChain(cfg *aws.Config, handlers request.Handlers) *credentials.Credenti
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoteCredProvider returns a credenitials provider for the default remote
|
const (
|
||||||
|
httpProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_FULL_URI"
|
||||||
|
ecsCredsProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RemoteCredProvider returns a credentials provider for the default remote
|
||||||
// endpoints such as EC2 or ECS Roles.
|
// endpoints such as EC2 or ECS Roles.
|
||||||
func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider {
|
func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider {
|
||||||
ecsCredURI := os.Getenv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI")
|
if u := os.Getenv(httpProviderEnvVar); len(u) > 0 {
|
||||||
|
return localHTTPCredProvider(cfg, handlers, u)
|
||||||
|
}
|
||||||
|
|
||||||
if len(ecsCredURI) > 0 {
|
if uri := os.Getenv(ecsCredsProviderEnvVar); len(uri) > 0 {
|
||||||
return ecsCredProvider(cfg, handlers, ecsCredURI)
|
u := fmt.Sprintf("http://169.254.170.2%s", uri)
|
||||||
|
return httpCredProvider(cfg, handlers, u)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ec2RoleProvider(cfg, handlers)
|
return ec2RoleProvider(cfg, handlers)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ecsCredProvider(cfg aws.Config, handlers request.Handlers, uri string) credentials.Provider {
|
func localHTTPCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider {
|
||||||
const host = `169.254.170.2`
|
var errMsg string
|
||||||
|
|
||||||
return endpointcreds.NewProviderClient(cfg, handlers,
|
parsed, err := url.Parse(u)
|
||||||
fmt.Sprintf("http://%s%s", host, uri),
|
if err != nil {
|
||||||
|
errMsg = fmt.Sprintf("invalid URL, %v", err)
|
||||||
|
} else if host := aws.URLHostname(parsed); !(host == "localhost" || host == "127.0.0.1") {
|
||||||
|
errMsg = fmt.Sprintf("invalid host address, %q, only localhost and 127.0.0.1 are valid.", host)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errMsg) > 0 {
|
||||||
|
if cfg.Logger != nil {
|
||||||
|
cfg.Logger.Log("Ignoring, HTTP credential provider", errMsg, err)
|
||||||
|
}
|
||||||
|
return credentials.ErrorProvider{
|
||||||
|
Err: awserr.New("CredentialsEndpointError", errMsg, err),
|
||||||
|
ProviderName: endpointcreds.ProviderName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return httpCredProvider(cfg, handlers, u)
|
||||||
|
}
|
||||||
|
|
||||||
|
func httpCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider {
|
||||||
|
return endpointcreds.NewProviderClient(cfg, handlers, u,
|
||||||
func(p *endpointcreds.Provider) {
|
func(p *endpointcreds.Provider) {
|
||||||
p.ExpiryWindow = 5 * time.Minute
|
p.ExpiryWindow = 5 * time.Minute
|
||||||
},
|
},
|
||||||
|
|
27
vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go
generated
vendored
Normal file
27
vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go
generated
vendored
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
package defaults
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/internal/shareddefaults"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SharedCredentialsFilename returns the SDK's default file path
|
||||||
|
// for the shared credentials file.
|
||||||
|
//
|
||||||
|
// Builds the shared config file path based on the OS's platform.
|
||||||
|
//
|
||||||
|
// - Linux/Unix: $HOME/.aws/credentials
|
||||||
|
// - Windows: %USERPROFILE%\.aws\credentials
|
||||||
|
func SharedCredentialsFilename() string {
|
||||||
|
return shareddefaults.SharedCredentialsFilename()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedConfigFilename returns the SDK's default file path for
|
||||||
|
// the shared config file.
|
||||||
|
//
|
||||||
|
// Builds the shared config file path based on the OS's platform.
|
||||||
|
//
|
||||||
|
// - Linux/Unix: $HOME/.aws/config
|
||||||
|
// - Windows: %USERPROFILE%\.aws\config
|
||||||
|
func SharedConfigFilename() string {
|
||||||
|
return shareddefaults.SharedConfigFilename()
|
||||||
|
}
|
56
vendor/github.com/aws/aws-sdk-go/aws/doc.go
generated
vendored
Normal file
56
vendor/github.com/aws/aws-sdk-go/aws/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// Package aws provides the core SDK's utilities and shared types. Use this package's
|
||||||
|
// utilities to simplify setting and reading API operations parameters.
|
||||||
|
//
|
||||||
|
// Value and Pointer Conversion Utilities
|
||||||
|
//
|
||||||
|
// This package includes a helper conversion utility for each scalar type the SDK's
|
||||||
|
// API use. These utilities make getting a pointer of the scalar, and dereferencing
|
||||||
|
// a pointer easier.
|
||||||
|
//
|
||||||
|
// Each conversion utility comes in two forms. Value to Pointer and Pointer to Value.
|
||||||
|
// The Pointer to value will safely dereference the pointer and return its value.
|
||||||
|
// If the pointer was nil, the scalar's zero value will be returned.
|
||||||
|
//
|
||||||
|
// The value to pointer functions will be named after the scalar type. So get a
|
||||||
|
// *string from a string value use the "String" function. This makes it easy to
|
||||||
|
// to get pointer of a literal string value, because getting the address of a
|
||||||
|
// literal requires assigning the value to a variable first.
|
||||||
|
//
|
||||||
|
// var strPtr *string
|
||||||
|
//
|
||||||
|
// // Without the SDK's conversion functions
|
||||||
|
// str := "my string"
|
||||||
|
// strPtr = &str
|
||||||
|
//
|
||||||
|
// // With the SDK's conversion functions
|
||||||
|
// strPtr = aws.String("my string")
|
||||||
|
//
|
||||||
|
// // Convert *string to string value
|
||||||
|
// str = aws.StringValue(strPtr)
|
||||||
|
//
|
||||||
|
// In addition to scalars the aws package also includes conversion utilities for
|
||||||
|
// map and slice for commonly types used in API parameters. The map and slice
|
||||||
|
// conversion functions use similar naming pattern as the scalar conversion
|
||||||
|
// functions.
|
||||||
|
//
|
||||||
|
// var strPtrs []*string
|
||||||
|
// var strs []string = []string{"Go", "Gophers", "Go"}
|
||||||
|
//
|
||||||
|
// // Convert []string to []*string
|
||||||
|
// strPtrs = aws.StringSlice(strs)
|
||||||
|
//
|
||||||
|
// // Convert []*string to []string
|
||||||
|
// strs = aws.StringValueSlice(strPtrs)
|
||||||
|
//
|
||||||
|
// SDK Default HTTP Client
|
||||||
|
//
|
||||||
|
// The SDK will use the http.DefaultClient if a HTTP client is not provided to
|
||||||
|
// the SDK's Session, or service client constructor. This means that if the
|
||||||
|
// http.DefaultClient is modified by other components of your application the
|
||||||
|
// modifications will be picked up by the SDK as well.
|
||||||
|
//
|
||||||
|
// In some cases this might be intended, but it is a better practice to create
|
||||||
|
// a custom HTTP Client to share explicitly through your application. You can
|
||||||
|
// configure the SDK to use the custom HTTP Client by setting the HTTPClient
|
||||||
|
// value of the SDK's Config type when creating a Session or service client.
|
||||||
|
package aws
|
605
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
605
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
File diff suppressed because it is too large
Load diff
4
vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go/aws/endpoints/doc.go
generated
vendored
|
@ -21,12 +21,12 @@
|
||||||
// partitions := resolver.(endpoints.EnumPartitions).Partitions()
|
// partitions := resolver.(endpoints.EnumPartitions).Partitions()
|
||||||
//
|
//
|
||||||
// for _, p := range partitions {
|
// for _, p := range partitions {
|
||||||
// fmt.Println("Regions for", p.Name)
|
// fmt.Println("Regions for", p.ID())
|
||||||
// for id, _ := range p.Regions() {
|
// for id, _ := range p.Regions() {
|
||||||
// fmt.Println("*", id)
|
// fmt.Println("*", id)
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// fmt.Println("Services for", p.Name)
|
// fmt.Println("Services for", p.ID())
|
||||||
// for id, _ := range p.Services() {
|
// for id, _ := range p.Services() {
|
||||||
// fmt.Println("*", id)
|
// fmt.Println("*", id)
|
||||||
// }
|
// }
|
||||||
|
|
146
vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go
generated
vendored
146
vendor/github.com/aws/aws-sdk-go/aws/endpoints/endpoints.go
generated
vendored
|
@ -27,6 +27,25 @@ type Options struct {
|
||||||
// error will be returned. This option will prevent returning endpoints
|
// error will be returned. This option will prevent returning endpoints
|
||||||
// that look valid, but may not resolve to any real endpoint.
|
// that look valid, but may not resolve to any real endpoint.
|
||||||
StrictMatching bool
|
StrictMatching bool
|
||||||
|
|
||||||
|
// Enables resolving a service endpoint based on the region provided if the
|
||||||
|
// service does not exist. The service endpoint ID will be used as the service
|
||||||
|
// domain name prefix. By default the endpoint resolver requires the service
|
||||||
|
// to be known when resolving endpoints.
|
||||||
|
//
|
||||||
|
// If resolving an endpoint on the partition list the provided region will
|
||||||
|
// be used to determine which partition's domain name pattern to the service
|
||||||
|
// endpoint ID with. If both the service and region are unkonwn and resolving
|
||||||
|
// the endpoint on partition list an UnknownEndpointError error will be returned.
|
||||||
|
//
|
||||||
|
// If resolving and endpoint on a partition specific resolver that partition's
|
||||||
|
// domain name pattern will be used with the service endpoint ID. If both
|
||||||
|
// region and service do not exist when resolving an endpoint on a specific
|
||||||
|
// partition the partition's domain pattern will be used to combine the
|
||||||
|
// endpoint and region together.
|
||||||
|
//
|
||||||
|
// This option is ignored if StrictMatching is enabled.
|
||||||
|
ResolveUnknownService bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set combines all of the option functions together.
|
// Set combines all of the option functions together.
|
||||||
|
@ -54,6 +73,12 @@ func StrictMatchingOption(o *Options) {
|
||||||
o.StrictMatching = true
|
o.StrictMatching = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ResolveUnknownServiceOption sets the ResolveUnknownService option. Can be used
|
||||||
|
// as a functional option when resolving endpoints.
|
||||||
|
func ResolveUnknownServiceOption(o *Options) {
|
||||||
|
o.ResolveUnknownService = true
|
||||||
|
}
|
||||||
|
|
||||||
// A Resolver provides the interface for functionality to resolve endpoints.
|
// A Resolver provides the interface for functionality to resolve endpoints.
|
||||||
// The build in Partition and DefaultResolver return value satisfy this interface.
|
// The build in Partition and DefaultResolver return value satisfy this interface.
|
||||||
type Resolver interface {
|
type Resolver interface {
|
||||||
|
@ -99,6 +124,49 @@ type EnumPartitions interface {
|
||||||
Partitions() []Partition
|
Partitions() []Partition
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegionsForService returns a map of regions for the partition and service.
|
||||||
|
// If either the partition or service does not exist false will be returned
|
||||||
|
// as the second parameter.
|
||||||
|
//
|
||||||
|
// This example shows how to get the regions for DynamoDB in the AWS partition.
|
||||||
|
// rs, exists := endpoints.RegionsForService(endpoints.DefaultPartitions(), endpoints.AwsPartitionID, endpoints.DynamodbServiceID)
|
||||||
|
//
|
||||||
|
// This is equivalent to using the partition directly.
|
||||||
|
// rs := endpoints.AwsPartition().Services()[endpoints.DynamodbServiceID].Regions()
|
||||||
|
func RegionsForService(ps []Partition, partitionID, serviceID string) (map[string]Region, bool) {
|
||||||
|
for _, p := range ps {
|
||||||
|
if p.ID() != partitionID {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, ok := p.p.Services[serviceID]; !ok {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
s := Service{
|
||||||
|
id: serviceID,
|
||||||
|
p: p.p,
|
||||||
|
}
|
||||||
|
return s.Regions(), true
|
||||||
|
}
|
||||||
|
|
||||||
|
return map[string]Region{}, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// PartitionForRegion returns the first partition which includes the region
|
||||||
|
// passed in. This includes both known regions and regions which match
|
||||||
|
// a pattern supported by the partition which may include regions that are
|
||||||
|
// not explicitly known by the partition. Use the Regions method of the
|
||||||
|
// returned Partition if explicit support is needed.
|
||||||
|
func PartitionForRegion(ps []Partition, regionID string) (Partition, bool) {
|
||||||
|
for _, p := range ps {
|
||||||
|
if _, ok := p.p.Regions[regionID]; ok || p.p.RegionRegex.MatchString(regionID) {
|
||||||
|
return p, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Partition{}, false
|
||||||
|
}
|
||||||
|
|
||||||
// A Partition provides the ability to enumerate the partition's regions
|
// A Partition provides the ability to enumerate the partition's regions
|
||||||
// and services.
|
// and services.
|
||||||
type Partition struct {
|
type Partition struct {
|
||||||
|
@ -107,33 +175,36 @@ type Partition struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ID returns the identifier of the partition.
|
// ID returns the identifier of the partition.
|
||||||
func (p *Partition) ID() string { return p.id }
|
func (p Partition) ID() string { return p.id }
|
||||||
|
|
||||||
// EndpointFor attempts to resolve the endpoint based on service and region.
|
// EndpointFor attempts to resolve the endpoint based on service and region.
|
||||||
// See Options for information on configuring how the endpoint is resolved.
|
// See Options for information on configuring how the endpoint is resolved.
|
||||||
//
|
//
|
||||||
// If the service cannot be found in the metadata the UnknownServiceError
|
// If the service cannot be found in the metadata the UnknownServiceError
|
||||||
// error will be returned. This validation will occur regardless if
|
// error will be returned. This validation will occur regardless if
|
||||||
// StrictMatching is enabled.
|
// StrictMatching is enabled. To enable resolving unknown services set the
|
||||||
|
// "ResolveUnknownService" option to true. When StrictMatching is disabled
|
||||||
|
// this option allows the partition resolver to resolve a endpoint based on
|
||||||
|
// the service endpoint ID provided.
|
||||||
//
|
//
|
||||||
// When resolving endpoints you can choose to enable StrictMatching. This will
|
// When resolving endpoints you can choose to enable StrictMatching. This will
|
||||||
// require the provided service and region to be known by the partition.
|
// require the provided service and region to be known by the partition.
|
||||||
// If the endpoint cannot be strictly resolved an error will be returned. This
|
// If the endpoint cannot be strictly resolved an error will be returned. This
|
||||||
// mode is useful to ensure the endpoint resolved is valid. Without
|
// mode is useful to ensure the endpoint resolved is valid. Without
|
||||||
// StrictMatching enabled the enpoint returned my look valid but may not work.
|
// StrictMatching enabled the endpoint returned my look valid but may not work.
|
||||||
// StrictMatching requires the SDK to be updated if you want to take advantage
|
// StrictMatching requires the SDK to be updated if you want to take advantage
|
||||||
// of new regions and services expantions.
|
// of new regions and services expansions.
|
||||||
//
|
//
|
||||||
// Errors that can be returned.
|
// Errors that can be returned.
|
||||||
// * UnknownServiceError
|
// * UnknownServiceError
|
||||||
// * UnknownEndpointError
|
// * UnknownEndpointError
|
||||||
func (p *Partition) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) {
|
func (p Partition) EndpointFor(service, region string, opts ...func(*Options)) (ResolvedEndpoint, error) {
|
||||||
return p.p.EndpointFor(service, region, opts...)
|
return p.p.EndpointFor(service, region, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Regions returns a map of Regions indexed by their ID. This is useful for
|
// Regions returns a map of Regions indexed by their ID. This is useful for
|
||||||
// enumerating over the regions in a partition.
|
// enumerating over the regions in a partition.
|
||||||
func (p *Partition) Regions() map[string]Region {
|
func (p Partition) Regions() map[string]Region {
|
||||||
rs := map[string]Region{}
|
rs := map[string]Region{}
|
||||||
for id := range p.p.Regions {
|
for id := range p.p.Regions {
|
||||||
rs[id] = Region{
|
rs[id] = Region{
|
||||||
|
@ -147,7 +218,7 @@ func (p *Partition) Regions() map[string]Region {
|
||||||
|
|
||||||
// Services returns a map of Service indexed by their ID. This is useful for
|
// Services returns a map of Service indexed by their ID. This is useful for
|
||||||
// enumerating over the services in a partition.
|
// enumerating over the services in a partition.
|
||||||
func (p *Partition) Services() map[string]Service {
|
func (p Partition) Services() map[string]Service {
|
||||||
ss := map[string]Service{}
|
ss := map[string]Service{}
|
||||||
for id := range p.p.Services {
|
for id := range p.p.Services {
|
||||||
ss[id] = Service{
|
ss[id] = Service{
|
||||||
|
@ -167,16 +238,16 @@ type Region struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ID returns the region's identifier.
|
// ID returns the region's identifier.
|
||||||
func (r *Region) ID() string { return r.id }
|
func (r Region) ID() string { return r.id }
|
||||||
|
|
||||||
// ResolveEndpoint resolves an endpoint from the context of the region given
|
// ResolveEndpoint resolves an endpoint from the context of the region given
|
||||||
// a service. See Partition.EndpointFor for usage and errors that can be returned.
|
// a service. See Partition.EndpointFor for usage and errors that can be returned.
|
||||||
func (r *Region) ResolveEndpoint(service string, opts ...func(*Options)) (ResolvedEndpoint, error) {
|
func (r Region) ResolveEndpoint(service string, opts ...func(*Options)) (ResolvedEndpoint, error) {
|
||||||
return r.p.EndpointFor(service, r.id, opts...)
|
return r.p.EndpointFor(service, r.id, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Services returns a list of all services that are known to be in this region.
|
// Services returns a list of all services that are known to be in this region.
|
||||||
func (r *Region) Services() map[string]Service {
|
func (r Region) Services() map[string]Service {
|
||||||
ss := map[string]Service{}
|
ss := map[string]Service{}
|
||||||
for id, s := range r.p.Services {
|
for id, s := range r.p.Services {
|
||||||
if _, ok := s.Endpoints[r.id]; ok {
|
if _, ok := s.Endpoints[r.id]; ok {
|
||||||
|
@ -198,17 +269,38 @@ type Service struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ID returns the identifier for the service.
|
// ID returns the identifier for the service.
|
||||||
func (s *Service) ID() string { return s.id }
|
func (s Service) ID() string { return s.id }
|
||||||
|
|
||||||
// ResolveEndpoint resolves an endpoint from the context of a service given
|
// ResolveEndpoint resolves an endpoint from the context of a service given
|
||||||
// a region. See Partition.EndpointFor for usage and errors that can be returned.
|
// a region. See Partition.EndpointFor for usage and errors that can be returned.
|
||||||
func (s *Service) ResolveEndpoint(region string, opts ...func(*Options)) (ResolvedEndpoint, error) {
|
func (s Service) ResolveEndpoint(region string, opts ...func(*Options)) (ResolvedEndpoint, error) {
|
||||||
return s.p.EndpointFor(s.id, region, opts...)
|
return s.p.EndpointFor(s.id, region, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Regions returns a map of Regions that the service is present in.
|
||||||
|
//
|
||||||
|
// A region is the AWS region the service exists in. Whereas a Endpoint is
|
||||||
|
// an URL that can be resolved to a instance of a service.
|
||||||
|
func (s Service) Regions() map[string]Region {
|
||||||
|
rs := map[string]Region{}
|
||||||
|
for id := range s.p.Services[s.id].Endpoints {
|
||||||
|
if _, ok := s.p.Regions[id]; ok {
|
||||||
|
rs[id] = Region{
|
||||||
|
id: id,
|
||||||
|
p: s.p,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rs
|
||||||
|
}
|
||||||
|
|
||||||
// Endpoints returns a map of Endpoints indexed by their ID for all known
|
// Endpoints returns a map of Endpoints indexed by their ID for all known
|
||||||
// endpoints for a service.
|
// endpoints for a service.
|
||||||
func (s *Service) Endpoints() map[string]Endpoint {
|
//
|
||||||
|
// A region is the AWS region the service exists in. Whereas a Endpoint is
|
||||||
|
// an URL that can be resolved to a instance of a service.
|
||||||
|
func (s Service) Endpoints() map[string]Endpoint {
|
||||||
es := map[string]Endpoint{}
|
es := map[string]Endpoint{}
|
||||||
for id := range s.p.Services[s.id].Endpoints {
|
for id := range s.p.Services[s.id].Endpoints {
|
||||||
es[id] = Endpoint{
|
es[id] = Endpoint{
|
||||||
|
@ -231,15 +323,15 @@ type Endpoint struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ID returns the identifier for an endpoint.
|
// ID returns the identifier for an endpoint.
|
||||||
func (e *Endpoint) ID() string { return e.id }
|
func (e Endpoint) ID() string { return e.id }
|
||||||
|
|
||||||
// ServiceID returns the identifier the endpoint belongs to.
|
// ServiceID returns the identifier the endpoint belongs to.
|
||||||
func (e *Endpoint) ServiceID() string { return e.serviceID }
|
func (e Endpoint) ServiceID() string { return e.serviceID }
|
||||||
|
|
||||||
// ResolveEndpoint resolves an endpoint from the context of a service and
|
// ResolveEndpoint resolves an endpoint from the context of a service and
|
||||||
// region the endpoint represents. See Partition.EndpointFor for usage and
|
// region the endpoint represents. See Partition.EndpointFor for usage and
|
||||||
// errors that can be returned.
|
// errors that can be returned.
|
||||||
func (e *Endpoint) ResolveEndpoint(opts ...func(*Options)) (ResolvedEndpoint, error) {
|
func (e Endpoint) ResolveEndpoint(opts ...func(*Options)) (ResolvedEndpoint, error) {
|
||||||
return e.p.EndpointFor(e.serviceID, e.id, opts...)
|
return e.p.EndpointFor(e.serviceID, e.id, opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,28 +364,6 @@ type EndpointNotFoundError struct {
|
||||||
Region string
|
Region string
|
||||||
}
|
}
|
||||||
|
|
||||||
//// NewEndpointNotFoundError builds and returns NewEndpointNotFoundError.
|
|
||||||
//func NewEndpointNotFoundError(p, s, r string) EndpointNotFoundError {
|
|
||||||
// return EndpointNotFoundError{
|
|
||||||
// awsError: awserr.New("EndpointNotFoundError", "unable to find endpoint", nil),
|
|
||||||
// Partition: p,
|
|
||||||
// Service: s,
|
|
||||||
// Region: r,
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// Error returns string representation of the error.
|
|
||||||
//func (e EndpointNotFoundError) Error() string {
|
|
||||||
// extra := fmt.Sprintf("partition: %q, service: %q, region: %q",
|
|
||||||
// e.Partition, e.Service, e.Region)
|
|
||||||
// return awserr.SprintError(e.Code(), e.Message(), extra, e.OrigErr())
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// String returns the string representation of the error.
|
|
||||||
//func (e EndpointNotFoundError) String() string {
|
|
||||||
// return e.Error()
|
|
||||||
//}
|
|
||||||
|
|
||||||
// A UnknownServiceError is returned when the service does not resolve to an
|
// A UnknownServiceError is returned when the service does not resolve to an
|
||||||
// endpoint. Includes a list of all known services for the partition. Returned
|
// endpoint. Includes a list of all known services for the partition. Returned
|
||||||
// when a partition does not support the service.
|
// when a partition does not support the service.
|
||||||
|
|
4
vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model.go
generated
vendored
|
@ -79,7 +79,9 @@ func (p partition) EndpointFor(service, region string, opts ...func(*Options)) (
|
||||||
opt.Set(opts...)
|
opt.Set(opts...)
|
||||||
|
|
||||||
s, hasService := p.Services[service]
|
s, hasService := p.Services[service]
|
||||||
if !hasService {
|
if !(hasService || opt.ResolveUnknownService) {
|
||||||
|
// Only return error if the resolver will not fallback to creating
|
||||||
|
// endpoint based on service endpoint ID passed in.
|
||||||
return resolved, NewUnknownServiceError(p.ID, service, serviceList(p.Services))
|
return resolved, NewUnknownServiceError(p.ID, service, serviceList(p.Services))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
19
vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go
generated
vendored
19
vendor/github.com/aws/aws-sdk-go/aws/endpoints/v3model_codegen.go
generated
vendored
|
@ -158,7 +158,7 @@ var funcMap = template.FuncMap{
|
||||||
|
|
||||||
const v3Tmpl = `
|
const v3Tmpl = `
|
||||||
{{ define "defaults" -}}
|
{{ define "defaults" -}}
|
||||||
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
// Code generated by aws/endpoints/v3model_codegen.go. DO NOT EDIT.
|
||||||
|
|
||||||
package endpoints
|
package endpoints
|
||||||
|
|
||||||
|
@ -209,17 +209,20 @@ import (
|
||||||
// DefaultResolver returns an Endpoint resolver that will be able
|
// DefaultResolver returns an Endpoint resolver that will be able
|
||||||
// to resolve endpoints for: {{ ListPartitionNames . }}.
|
// to resolve endpoints for: {{ ListPartitionNames . }}.
|
||||||
//
|
//
|
||||||
// Casting the return value of this func to a EnumPartitions will
|
// Use DefaultPartitions() to get the list of the default partitions.
|
||||||
// allow you to get a list of the partitions in the order the endpoints
|
func DefaultResolver() Resolver {
|
||||||
// will be resolved in.
|
return defaultPartitions
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultPartitions returns a list of the partitions the SDK is bundled
|
||||||
|
// with. The available partitions are: {{ ListPartitionNames . }}.
|
||||||
//
|
//
|
||||||
// resolver := endpoints.DefaultResolver()
|
// partitions := endpoints.DefaultPartitions
|
||||||
// partitions := resolver.(endpoints.EnumPartitions).Partitions()
|
|
||||||
// for _, p := range partitions {
|
// for _, p := range partitions {
|
||||||
// // ... inspect partitions
|
// // ... inspect partitions
|
||||||
// }
|
// }
|
||||||
func DefaultResolver() Resolver {
|
func DefaultPartitions() []Partition {
|
||||||
return defaultPartitions
|
return defaultPartitions.Partitions()
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultPartitions = partitions{
|
var defaultPartitions = partitions{
|
||||||
|
|
12
vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go
generated
vendored
Normal file
12
vendor/github.com/aws/aws-sdk-go/aws/jsonvalue.go
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package aws
|
||||||
|
|
||||||
|
// JSONValue is a representation of a grab bag type that will be marshaled
|
||||||
|
// into a json string. This type can be used just like any other map.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
//
|
||||||
|
// values := aws.JSONValue{
|
||||||
|
// "Foo": "Bar",
|
||||||
|
// }
|
||||||
|
// values["Baz"] = "Qux"
|
||||||
|
type JSONValue map[string]interface{}
|
4
vendor/github.com/aws/aws-sdk-go/aws/logger.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go/aws/logger.go
generated
vendored
|
@ -26,14 +26,14 @@ func (l *LogLevelType) Value() LogLevelType {
|
||||||
|
|
||||||
// Matches returns true if the v LogLevel is enabled by this LogLevel. Should be
|
// Matches returns true if the v LogLevel is enabled by this LogLevel. Should be
|
||||||
// used with logging sub levels. Is safe to use on nil value LogLevelTypes. If
|
// used with logging sub levels. Is safe to use on nil value LogLevelTypes. If
|
||||||
// LogLevel is nill, will default to LogOff comparison.
|
// LogLevel is nil, will default to LogOff comparison.
|
||||||
func (l *LogLevelType) Matches(v LogLevelType) bool {
|
func (l *LogLevelType) Matches(v LogLevelType) bool {
|
||||||
c := l.Value()
|
c := l.Value()
|
||||||
return c&v == v
|
return c&v == v
|
||||||
}
|
}
|
||||||
|
|
||||||
// AtLeast returns true if this LogLevel is at least high enough to satisfies v.
|
// AtLeast returns true if this LogLevel is at least high enough to satisfies v.
|
||||||
// Is safe to use on nil value LogLevelTypes. If LogLevel is nill, will default
|
// Is safe to use on nil value LogLevelTypes. If LogLevel is nil, will default
|
||||||
// to LogOff comparison.
|
// to LogOff comparison.
|
||||||
func (l *LogLevelType) AtLeast(v LogLevelType) bool {
|
func (l *LogLevelType) AtLeast(v LogLevelType) bool {
|
||||||
c := l.Value()
|
c := l.Value()
|
||||||
|
|
19
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go
generated
vendored
Normal file
19
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error.go
generated
vendored
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// +build !appengine,!plan9
|
||||||
|
|
||||||
|
package request
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"os"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func isErrConnectionReset(err error) bool {
|
||||||
|
if opErr, ok := err.(*net.OpError); ok {
|
||||||
|
if sysErr, ok := opErr.Err.(*os.SyscallError); ok {
|
||||||
|
return sysErr.Err == syscall.ECONNRESET
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
11
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go
generated
vendored
Normal file
11
vendor/github.com/aws/aws-sdk-go/aws/request/connection_reset_error_other.go
generated
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
// +build appengine plan9
|
||||||
|
|
||||||
|
package request
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func isErrConnectionReset(err error) bool {
|
||||||
|
return strings.Contains(err.Error(), "connection reset")
|
||||||
|
}
|
97
vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go
generated
vendored
97
vendor/github.com/aws/aws-sdk-go/aws/request/handlers.go
generated
vendored
|
@ -18,6 +18,7 @@ type Handlers struct {
|
||||||
UnmarshalError HandlerList
|
UnmarshalError HandlerList
|
||||||
Retry HandlerList
|
Retry HandlerList
|
||||||
AfterRetry HandlerList
|
AfterRetry HandlerList
|
||||||
|
Complete HandlerList
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy returns of this handler's lists.
|
// Copy returns of this handler's lists.
|
||||||
|
@ -33,6 +34,7 @@ func (h *Handlers) Copy() Handlers {
|
||||||
UnmarshalMeta: h.UnmarshalMeta.copy(),
|
UnmarshalMeta: h.UnmarshalMeta.copy(),
|
||||||
Retry: h.Retry.copy(),
|
Retry: h.Retry.copy(),
|
||||||
AfterRetry: h.AfterRetry.copy(),
|
AfterRetry: h.AfterRetry.copy(),
|
||||||
|
Complete: h.Complete.copy(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +50,7 @@ func (h *Handlers) Clear() {
|
||||||
h.ValidateResponse.Clear()
|
h.ValidateResponse.Clear()
|
||||||
h.Retry.Clear()
|
h.Retry.Clear()
|
||||||
h.AfterRetry.Clear()
|
h.AfterRetry.Clear()
|
||||||
|
h.Complete.Clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
// A HandlerListRunItem represents an entry in the HandlerList which
|
// A HandlerListRunItem represents an entry in the HandlerList which
|
||||||
|
@ -85,13 +88,17 @@ func (l *HandlerList) copy() HandlerList {
|
||||||
n := HandlerList{
|
n := HandlerList{
|
||||||
AfterEachFn: l.AfterEachFn,
|
AfterEachFn: l.AfterEachFn,
|
||||||
}
|
}
|
||||||
n.list = append([]NamedHandler{}, l.list...)
|
if len(l.list) == 0 {
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
n.list = append(make([]NamedHandler, 0, len(l.list)), l.list...)
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear clears the handler list.
|
// Clear clears the handler list.
|
||||||
func (l *HandlerList) Clear() {
|
func (l *HandlerList) Clear() {
|
||||||
l.list = []NamedHandler{}
|
l.list = l.list[0:0]
|
||||||
}
|
}
|
||||||
|
|
||||||
// Len returns the number of handlers in the list.
|
// Len returns the number of handlers in the list.
|
||||||
|
@ -101,33 +108,85 @@ func (l *HandlerList) Len() int {
|
||||||
|
|
||||||
// PushBack pushes handler f to the back of the handler list.
|
// PushBack pushes handler f to the back of the handler list.
|
||||||
func (l *HandlerList) PushBack(f func(*Request)) {
|
func (l *HandlerList) PushBack(f func(*Request)) {
|
||||||
l.list = append(l.list, NamedHandler{"__anonymous", f})
|
l.PushBackNamed(NamedHandler{"__anonymous", f})
|
||||||
}
|
|
||||||
|
|
||||||
// PushFront pushes handler f to the front of the handler list.
|
|
||||||
func (l *HandlerList) PushFront(f func(*Request)) {
|
|
||||||
l.list = append([]NamedHandler{{"__anonymous", f}}, l.list...)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PushBackNamed pushes named handler f to the back of the handler list.
|
// PushBackNamed pushes named handler f to the back of the handler list.
|
||||||
func (l *HandlerList) PushBackNamed(n NamedHandler) {
|
func (l *HandlerList) PushBackNamed(n NamedHandler) {
|
||||||
|
if cap(l.list) == 0 {
|
||||||
|
l.list = make([]NamedHandler, 0, 5)
|
||||||
|
}
|
||||||
l.list = append(l.list, n)
|
l.list = append(l.list, n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PushFront pushes handler f to the front of the handler list.
|
||||||
|
func (l *HandlerList) PushFront(f func(*Request)) {
|
||||||
|
l.PushFrontNamed(NamedHandler{"__anonymous", f})
|
||||||
|
}
|
||||||
|
|
||||||
// PushFrontNamed pushes named handler f to the front of the handler list.
|
// PushFrontNamed pushes named handler f to the front of the handler list.
|
||||||
func (l *HandlerList) PushFrontNamed(n NamedHandler) {
|
func (l *HandlerList) PushFrontNamed(n NamedHandler) {
|
||||||
l.list = append([]NamedHandler{n}, l.list...)
|
if cap(l.list) == len(l.list) {
|
||||||
|
// Allocating new list required
|
||||||
|
l.list = append([]NamedHandler{n}, l.list...)
|
||||||
|
} else {
|
||||||
|
// Enough room to prepend into list.
|
||||||
|
l.list = append(l.list, NamedHandler{})
|
||||||
|
copy(l.list[1:], l.list)
|
||||||
|
l.list[0] = n
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove removes a NamedHandler n
|
// Remove removes a NamedHandler n
|
||||||
func (l *HandlerList) Remove(n NamedHandler) {
|
func (l *HandlerList) Remove(n NamedHandler) {
|
||||||
newlist := []NamedHandler{}
|
l.RemoveByName(n.Name)
|
||||||
for _, m := range l.list {
|
}
|
||||||
if m.Name != n.Name {
|
|
||||||
newlist = append(newlist, m)
|
// RemoveByName removes a NamedHandler by name.
|
||||||
|
func (l *HandlerList) RemoveByName(name string) {
|
||||||
|
for i := 0; i < len(l.list); i++ {
|
||||||
|
m := l.list[i]
|
||||||
|
if m.Name == name {
|
||||||
|
// Shift array preventing creating new arrays
|
||||||
|
copy(l.list[i:], l.list[i+1:])
|
||||||
|
l.list[len(l.list)-1] = NamedHandler{}
|
||||||
|
l.list = l.list[:len(l.list)-1]
|
||||||
|
|
||||||
|
// decrement list so next check to length is correct
|
||||||
|
i--
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l.list = newlist
|
}
|
||||||
|
|
||||||
|
// SwapNamed will swap out any existing handlers with the same name as the
|
||||||
|
// passed in NamedHandler returning true if handlers were swapped. False is
|
||||||
|
// returned otherwise.
|
||||||
|
func (l *HandlerList) SwapNamed(n NamedHandler) (swapped bool) {
|
||||||
|
for i := 0; i < len(l.list); i++ {
|
||||||
|
if l.list[i].Name == n.Name {
|
||||||
|
l.list[i].Fn = n.Fn
|
||||||
|
swapped = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return swapped
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetBackNamed will replace the named handler if it exists in the handler list.
|
||||||
|
// If the handler does not exist the handler will be added to the end of the list.
|
||||||
|
func (l *HandlerList) SetBackNamed(n NamedHandler) {
|
||||||
|
if !l.SwapNamed(n) {
|
||||||
|
l.PushBackNamed(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetFrontNamed will replace the named handler if it exists in the handler list.
|
||||||
|
// If the handler does not exist the handler will be added to the beginning of
|
||||||
|
// the list.
|
||||||
|
func (l *HandlerList) SetFrontNamed(n NamedHandler) {
|
||||||
|
if !l.SwapNamed(n) {
|
||||||
|
l.PushFrontNamed(n)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run executes all handlers in the list with a given request object.
|
// Run executes all handlers in the list with a given request object.
|
||||||
|
@ -163,6 +222,16 @@ func HandlerListStopOnError(item HandlerListRunItem) bool {
|
||||||
return item.Request.Error == nil
|
return item.Request.Error == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithAppendUserAgent will add a string to the user agent prefixed with a
|
||||||
|
// single white space.
|
||||||
|
func WithAppendUserAgent(s string) Option {
|
||||||
|
return func(r *Request) {
|
||||||
|
r.Handlers.Build.PushBack(func(r2 *Request) {
|
||||||
|
AddToUserAgent(r, s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// MakeAddToUserAgentHandler will add the name/version pair to the User-Agent request
|
// MakeAddToUserAgentHandler will add the name/version pair to the User-Agent request
|
||||||
// header. If the extra parameters are provided they will be added as metadata to the
|
// header. If the extra parameters are provided they will be added as metadata to the
|
||||||
// name/version pair resulting in the following format.
|
// name/version pair resulting in the following format.
|
||||||
|
|
336
vendor/github.com/aws/aws-sdk-go/aws/request/request.go
generated
vendored
336
vendor/github.com/aws/aws-sdk-go/aws/request/request.go
generated
vendored
|
@ -16,6 +16,28 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ErrCodeSerialization is the serialization error code that is received
|
||||||
|
// during protocol unmarshaling.
|
||||||
|
ErrCodeSerialization = "SerializationError"
|
||||||
|
|
||||||
|
// ErrCodeRead is an error that is returned during HTTP reads.
|
||||||
|
ErrCodeRead = "ReadError"
|
||||||
|
|
||||||
|
// ErrCodeResponseTimeout is the connection timeout error that is received
|
||||||
|
// during body reads.
|
||||||
|
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
|
||||||
|
// API request that was canceled. Requests given a aws.Context may
|
||||||
|
// return this error when canceled.
|
||||||
|
CanceledErrorCode = "RequestCanceled"
|
||||||
|
)
|
||||||
|
|
||||||
// A Request is the service request to be made.
|
// A Request is the service request to be made.
|
||||||
type Request struct {
|
type Request struct {
|
||||||
Config aws.Config
|
Config aws.Config
|
||||||
|
@ -23,30 +45,37 @@ type Request struct {
|
||||||
Handlers Handlers
|
Handlers Handlers
|
||||||
|
|
||||||
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
|
Body io.ReadSeeker
|
||||||
Body io.ReadSeeker
|
BodyStart int64 // offset from beginning of Body that the request body starts
|
||||||
BodyStart int64 // offset from beginning of Body that the request body starts
|
Params interface{}
|
||||||
Params interface{}
|
Error error
|
||||||
Error error
|
Data interface{}
|
||||||
Data interface{}
|
RequestID string
|
||||||
RequestID string
|
RetryCount int
|
||||||
RetryCount int
|
Retryable *bool
|
||||||
Retryable *bool
|
RetryDelay time.Duration
|
||||||
RetryDelay time.Duration
|
NotHoist bool
|
||||||
NotHoist bool
|
SignedHeaderVals http.Header
|
||||||
SignedHeaderVals http.Header
|
LastSignedAt time.Time
|
||||||
LastSignedAt time.Time
|
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
|
||||||
|
|
||||||
built bool
|
built bool
|
||||||
|
|
||||||
// Need to persist an intermideant body betweend the input Body and HTTP
|
// Need to persist an intermediate body between the input Body and HTTP
|
||||||
// request body because the HTTP Client's transport can maintain a reference
|
// request body because the HTTP Client's transport can maintain a reference
|
||||||
// to the HTTP request's body after the client has returned. This value is
|
// to the HTTP request's body after the client has returned. This value is
|
||||||
// safe to use concurrently and rewraps the input Body for each HTTP request.
|
// safe to use concurrently and wrap the input Body for each HTTP request.
|
||||||
safeBody *offsetReader
|
safeBody *offsetReader
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,14 +89,6 @@ type Operation struct {
|
||||||
BeforePresignFn func(r *Request) error
|
BeforePresignFn func(r *Request) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paginator keeps track of pagination configuration for an API operation.
|
|
||||||
type Paginator struct {
|
|
||||||
InputTokens []string
|
|
||||||
OutputTokens []string
|
|
||||||
LimitToken string
|
|
||||||
TruncationToken string
|
|
||||||
}
|
|
||||||
|
|
||||||
// New returns a new Request pointer for the service API
|
// New returns a new Request pointer for the service API
|
||||||
// operation and parameters.
|
// operation and parameters.
|
||||||
//
|
//
|
||||||
|
@ -91,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,
|
||||||
|
@ -111,6 +134,94 @@ func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers,
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A Option is a functional option that can augment or modify a request when
|
||||||
|
// using a WithContext API operation method.
|
||||||
|
type Option func(*Request)
|
||||||
|
|
||||||
|
// WithGetResponseHeader builds a request Option which will retrieve a single
|
||||||
|
// header value from the HTTP Response. If there are multiple values for the
|
||||||
|
// header key use WithGetResponseHeaders instead to access the http.Header
|
||||||
|
// map directly. The passed in val pointer must be non-nil.
|
||||||
|
//
|
||||||
|
// This Option can be used multiple times with a single API operation.
|
||||||
|
//
|
||||||
|
// var id2, versionID string
|
||||||
|
// svc.PutObjectWithContext(ctx, params,
|
||||||
|
// request.WithGetResponseHeader("x-amz-id-2", &id2),
|
||||||
|
// request.WithGetResponseHeader("x-amz-version-id", &versionID),
|
||||||
|
// )
|
||||||
|
func WithGetResponseHeader(key string, val *string) Option {
|
||||||
|
return func(r *Request) {
|
||||||
|
r.Handlers.Complete.PushBack(func(req *Request) {
|
||||||
|
*val = req.HTTPResponse.Header.Get(key)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithGetResponseHeaders builds a request Option which will retrieve the
|
||||||
|
// headers from the HTTP response and assign them to the passed in headers
|
||||||
|
// variable. The passed in headers pointer must be non-nil.
|
||||||
|
//
|
||||||
|
// var headers http.Header
|
||||||
|
// svc.PutObjectWithContext(ctx, params, request.WithGetResponseHeaders(&headers))
|
||||||
|
func WithGetResponseHeaders(headers *http.Header) Option {
|
||||||
|
return func(r *Request) {
|
||||||
|
r.Handlers.Complete.PushBack(func(req *Request) {
|
||||||
|
*headers = req.HTTPResponse.Header
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithLogLevel is a request option that will set the request to use a specific
|
||||||
|
// log level when the request is made.
|
||||||
|
//
|
||||||
|
// svc.PutObjectWithContext(ctx, params, request.WithLogLevel(aws.LogDebugWithHTTPBody)
|
||||||
|
func WithLogLevel(l aws.LogLevelType) Option {
|
||||||
|
return func(r *Request) {
|
||||||
|
r.Config.LogLevel = aws.LogLevel(l)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApplyOptions will apply each option to the request calling them in the order
|
||||||
|
// the were provided.
|
||||||
|
func (r *Request) ApplyOptions(opts ...Option) {
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Context will always returns a non-nil context. If Request does not have a
|
||||||
|
// context aws.BackgroundContext will be returned.
|
||||||
|
func (r *Request) Context() aws.Context {
|
||||||
|
if r.context != nil {
|
||||||
|
return r.context
|
||||||
|
}
|
||||||
|
return aws.BackgroundContext()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetContext adds a Context to the current request that can be used to cancel
|
||||||
|
// a in-flight request. The Context value must not be nil, or this method will
|
||||||
|
// panic.
|
||||||
|
//
|
||||||
|
// Unlike http.Request.WithContext, SetContext does not return a copy of the
|
||||||
|
// Request. It is not safe to use use a single Request value for multiple
|
||||||
|
// requests. A new Request should be created for each API operation request.
|
||||||
|
//
|
||||||
|
// Go 1.6 and below:
|
||||||
|
// The http.Request's Cancel field will be set to the Done() value of
|
||||||
|
// the context. This will overwrite the Cancel field's value.
|
||||||
|
//
|
||||||
|
// Go 1.7 and above:
|
||||||
|
// The http.Request.WithContext will be used to set the context on the underlying
|
||||||
|
// http.Request. This will create a shallow copy of the http.Request. The SDK
|
||||||
|
// may create sub contexts in the future for nested requests such as retries.
|
||||||
|
func (r *Request) SetContext(ctx aws.Context) {
|
||||||
|
if ctx == nil {
|
||||||
|
panic("context cannot be nil")
|
||||||
|
}
|
||||||
|
setRequestContext(r, ctx)
|
||||||
|
}
|
||||||
|
|
||||||
// WillRetry returns if the request's can be retried.
|
// WillRetry returns if the request's can be retried.
|
||||||
func (r *Request) WillRetry() bool {
|
func (r *Request) WillRetry() bool {
|
||||||
return r.Error != nil && aws.BoolValue(r.Retryable) && r.RetryCount < r.MaxRetries()
|
return r.Error != nil && aws.BoolValue(r.Retryable) && r.RetryCount < r.MaxRetries()
|
||||||
|
@ -149,34 +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
|
||||||
|
|
||||||
|
u, _, err := getPresignedURL(r, expire)
|
||||||
|
return u, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// PresignRequest behaves just like presign, with the addition of returning a
|
||||||
|
// 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,
|
||||||
|
// and the HTTP headers that were included in the signature. These headers must
|
||||||
|
// 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
|
||||||
|
// this Request value prior to calling PresignRequest.
|
||||||
|
func (r *Request) PresignRequest(expire time.Duration) (string, http.Header, error) {
|
||||||
|
r = r.copy()
|
||||||
|
return getPresignedURL(r, expire)
|
||||||
|
}
|
||||||
|
|
||||||
|
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 r.Operation.BeforePresignFn != nil {
|
||||||
r = r.copy()
|
if err := r.Operation.BeforePresignFn(r); err != nil {
|
||||||
err := r.Operation.BeforePresignFn(r)
|
return "", nil, err
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Sign()
|
if err := r.Sign(); err != nil {
|
||||||
if r.Error != nil {
|
return "", nil, err
|
||||||
return "", r.Error
|
|
||||||
}
|
}
|
||||||
return r.HTTPRequest.URL.String(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PresignRequest behaves just like presign, but hoists all headers and signs them.
|
|
||||||
// Also returns the signed hash back to the user
|
|
||||||
func (r *Request) PresignRequest(expireTime time.Duration) (string, http.Header, error) {
|
|
||||||
r.ExpireTime = expireTime
|
|
||||||
r.NotHoist = true
|
|
||||||
r.Sign()
|
|
||||||
if r.Error != nil {
|
|
||||||
return "", nil, r.Error
|
|
||||||
}
|
|
||||||
return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil
|
return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,10 +373,7 @@ func (r *Request) Sign() error {
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResetBody rewinds the request body backto its starting position, and
|
func (r *Request) getNextRequestBody() (io.ReadCloser, error) {
|
||||||
// set's the HTTP Request body reference. When the body is read prior
|
|
||||||
// to being sent in the HTTP request it will need to be rewound.
|
|
||||||
func (r *Request) ResetBody() {
|
|
||||||
if r.safeBody != nil {
|
if r.safeBody != nil {
|
||||||
r.safeBody.Close()
|
r.safeBody.Close()
|
||||||
}
|
}
|
||||||
|
@ -262,14 +395,14 @@ func (r *Request) ResetBody() {
|
||||||
// Related golang/go#18257
|
// Related golang/go#18257
|
||||||
l, err := computeBodyLength(r.Body)
|
l, err := computeBodyLength(r.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Error = awserr.New("SerializationError", "failed to compute request body size", err)
|
return nil, awserr.New(ErrCodeSerialization, "failed to compute request body size", err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var body io.ReadCloser
|
||||||
if l == 0 {
|
if l == 0 {
|
||||||
r.HTTPRequest.Body = noBodyReader
|
body = NoBody
|
||||||
} else if l > 0 {
|
} else if l > 0 {
|
||||||
r.HTTPRequest.Body = r.safeBody
|
body = r.safeBody
|
||||||
} else {
|
} else {
|
||||||
// Hack to prevent sending bodies for methods where the body
|
// Hack to prevent sending bodies for methods where the body
|
||||||
// should be ignored by the server. Sending bodies on these
|
// should be ignored by the server. Sending bodies on these
|
||||||
|
@ -281,11 +414,13 @@ func (r *Request) ResetBody() {
|
||||||
// a io.Reader that was not also an io.Seeker.
|
// a io.Reader that was not also an io.Seeker.
|
||||||
switch r.Operation.HTTPMethod {
|
switch r.Operation.HTTPMethod {
|
||||||
case "GET", "HEAD", "DELETE":
|
case "GET", "HEAD", "DELETE":
|
||||||
r.HTTPRequest.Body = noBodyReader
|
body = NoBody
|
||||||
default:
|
default:
|
||||||
r.HTTPRequest.Body = r.safeBody
|
body = r.safeBody
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return body, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempts to compute the length of the body of the reader using the
|
// Attempts to compute the length of the body of the reader using the
|
||||||
|
@ -344,6 +479,12 @@ func (r *Request) GetBody() io.ReadSeeker {
|
||||||
//
|
//
|
||||||
// Send will not close the request.Request's body.
|
// Send will not close the request.Request's body.
|
||||||
func (r *Request) Send() error {
|
func (r *Request) Send() error {
|
||||||
|
defer func() {
|
||||||
|
// Regardless of success or failure of the request trigger the Complete
|
||||||
|
// request handlers.
|
||||||
|
r.Handlers.Complete.Run(r)
|
||||||
|
}()
|
||||||
|
|
||||||
for {
|
for {
|
||||||
if aws.BoolValue(r.Retryable) {
|
if aws.BoolValue(r.Retryable) {
|
||||||
if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) {
|
if r.Config.LogLevel.Matches(aws.LogDebugWithRequestRetries) {
|
||||||
|
@ -381,7 +522,7 @@ func (r *Request) Send() error {
|
||||||
r.Handlers.Retry.Run(r)
|
r.Handlers.Retry.Run(r)
|
||||||
r.Handlers.AfterRetry.Run(r)
|
r.Handlers.AfterRetry.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Send Request", false, r.Error)
|
debugLogReqError(r, "Send Request", false, err)
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
debugLogReqError(r, "Send Request", true, err)
|
debugLogReqError(r, "Send Request", true, err)
|
||||||
|
@ -390,12 +531,13 @@ func (r *Request) Send() error {
|
||||||
r.Handlers.UnmarshalMeta.Run(r)
|
r.Handlers.UnmarshalMeta.Run(r)
|
||||||
r.Handlers.ValidateResponse.Run(r)
|
r.Handlers.ValidateResponse.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
err := r.Error
|
|
||||||
r.Handlers.UnmarshalError.Run(r)
|
r.Handlers.UnmarshalError.Run(r)
|
||||||
|
err := r.Error
|
||||||
|
|
||||||
r.Handlers.Retry.Run(r)
|
r.Handlers.Retry.Run(r)
|
||||||
r.Handlers.AfterRetry.Run(r)
|
r.Handlers.AfterRetry.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Validate Response", false, r.Error)
|
debugLogReqError(r, "Validate Response", false, err)
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
debugLogReqError(r, "Validate Response", true, err)
|
debugLogReqError(r, "Validate Response", true, err)
|
||||||
|
@ -408,7 +550,7 @@ func (r *Request) Send() error {
|
||||||
r.Handlers.Retry.Run(r)
|
r.Handlers.Retry.Run(r)
|
||||||
r.Handlers.AfterRetry.Run(r)
|
r.Handlers.AfterRetry.Run(r)
|
||||||
if r.Error != nil {
|
if r.Error != nil {
|
||||||
debugLogReqError(r, "Unmarshal Response", false, r.Error)
|
debugLogReqError(r, "Unmarshal Response", false, err)
|
||||||
return r.Error
|
return r.Error
|
||||||
}
|
}
|
||||||
debugLogReqError(r, "Unmarshal Response", true, err)
|
debugLogReqError(r, "Unmarshal Response", true, err)
|
||||||
|
@ -446,6 +588,9 @@ func shouldRetryCancel(r *Request) bool {
|
||||||
timeoutErr := false
|
timeoutErr := false
|
||||||
errStr := r.Error.Error()
|
errStr := r.Error.Error()
|
||||||
if ok {
|
if ok {
|
||||||
|
if awsErr.Code() == CanceledErrorCode {
|
||||||
|
return false
|
||||||
|
}
|
||||||
err := awsErr.OrigErr()
|
err := awsErr.OrigErr()
|
||||||
netErr, netOK := err.(net.Error)
|
netErr, netOK := err.(net.Error)
|
||||||
timeoutErr = netOK && netErr.Temporary()
|
timeoutErr = netOK && netErr.Temporary()
|
||||||
|
@ -463,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
|
||||||
|
}
|
||||||
|
|
22
vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go
generated
vendored
22
vendor/github.com/aws/aws-sdk-go/aws/request/request_1_7.go
generated
vendored
|
@ -16,6 +16,24 @@ func (noBody) Read([]byte) (int, error) { return 0, io.EOF }
|
||||||
func (noBody) Close() error { return nil }
|
func (noBody) Close() error { return nil }
|
||||||
func (noBody) WriteTo(io.Writer) (int64, error) { return 0, nil }
|
func (noBody) WriteTo(io.Writer) (int64, error) { return 0, nil }
|
||||||
|
|
||||||
// Is an empty reader that will trigger the Go HTTP client to not include
|
// NoBody is an empty reader that will trigger the Go HTTP client to not include
|
||||||
// and body in the HTTP request.
|
// and body in the HTTP request.
|
||||||
var noBodyReader = noBody{}
|
var NoBody = noBody{}
|
||||||
|
|
||||||
|
// ResetBody rewinds the request body back to its starting position, and
|
||||||
|
// set's the HTTP Request body reference. When the body is read prior
|
||||||
|
// to being sent in the HTTP request it will need to be rewound.
|
||||||
|
//
|
||||||
|
// ResetBody will automatically be called by the SDK's build handler, but if
|
||||||
|
// the request is being used directly ResetBody must be called before the request
|
||||||
|
// is Sent. SetStringBody, SetBufferBody, and SetReaderBody will automatically
|
||||||
|
// call ResetBody.
|
||||||
|
func (r *Request) ResetBody() {
|
||||||
|
body, err := r.getNextRequestBody()
|
||||||
|
if err != nil {
|
||||||
|
r.Error = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
r.HTTPRequest.Body = body
|
||||||
|
}
|
||||||
|
|
30
vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go
generated
vendored
30
vendor/github.com/aws/aws-sdk-go/aws/request/request_1_8.go
generated
vendored
|
@ -2,8 +2,32 @@
|
||||||
|
|
||||||
package request
|
package request
|
||||||
|
|
||||||
import "net/http"
|
import (
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
// Is a http.NoBody reader instructing Go HTTP client to not include
|
// NoBody is a http.NoBody reader instructing Go HTTP client to not include
|
||||||
// and body in the HTTP request.
|
// and body in the HTTP request.
|
||||||
var noBodyReader = http.NoBody
|
var NoBody = http.NoBody
|
||||||
|
|
||||||
|
// ResetBody rewinds the request body back to its starting position, and
|
||||||
|
// set's the HTTP Request body reference. When the body is read prior
|
||||||
|
// to being sent in the HTTP request it will need to be rewound.
|
||||||
|
//
|
||||||
|
// ResetBody will automatically be called by the SDK's build handler, but if
|
||||||
|
// the request is being used directly ResetBody must be called before the request
|
||||||
|
// is Sent. SetStringBody, SetBufferBody, and SetReaderBody will automatically
|
||||||
|
// call ResetBody.
|
||||||
|
//
|
||||||
|
// Will also set the Go 1.8's http.Request.GetBody member to allow retrying
|
||||||
|
// PUT/POST redirects.
|
||||||
|
func (r *Request) ResetBody() {
|
||||||
|
body, err := r.getNextRequestBody()
|
||||||
|
if err != nil {
|
||||||
|
r.Error = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
r.HTTPRequest.Body = body
|
||||||
|
r.HTTPRequest.GetBody = r.getNextRequestBody
|
||||||
|
}
|
||||||
|
|
14
vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go
generated
vendored
Normal file
14
vendor/github.com/aws/aws-sdk-go/aws/request/request_context.go
generated
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// +build go1.7
|
||||||
|
|
||||||
|
package request
|
||||||
|
|
||||||
|
import "github.com/aws/aws-sdk-go/aws"
|
||||||
|
|
||||||
|
// setContext updates the Request to use the passed in context for cancellation.
|
||||||
|
// Context will also be used for request retry delay.
|
||||||
|
//
|
||||||
|
// Creates shallow copy of the http.Request with the WithContext method.
|
||||||
|
func setRequestContext(r *Request, ctx aws.Context) {
|
||||||
|
r.context = ctx
|
||||||
|
r.HTTPRequest = r.HTTPRequest.WithContext(ctx)
|
||||||
|
}
|
14
vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go
generated
vendored
Normal file
14
vendor/github.com/aws/aws-sdk-go/aws/request/request_context_1_6.go
generated
vendored
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// +build !go1.7
|
||||||
|
|
||||||
|
package request
|
||||||
|
|
||||||
|
import "github.com/aws/aws-sdk-go/aws"
|
||||||
|
|
||||||
|
// setContext updates the Request to use the passed in context for cancellation.
|
||||||
|
// Context will also be used for request retry delay.
|
||||||
|
//
|
||||||
|
// Creates shallow copy of the http.Request with the WithContext method.
|
||||||
|
func setRequestContext(r *Request, ctx aws.Context) {
|
||||||
|
r.context = ctx
|
||||||
|
r.HTTPRequest.Cancel = ctx.Done()
|
||||||
|
}
|
154
vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go
generated
vendored
154
vendor/github.com/aws/aws-sdk-go/aws/request/request_pagination.go
generated
vendored
|
@ -2,29 +2,125 @@ package request
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/awsutil"
|
"github.com/aws/aws-sdk-go/aws/awsutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
//type Paginater interface {
|
// A Pagination provides paginating of SDK API operations which are paginatable.
|
||||||
// HasNextPage() bool
|
// Generally you should not use this type directly, but use the "Pages" API
|
||||||
// NextPage() *Request
|
// operations method to automatically perform pagination for you. Such as,
|
||||||
// EachPage(fn func(data interface{}, isLastPage bool) (shouldContinue bool)) error
|
// "S3.ListObjectsPages", and "S3.ListObjectsPagesWithContext" methods.
|
||||||
//}
|
//
|
||||||
|
// Pagination differs from a Paginator type in that pagination is the type that
|
||||||
|
// does the pagination between API operations, and Paginator defines the
|
||||||
|
// configuration that will be used per page request.
|
||||||
|
//
|
||||||
|
// cont := true
|
||||||
|
// for p.Next() && cont {
|
||||||
|
// data := p.Page().(*s3.ListObjectsOutput)
|
||||||
|
// // process the page's data
|
||||||
|
// }
|
||||||
|
// return p.Err()
|
||||||
|
//
|
||||||
|
// See service client API operation Pages methods for examples how the SDK will
|
||||||
|
// use the Pagination type.
|
||||||
|
type Pagination struct {
|
||||||
|
// Function to return a Request value for each pagination request.
|
||||||
|
// Any configuration or handlers that need to be applied to the request
|
||||||
|
// prior to getting the next page should be done here before the request
|
||||||
|
// returned.
|
||||||
|
//
|
||||||
|
// NewRequest should always be built from the same API operations. It is
|
||||||
|
// undefined if different API operations are returned on subsequent calls.
|
||||||
|
NewRequest func() (*Request, error)
|
||||||
|
|
||||||
// HasNextPage returns true if this request has more pages of data available.
|
started bool
|
||||||
func (r *Request) HasNextPage() bool {
|
nextTokens []interface{}
|
||||||
return len(r.nextPageTokens()) > 0
|
|
||||||
|
err error
|
||||||
|
curPage interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// nextPageTokens returns the tokens to use when asking for the next page of
|
// HasNextPage will return true if Pagination is able to determine that the API
|
||||||
// data.
|
// operation has additional pages. False will be returned if there are no more
|
||||||
|
// pages remaining.
|
||||||
|
//
|
||||||
|
// Will always return true if Next has not been called yet.
|
||||||
|
func (p *Pagination) HasNextPage() bool {
|
||||||
|
return !(p.started && len(p.nextTokens) == 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Err returns the error Pagination encountered when retrieving the next page.
|
||||||
|
func (p *Pagination) Err() error {
|
||||||
|
return p.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Page returns the current page. Page should only be called after a successful
|
||||||
|
// call to Next. It is undefined what Page will return if Page is called after
|
||||||
|
// Next returns false.
|
||||||
|
func (p *Pagination) Page() interface{} {
|
||||||
|
return p.curPage
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next will attempt to retrieve the next page for the API operation. When a page
|
||||||
|
// is retrieved true will be returned. If the page cannot be retrieved, or there
|
||||||
|
// are no more pages false will be returned.
|
||||||
|
//
|
||||||
|
// Use the Page method to retrieve the current page data. The data will need
|
||||||
|
// to be cast to the API operation's output type.
|
||||||
|
//
|
||||||
|
// Use the Err method to determine if an error occurred if Page returns false.
|
||||||
|
func (p *Pagination) Next() bool {
|
||||||
|
if !p.HasNextPage() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := p.NewRequest()
|
||||||
|
if err != nil {
|
||||||
|
p.err = err
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if p.started {
|
||||||
|
for i, intok := range req.Operation.InputTokens {
|
||||||
|
awsutil.SetValueAtPath(req.Params, intok, p.nextTokens[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.started = true
|
||||||
|
|
||||||
|
err = req.Send()
|
||||||
|
if err != nil {
|
||||||
|
p.err = err
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
p.nextTokens = req.nextPageTokens()
|
||||||
|
p.curPage = req.Data
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Paginator is the configuration data that defines how an API operation
|
||||||
|
// should be paginated. This type is used by the API service models to define
|
||||||
|
// the generated pagination config for service APIs.
|
||||||
|
//
|
||||||
|
// The Pagination type is what provides iterating between pages of an API. It
|
||||||
|
// is only used to store the token metadata the SDK should use for performing
|
||||||
|
// pagination.
|
||||||
|
type Paginator struct {
|
||||||
|
InputTokens []string
|
||||||
|
OutputTokens []string
|
||||||
|
LimitToken string
|
||||||
|
TruncationToken string
|
||||||
|
}
|
||||||
|
|
||||||
|
// nextPageTokens returns the tokens to use when asking for the next page of data.
|
||||||
func (r *Request) nextPageTokens() []interface{} {
|
func (r *Request) nextPageTokens() []interface{} {
|
||||||
if r.Operation.Paginator == nil {
|
if r.Operation.Paginator == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.Operation.TruncationToken != "" {
|
if r.Operation.TruncationToken != "" {
|
||||||
tr, _ := awsutil.ValuesAtPath(r.Data, r.Operation.TruncationToken)
|
tr, _ := awsutil.ValuesAtPath(r.Data, r.Operation.TruncationToken)
|
||||||
if len(tr) == 0 {
|
if len(tr) == 0 {
|
||||||
|
@ -61,9 +157,40 @@ func (r *Request) nextPageTokens() []interface{} {
|
||||||
return tokens
|
return tokens
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ensure a deprecated item is only logged once instead of each time its used.
|
||||||
|
func logDeprecatedf(logger aws.Logger, flag *int32, msg string) {
|
||||||
|
if logger == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if atomic.CompareAndSwapInt32(flag, 0, 1) {
|
||||||
|
logger.Log(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
logDeprecatedHasNextPage int32
|
||||||
|
logDeprecatedNextPage int32
|
||||||
|
logDeprecatedEachPage int32
|
||||||
|
)
|
||||||
|
|
||||||
|
// HasNextPage returns true if this request has more pages of data available.
|
||||||
|
//
|
||||||
|
// Deprecated Use Pagination type for configurable pagination of API operations
|
||||||
|
func (r *Request) HasNextPage() bool {
|
||||||
|
logDeprecatedf(r.Config.Logger, &logDeprecatedHasNextPage,
|
||||||
|
"Request.HasNextPage deprecated. Use Pagination type for configurable pagination of API operations")
|
||||||
|
|
||||||
|
return len(r.nextPageTokens()) > 0
|
||||||
|
}
|
||||||
|
|
||||||
// NextPage returns a new Request that can be executed to return the next
|
// NextPage returns a new Request that can be executed to return the next
|
||||||
// page of result data. Call .Send() on this request to execute it.
|
// page of result data. Call .Send() on this request to execute it.
|
||||||
|
//
|
||||||
|
// Deprecated Use Pagination type for configurable pagination of API operations
|
||||||
func (r *Request) NextPage() *Request {
|
func (r *Request) NextPage() *Request {
|
||||||
|
logDeprecatedf(r.Config.Logger, &logDeprecatedNextPage,
|
||||||
|
"Request.NextPage deprecated. Use Pagination type for configurable pagination of API operations")
|
||||||
|
|
||||||
tokens := r.nextPageTokens()
|
tokens := r.nextPageTokens()
|
||||||
if len(tokens) == 0 {
|
if len(tokens) == 0 {
|
||||||
return nil
|
return nil
|
||||||
|
@ -90,7 +217,12 @@ func (r *Request) NextPage() *Request {
|
||||||
// as the structure "T". The lastPage value represents whether the page is
|
// as the structure "T". The lastPage value represents whether the page is
|
||||||
// the last page of data or not. The return value of this function should
|
// the last page of data or not. The return value of this function should
|
||||||
// return true to keep iterating or false to stop.
|
// return true to keep iterating or false to stop.
|
||||||
|
//
|
||||||
|
// Deprecated Use Pagination type for configurable pagination of API operations
|
||||||
func (r *Request) EachPage(fn func(data interface{}, isLastPage bool) (shouldContinue bool)) error {
|
func (r *Request) EachPage(fn func(data interface{}, isLastPage bool) (shouldContinue bool)) error {
|
||||||
|
logDeprecatedf(r.Config.Logger, &logDeprecatedEachPage,
|
||||||
|
"Request.EachPage deprecated. Use Pagination type for configurable pagination of API operations")
|
||||||
|
|
||||||
for page := r; page != nil; page = page.NextPage() {
|
for page := r; page != nil; page = page.NextPage() {
|
||||||
if err := page.Send(); err != nil {
|
if err := page.Send(); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
99
vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go
generated
vendored
99
vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go
generated
vendored
|
@ -8,7 +8,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// Retryer is an interface to control retry logic for a given service.
|
// Retryer is an interface to control retry logic for a given service.
|
||||||
// The default implementation used by most services is the service.DefaultRetryer
|
// The default implementation used by most services is the client.DefaultRetryer
|
||||||
// structure, which contains basic retry logic using exponential backoff.
|
// structure, which contains basic retry logic using exponential backoff.
|
||||||
type Retryer interface {
|
type Retryer interface {
|
||||||
RetryRules(*Request) time.Duration
|
RetryRules(*Request) time.Duration
|
||||||
|
@ -26,8 +26,10 @@ func WithRetryer(cfg *aws.Config, retryer Retryer) *aws.Config {
|
||||||
// retryableCodes is a collection of service response codes which are retry-able
|
// retryableCodes is a collection of service response codes which are retry-able
|
||||||
// without any further action.
|
// without any further action.
|
||||||
var retryableCodes = map[string]struct{}{
|
var retryableCodes = map[string]struct{}{
|
||||||
"RequestError": {},
|
"RequestError": {},
|
||||||
"RequestTimeout": {},
|
"RequestTimeout": {},
|
||||||
|
ErrCodeResponseTimeout: {},
|
||||||
|
"RequestTimeoutException": {}, // Glacier's flavor of RequestTimeout
|
||||||
}
|
}
|
||||||
|
|
||||||
var throttleCodes = map[string]struct{}{
|
var throttleCodes = map[string]struct{}{
|
||||||
|
@ -36,7 +38,6 @@ var throttleCodes = map[string]struct{}{
|
||||||
"ThrottlingException": {},
|
"ThrottlingException": {},
|
||||||
"RequestLimitExceeded": {},
|
"RequestLimitExceeded": {},
|
||||||
"RequestThrottled": {},
|
"RequestThrottled": {},
|
||||||
"LimitExceededException": {}, // Deleting 10+ DynamoDb tables at once
|
|
||||||
"TooManyRequestsException": {}, // Lambda functions
|
"TooManyRequestsException": {}, // Lambda functions
|
||||||
"PriorRequestNotComplete": {}, // Route53
|
"PriorRequestNotComplete": {}, // Route53
|
||||||
}
|
}
|
||||||
|
@ -68,35 +69,93 @@ func isCodeExpiredCreds(code string) bool {
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var validParentCodes = map[string]struct{}{
|
||||||
|
ErrCodeSerialization: {},
|
||||||
|
ErrCodeRead: {},
|
||||||
|
}
|
||||||
|
|
||||||
|
type temporaryError interface {
|
||||||
|
Temporary() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func isNestedErrorRetryable(parentErr awserr.Error) bool {
|
||||||
|
if parentErr == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := validParentCodes[parentErr.Code()]; !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
err := parentErr.OrigErr()
|
||||||
|
if err == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if aerr, ok := err.(awserr.Error); ok {
|
||||||
|
return isCodeRetryable(aerr.Code())
|
||||||
|
}
|
||||||
|
|
||||||
|
if t, ok := err.(temporaryError); ok {
|
||||||
|
return t.Temporary()
|
||||||
|
}
|
||||||
|
|
||||||
|
return isErrConnectionReset(err)
|
||||||
|
}
|
||||||
|
|
||||||
// IsErrorRetryable returns whether the error is retryable, based on its Code.
|
// IsErrorRetryable returns whether the error is retryable, based on its Code.
|
||||||
// Returns false if the request has no Error set.
|
// Returns false if error is nil.
|
||||||
func (r *Request) IsErrorRetryable() bool {
|
func IsErrorRetryable(err error) bool {
|
||||||
if r.Error != nil {
|
if err != nil {
|
||||||
if err, ok := r.Error.(awserr.Error); ok {
|
if aerr, ok := err.(awserr.Error); ok {
|
||||||
return isCodeRetryable(err.Code())
|
return isCodeRetryable(aerr.Code()) || isNestedErrorRetryable(aerr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrorThrottle returns whether the error is to be throttled based on its code.
|
// IsErrorThrottle returns whether the error is to be throttled based on its code.
|
||||||
// Returns false if the request has no Error set
|
// Returns false if error is nil.
|
||||||
func (r *Request) IsErrorThrottle() bool {
|
func IsErrorThrottle(err error) bool {
|
||||||
if r.Error != nil {
|
if err != nil {
|
||||||
if err, ok := r.Error.(awserr.Error); ok {
|
if aerr, ok := err.(awserr.Error); ok {
|
||||||
return isCodeThrottle(err.Code())
|
return isCodeThrottle(aerr.Code())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrorExpired returns whether the error code is a credential expiry error.
|
// IsErrorExpiredCreds returns whether the error code is a credential expiry error.
|
||||||
// Returns false if the request has no Error set.
|
// Returns false if error is nil.
|
||||||
func (r *Request) IsErrorExpired() bool {
|
func IsErrorExpiredCreds(err error) bool {
|
||||||
if r.Error != nil {
|
if err != nil {
|
||||||
if err, ok := r.Error.(awserr.Error); ok {
|
if aerr, ok := err.(awserr.Error); ok {
|
||||||
return isCodeExpiredCreds(err.Code())
|
return isCodeExpiredCreds(aerr.Code())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsErrorRetryable returns whether the error is retryable, based on its Code.
|
||||||
|
// Returns false if the request has no Error set.
|
||||||
|
//
|
||||||
|
// Alias for the utility function IsErrorRetryable
|
||||||
|
func (r *Request) IsErrorRetryable() bool {
|
||||||
|
return IsErrorRetryable(r.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsErrorThrottle returns whether the error is to be throttled based on its code.
|
||||||
|
// Returns false if the request has no Error set
|
||||||
|
//
|
||||||
|
// Alias for the utility function IsErrorThrottle
|
||||||
|
func (r *Request) IsErrorThrottle() bool {
|
||||||
|
return IsErrorThrottle(r.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsErrorExpired returns whether the error code is a credential expiry error.
|
||||||
|
// Returns false if the request has no Error set.
|
||||||
|
//
|
||||||
|
// Alias for the utility function IsErrorExpiredCreds
|
||||||
|
func (r *Request) IsErrorExpired() bool {
|
||||||
|
return IsErrorExpiredCreds(r.Error)
|
||||||
|
}
|
||||||
|
|
94
vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go
generated
vendored
Normal file
94
vendor/github.com/aws/aws-sdk-go/aws/request/timeout_read_closer.go
generated
vendored
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
package request
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
)
|
||||||
|
|
||||||
|
var timeoutErr = awserr.New(
|
||||||
|
ErrCodeResponseTimeout,
|
||||||
|
"read on body has reached the timeout limit",
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
|
||||||
|
type readResult struct {
|
||||||
|
n int
|
||||||
|
err error
|
||||||
|
}
|
||||||
|
|
||||||
|
// timeoutReadCloser will handle body reads that take too long.
|
||||||
|
// We will return a ErrReadTimeout error if a timeout occurs.
|
||||||
|
type timeoutReadCloser struct {
|
||||||
|
reader io.ReadCloser
|
||||||
|
duration time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read will spin off a goroutine to call the reader's Read method. We will
|
||||||
|
// select on the timer's channel or the read's channel. Whoever completes first
|
||||||
|
// will be returned.
|
||||||
|
func (r *timeoutReadCloser) Read(b []byte) (int, error) {
|
||||||
|
timer := time.NewTimer(r.duration)
|
||||||
|
c := make(chan readResult, 1)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
n, err := r.reader.Read(b)
|
||||||
|
timer.Stop()
|
||||||
|
c <- readResult{n: n, err: err}
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case data := <-c:
|
||||||
|
return data.n, data.err
|
||||||
|
case <-timer.C:
|
||||||
|
return 0, timeoutErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *timeoutReadCloser) Close() error {
|
||||||
|
return r.reader.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// HandlerResponseTimeout is what we use to signify the name of the
|
||||||
|
// response timeout handler.
|
||||||
|
HandlerResponseTimeout = "ResponseTimeoutHandler"
|
||||||
|
)
|
||||||
|
|
||||||
|
// adaptToResponseTimeoutError is a handler that will replace any top level error
|
||||||
|
// to a ErrCodeResponseTimeout, if its child is that.
|
||||||
|
func adaptToResponseTimeoutError(req *Request) {
|
||||||
|
if err, ok := req.Error.(awserr.Error); ok {
|
||||||
|
aerr, ok := err.OrigErr().(awserr.Error)
|
||||||
|
if ok && aerr.Code() == ErrCodeResponseTimeout {
|
||||||
|
req.Error = aerr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithResponseReadTimeout is a request option that will wrap the body in a timeout read closer.
|
||||||
|
// This will allow for per read timeouts. If a timeout occurred, we will return the
|
||||||
|
// ErrCodeResponseTimeout.
|
||||||
|
//
|
||||||
|
// svc.PutObjectWithContext(ctx, params, request.WithTimeoutReadCloser(30 * time.Second)
|
||||||
|
func WithResponseReadTimeout(duration time.Duration) Option {
|
||||||
|
return func(r *Request) {
|
||||||
|
|
||||||
|
var timeoutHandler = NamedHandler{
|
||||||
|
HandlerResponseTimeout,
|
||||||
|
func(req *Request) {
|
||||||
|
req.HTTPResponse.Body = &timeoutReadCloser{
|
||||||
|
reader: req.HTTPResponse.Body,
|
||||||
|
duration: duration,
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
// remove the handler so we are not stomping over any new durations.
|
||||||
|
r.Handlers.Send.RemoveByName(HandlerResponseTimeout)
|
||||||
|
r.Handlers.Send.PushBackNamed(timeoutHandler)
|
||||||
|
|
||||||
|
r.Handlers.Unmarshal.PushBack(adaptToResponseTimeoutError)
|
||||||
|
r.Handlers.UnmarshalError.PushBack(adaptToResponseTimeoutError)
|
||||||
|
}
|
||||||
|
}
|
2
vendor/github.com/aws/aws-sdk-go/aws/request/validation.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/request/validation.go
generated
vendored
|
@ -220,7 +220,7 @@ type ErrParamMinLen struct {
|
||||||
func NewErrParamMinLen(field string, min int) *ErrParamMinLen {
|
func NewErrParamMinLen(field string, min int) *ErrParamMinLen {
|
||||||
return &ErrParamMinLen{
|
return &ErrParamMinLen{
|
||||||
errInvalidParam: errInvalidParam{
|
errInvalidParam: errInvalidParam{
|
||||||
code: ParamMinValueErrCode,
|
code: ParamMinLenErrCode,
|
||||||
field: field,
|
field: field,
|
||||||
msg: fmt.Sprintf("minimum field size of %v", min),
|
msg: fmt.Sprintf("minimum field size of %v", min),
|
||||||
},
|
},
|
||||||
|
|
295
vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go
generated
vendored
Normal file
295
vendor/github.com/aws/aws-sdk-go/aws/request/waiter.go
generated
vendored
Normal file
|
@ -0,0 +1,295 @@
|
||||||
|
package request
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awsutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WaiterResourceNotReadyErrorCode is the error code returned by a waiter when
|
||||||
|
// the waiter's max attempts have been exhausted.
|
||||||
|
const WaiterResourceNotReadyErrorCode = "ResourceNotReady"
|
||||||
|
|
||||||
|
// A WaiterOption is a function that will update the Waiter value's fields to
|
||||||
|
// configure the waiter.
|
||||||
|
type WaiterOption func(*Waiter)
|
||||||
|
|
||||||
|
// WithWaiterMaxAttempts returns the maximum number of times the waiter should
|
||||||
|
// attempt to check the resource for the target state.
|
||||||
|
func WithWaiterMaxAttempts(max int) WaiterOption {
|
||||||
|
return func(w *Waiter) {
|
||||||
|
w.MaxAttempts = max
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaiterDelay will return a delay the waiter should pause between attempts to
|
||||||
|
// check the resource state. The passed in attempt is the number of times the
|
||||||
|
// Waiter has checked the resource state.
|
||||||
|
//
|
||||||
|
// Attempt is the number of attempts the Waiter has made checking the resource
|
||||||
|
// state.
|
||||||
|
type WaiterDelay func(attempt int) time.Duration
|
||||||
|
|
||||||
|
// ConstantWaiterDelay returns a WaiterDelay that will always return a constant
|
||||||
|
// delay the waiter should use between attempts. It ignores the number of
|
||||||
|
// attempts made.
|
||||||
|
func ConstantWaiterDelay(delay time.Duration) WaiterDelay {
|
||||||
|
return func(attempt int) time.Duration {
|
||||||
|
return delay
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithWaiterDelay will set the Waiter to use the WaiterDelay passed in.
|
||||||
|
func WithWaiterDelay(delayer WaiterDelay) WaiterOption {
|
||||||
|
return func(w *Waiter) {
|
||||||
|
w.Delay = delayer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithWaiterLogger returns a waiter option to set the logger a waiter
|
||||||
|
// should use to log warnings and errors to.
|
||||||
|
func WithWaiterLogger(logger aws.Logger) WaiterOption {
|
||||||
|
return func(w *Waiter) {
|
||||||
|
w.Logger = logger
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithWaiterRequestOptions returns a waiter option setting the request
|
||||||
|
// options for each request the waiter makes. Appends to waiter's request
|
||||||
|
// options already set.
|
||||||
|
func WithWaiterRequestOptions(opts ...Option) WaiterOption {
|
||||||
|
return func(w *Waiter) {
|
||||||
|
w.RequestOptions = append(w.RequestOptions, opts...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Waiter provides the functionality to perform a blocking call which will
|
||||||
|
// wait for a resource state to be satisfied by a service.
|
||||||
|
//
|
||||||
|
// This type should not be used directly. The API operations provided in the
|
||||||
|
// service packages prefixed with "WaitUntil" should be used instead.
|
||||||
|
type Waiter struct {
|
||||||
|
Name string
|
||||||
|
Acceptors []WaiterAcceptor
|
||||||
|
Logger aws.Logger
|
||||||
|
|
||||||
|
MaxAttempts int
|
||||||
|
Delay WaiterDelay
|
||||||
|
|
||||||
|
RequestOptions []Option
|
||||||
|
NewRequest func([]Option) (*Request, error)
|
||||||
|
SleepWithContext func(aws.Context, time.Duration) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApplyOptions updates the waiter with the list of waiter options provided.
|
||||||
|
func (w *Waiter) ApplyOptions(opts ...WaiterOption) {
|
||||||
|
for _, fn := range opts {
|
||||||
|
fn(w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaiterState are states the waiter uses based on WaiterAcceptor definitions
|
||||||
|
// to identify if the resource state the waiter is waiting on has occurred.
|
||||||
|
type WaiterState int
|
||||||
|
|
||||||
|
// String returns the string representation of the waiter state.
|
||||||
|
func (s WaiterState) String() string {
|
||||||
|
switch s {
|
||||||
|
case SuccessWaiterState:
|
||||||
|
return "success"
|
||||||
|
case FailureWaiterState:
|
||||||
|
return "failure"
|
||||||
|
case RetryWaiterState:
|
||||||
|
return "retry"
|
||||||
|
default:
|
||||||
|
return "unknown waiter state"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// States the waiter acceptors will use to identify target resource states.
|
||||||
|
const (
|
||||||
|
SuccessWaiterState WaiterState = iota // waiter successful
|
||||||
|
FailureWaiterState // waiter failed
|
||||||
|
RetryWaiterState // waiter needs to be retried
|
||||||
|
)
|
||||||
|
|
||||||
|
// WaiterMatchMode is the mode that the waiter will use to match the WaiterAcceptor
|
||||||
|
// definition's Expected attribute.
|
||||||
|
type WaiterMatchMode int
|
||||||
|
|
||||||
|
// Modes the waiter will use when inspecting API response to identify target
|
||||||
|
// resource states.
|
||||||
|
const (
|
||||||
|
PathAllWaiterMatch WaiterMatchMode = iota // match on all paths
|
||||||
|
PathWaiterMatch // match on specific path
|
||||||
|
PathAnyWaiterMatch // match on any path
|
||||||
|
PathListWaiterMatch // match on list of paths
|
||||||
|
StatusWaiterMatch // match on status code
|
||||||
|
ErrorWaiterMatch // match on error
|
||||||
|
)
|
||||||
|
|
||||||
|
// String returns the string representation of the waiter match mode.
|
||||||
|
func (m WaiterMatchMode) String() string {
|
||||||
|
switch m {
|
||||||
|
case PathAllWaiterMatch:
|
||||||
|
return "pathAll"
|
||||||
|
case PathWaiterMatch:
|
||||||
|
return "path"
|
||||||
|
case PathAnyWaiterMatch:
|
||||||
|
return "pathAny"
|
||||||
|
case PathListWaiterMatch:
|
||||||
|
return "pathList"
|
||||||
|
case StatusWaiterMatch:
|
||||||
|
return "status"
|
||||||
|
case ErrorWaiterMatch:
|
||||||
|
return "error"
|
||||||
|
default:
|
||||||
|
return "unknown waiter match mode"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WaitWithContext will make requests for the API operation using NewRequest to
|
||||||
|
// build API requests. The request's response will be compared against the
|
||||||
|
// Waiter's Acceptors to determine the successful state of the resource the
|
||||||
|
// waiter is inspecting.
|
||||||
|
//
|
||||||
|
// The passed in context must not be nil. If it is nil a panic will occur. The
|
||||||
|
// Context will be used to cancel the waiter's pending requests and retry delays.
|
||||||
|
// Use aws.BackgroundContext if no context is available.
|
||||||
|
//
|
||||||
|
// The waiter will continue until the target state defined by the Acceptors,
|
||||||
|
// or the max attempts expires.
|
||||||
|
//
|
||||||
|
// Will return the WaiterResourceNotReadyErrorCode error code if the waiter's
|
||||||
|
// retryer ShouldRetry returns false. This normally will happen when the max
|
||||||
|
// wait attempts expires.
|
||||||
|
func (w Waiter) WaitWithContext(ctx aws.Context) error {
|
||||||
|
|
||||||
|
for attempt := 1; ; attempt++ {
|
||||||
|
req, err := w.NewRequest(w.RequestOptions)
|
||||||
|
if err != nil {
|
||||||
|
waiterLogf(w.Logger, "unable to create request %v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
req.Handlers.Build.PushBack(MakeAddToUserAgentFreeFormHandler("Waiter"))
|
||||||
|
err = req.Send()
|
||||||
|
|
||||||
|
// See if any of the acceptors match the request's response, or error
|
||||||
|
for _, a := range w.Acceptors {
|
||||||
|
if matched, matchErr := a.match(w.Name, w.Logger, req, err); matched {
|
||||||
|
return matchErr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Waiter should only check the resource state MaxAttempts times
|
||||||
|
// This is here instead of in the for loop above to prevent delaying
|
||||||
|
// unnecessary when the waiter will not retry.
|
||||||
|
if attempt == w.MaxAttempts {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delay to wait before inspecting the resource again
|
||||||
|
delay := w.Delay(attempt)
|
||||||
|
if sleepFn := req.Config.SleepDelay; sleepFn != nil {
|
||||||
|
// Support SleepDelay for backwards compatibility and testing
|
||||||
|
sleepFn(delay)
|
||||||
|
} else {
|
||||||
|
sleepCtxFn := w.SleepWithContext
|
||||||
|
if sleepCtxFn == nil {
|
||||||
|
sleepCtxFn = aws.SleepWithContext
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sleepCtxFn(ctx, delay); err != nil {
|
||||||
|
return awserr.New(CanceledErrorCode, "waiter context canceled", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return awserr.New(WaiterResourceNotReadyErrorCode, "exceeded wait attempts", nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// A WaiterAcceptor provides the information needed to wait for an API operation
|
||||||
|
// to complete.
|
||||||
|
type WaiterAcceptor struct {
|
||||||
|
State WaiterState
|
||||||
|
Matcher WaiterMatchMode
|
||||||
|
Argument string
|
||||||
|
Expected interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// match returns if the acceptor found a match with the passed in request
|
||||||
|
// or error. True is returned if the acceptor made a match, error is returned
|
||||||
|
// if there was an error attempting to perform the match.
|
||||||
|
func (a *WaiterAcceptor) match(name string, l aws.Logger, req *Request, err error) (bool, error) {
|
||||||
|
result := false
|
||||||
|
var vals []interface{}
|
||||||
|
|
||||||
|
switch a.Matcher {
|
||||||
|
case PathAllWaiterMatch, PathWaiterMatch:
|
||||||
|
// Require all matches to be equal for result to match
|
||||||
|
vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument)
|
||||||
|
if len(vals) == 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
result = true
|
||||||
|
for _, val := range vals {
|
||||||
|
if !awsutil.DeepEqual(val, a.Expected) {
|
||||||
|
result = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case PathAnyWaiterMatch:
|
||||||
|
// Only a single match needs to equal for the result to match
|
||||||
|
vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument)
|
||||||
|
for _, val := range vals {
|
||||||
|
if awsutil.DeepEqual(val, a.Expected) {
|
||||||
|
result = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case PathListWaiterMatch:
|
||||||
|
// ignored matcher
|
||||||
|
case StatusWaiterMatch:
|
||||||
|
s := a.Expected.(int)
|
||||||
|
result = s == req.HTTPResponse.StatusCode
|
||||||
|
case ErrorWaiterMatch:
|
||||||
|
if aerr, ok := err.(awserr.Error); ok {
|
||||||
|
result = aerr.Code() == a.Expected.(string)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
waiterLogf(l, "WARNING: Waiter %s encountered unexpected matcher: %s",
|
||||||
|
name, a.Matcher)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !result {
|
||||||
|
// If there was no matching result found there is nothing more to do
|
||||||
|
// for this response, retry the request.
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
switch a.State {
|
||||||
|
case SuccessWaiterState:
|
||||||
|
// waiter completed
|
||||||
|
return true, nil
|
||||||
|
case FailureWaiterState:
|
||||||
|
// Waiter failure state triggered
|
||||||
|
return true, awserr.New(WaiterResourceNotReadyErrorCode,
|
||||||
|
"failed waiting for successful resource state", err)
|
||||||
|
case RetryWaiterState:
|
||||||
|
// clear the error and retry the operation
|
||||||
|
return false, nil
|
||||||
|
default:
|
||||||
|
waiterLogf(l, "WARNING: Waiter %s encountered unexpected state: %s",
|
||||||
|
name, a.State)
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func waiterLogf(logger aws.Logger, msg string, args ...interface{}) {
|
||||||
|
if logger != nil {
|
||||||
|
logger.Log(fmt.Sprintf(msg, args...))
|
||||||
|
}
|
||||||
|
}
|
98
vendor/github.com/aws/aws-sdk-go/aws/session/doc.go
generated
vendored
98
vendor/github.com/aws/aws-sdk-go/aws/session/doc.go
generated
vendored
|
@ -23,7 +23,7 @@ additional config if the AWS_SDK_LOAD_CONFIG environment variable is set.
|
||||||
Alternatively you can explicitly create a Session with shared config enabled.
|
Alternatively you can explicitly create a Session with shared config enabled.
|
||||||
To do this you can use NewSessionWithOptions to configure how the Session will
|
To do this you can use NewSessionWithOptions to configure how the Session will
|
||||||
be created. Using the NewSessionWithOptions with SharedConfigState set to
|
be created. Using the NewSessionWithOptions with SharedConfigState set to
|
||||||
SharedConfigEnabled will create the session as if the AWS_SDK_LOAD_CONFIG
|
SharedConfigEnable will create the session as if the AWS_SDK_LOAD_CONFIG
|
||||||
environment variable was set.
|
environment variable was set.
|
||||||
|
|
||||||
Creating Sessions
|
Creating Sessions
|
||||||
|
@ -45,16 +45,16 @@ region, and profile loaded from the environment and shared config automatically.
|
||||||
Requires the AWS_PROFILE to be set, or "default" is used.
|
Requires the AWS_PROFILE to be set, or "default" is used.
|
||||||
|
|
||||||
// Create Session
|
// Create Session
|
||||||
sess, err := session.NewSession()
|
sess := session.Must(session.NewSession())
|
||||||
|
|
||||||
// Create a Session with a custom region
|
// Create a Session with a custom region
|
||||||
sess, err := session.NewSession(&aws.Config{Region: aws.String("us-east-1")})
|
sess := session.Must(session.NewSession(&aws.Config{
|
||||||
|
Region: aws.String("us-east-1"),
|
||||||
|
}))
|
||||||
|
|
||||||
// Create a S3 client instance from a session
|
// Create a S3 client instance from a session
|
||||||
sess, err := session.NewSession()
|
sess := session.Must(session.NewSession())
|
||||||
if err != nil {
|
|
||||||
// Handle Session creation error
|
|
||||||
}
|
|
||||||
svc := s3.New(sess)
|
svc := s3.New(sess)
|
||||||
|
|
||||||
Create Session With Option Overrides
|
Create Session With Option Overrides
|
||||||
|
@ -67,23 +67,25 @@ Use NewSessionWithOptions when you want to provide the config profile, or
|
||||||
override the shared config state (AWS_SDK_LOAD_CONFIG).
|
override the shared config state (AWS_SDK_LOAD_CONFIG).
|
||||||
|
|
||||||
// Equivalent to session.NewSession()
|
// Equivalent to session.NewSession()
|
||||||
sess, err := session.NewSessionWithOptions(session.Options{})
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
|
// Options
|
||||||
|
}))
|
||||||
|
|
||||||
// Specify profile to load for the session's config
|
// Specify profile to load for the session's config
|
||||||
sess, err := session.NewSessionWithOptions(session.Options{
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
Profile: "profile_name",
|
Profile: "profile_name",
|
||||||
})
|
}))
|
||||||
|
|
||||||
// Specify profile for config and region for requests
|
// Specify profile for config and region for requests
|
||||||
sess, err := session.NewSessionWithOptions(session.Options{
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
Config: aws.Config{Region: aws.String("us-east-1")},
|
Config: aws.Config{Region: aws.String("us-east-1")},
|
||||||
Profile: "profile_name",
|
Profile: "profile_name",
|
||||||
})
|
}))
|
||||||
|
|
||||||
// Force enable Shared Config support
|
// Force enable Shared Config support
|
||||||
sess, err := session.NewSessionWithOptions(session.Options{
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
SharedConfigState: SharedConfigEnable,
|
SharedConfigState: session.SharedConfigEnable,
|
||||||
})
|
}))
|
||||||
|
|
||||||
Adding Handlers
|
Adding Handlers
|
||||||
|
|
||||||
|
@ -93,7 +95,8 @@ handler logs every request and its payload made by a service client:
|
||||||
|
|
||||||
// Create a session, and add additional handlers for all service
|
// Create a session, and add additional handlers for all service
|
||||||
// clients created with the Session to inherit. Adds logging handler.
|
// clients created with the Session to inherit. Adds logging handler.
|
||||||
sess, err := session.NewSession()
|
sess := session.Must(session.NewSession())
|
||||||
|
|
||||||
sess.Handlers.Send.PushFront(func(r *request.Request) {
|
sess.Handlers.Send.PushFront(func(r *request.Request) {
|
||||||
// Log every request made and its payload
|
// Log every request made and its payload
|
||||||
logger.Println("Request: %s/%s, Payload: %s",
|
logger.Println("Request: %s/%s, Payload: %s",
|
||||||
|
@ -121,9 +124,8 @@ file (~/.aws/config) and shared credentials file (~/.aws/credentials). Both
|
||||||
files have the same format.
|
files have the same format.
|
||||||
|
|
||||||
If both config files are present the configuration from both files will be
|
If both config files are present the configuration from both files will be
|
||||||
read. The Session will be created from configuration values from the shared
|
read. The Session will be created from configuration values from the shared
|
||||||
credentials file (~/.aws/credentials) over those in the shared credentials
|
credentials file (~/.aws/credentials) over those in the shared config file (~/.aws/config).
|
||||||
file (~/.aws/config).
|
|
||||||
|
|
||||||
Credentials are the values the SDK should use for authenticating requests with
|
Credentials are the values the SDK should use for authenticating requests with
|
||||||
AWS Services. They arfrom a configuration file will need to include both
|
AWS Services. They arfrom a configuration file will need to include both
|
||||||
|
@ -138,15 +140,14 @@ the other two fields are also provided.
|
||||||
|
|
||||||
Assume Role values allow you to configure the SDK to assume an IAM role using
|
Assume Role values allow you to configure the SDK to assume an IAM role using
|
||||||
a set of credentials provided in a config file via the source_profile field.
|
a set of credentials provided in a config file via the source_profile field.
|
||||||
Both "role_arn" and "source_profile" are required. The SDK does not support
|
Both "role_arn" and "source_profile" are required. The SDK supports assuming
|
||||||
assuming a role with MFA token Via the Session's constructor. You can use the
|
a role with MFA token if the session option AssumeRoleTokenProvider
|
||||||
stscreds.AssumeRoleProvider credentials provider to specify custom
|
is set.
|
||||||
configuration and support for MFA.
|
|
||||||
|
|
||||||
role_arn = arn:aws:iam::<account_number>:role/<role_name>
|
role_arn = arn:aws:iam::<account_number>:role/<role_name>
|
||||||
source_profile = profile_with_creds
|
source_profile = profile_with_creds
|
||||||
external_id = 1234
|
external_id = 1234
|
||||||
mfa_serial = not supported!
|
mfa_serial = <serial or mfa arn>
|
||||||
role_session_name = session_name
|
role_session_name = session_name
|
||||||
|
|
||||||
Region is the region the SDK should use for looking up AWS service endpoints
|
Region is the region the SDK should use for looking up AWS service endpoints
|
||||||
|
@ -154,6 +155,37 @@ and signing requests.
|
||||||
|
|
||||||
region = us-east-1
|
region = us-east-1
|
||||||
|
|
||||||
|
Assume Role with MFA token
|
||||||
|
|
||||||
|
To create a session with support for assuming an IAM role with MFA set the
|
||||||
|
session option AssumeRoleTokenProvider to a function that will prompt for the
|
||||||
|
MFA token code when the SDK assumes the role and refreshes the role's credentials.
|
||||||
|
This allows you to configure the SDK via the shared config to assumea role
|
||||||
|
with MFA tokens.
|
||||||
|
|
||||||
|
In order for the SDK to assume a role with MFA the SharedConfigState
|
||||||
|
session option must be set to SharedConfigEnable, or AWS_SDK_LOAD_CONFIG
|
||||||
|
environment variable set.
|
||||||
|
|
||||||
|
The shared configuration instructs the SDK to assume an IAM role with MFA
|
||||||
|
when the mfa_serial configuration field is set in the shared config
|
||||||
|
(~/.aws/config) or shared credentials (~/.aws/credentials) file.
|
||||||
|
|
||||||
|
If mfa_serial is set in the configuration, the SDK will assume the role, and
|
||||||
|
the AssumeRoleTokenProvider session option is not set an an error will
|
||||||
|
be returned when creating the session.
|
||||||
|
|
||||||
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
|
AssumeRoleTokenProvider: stscreds.StdinTokenProvider,
|
||||||
|
}))
|
||||||
|
|
||||||
|
// Create service client value configured for credentials
|
||||||
|
// from assumed role.
|
||||||
|
svc := s3.New(sess)
|
||||||
|
|
||||||
|
To setup assume role outside of a session see the stscrds.AssumeRoleProvider
|
||||||
|
documentation.
|
||||||
|
|
||||||
Environment Variables
|
Environment Variables
|
||||||
|
|
||||||
When a Session is created several environment variables can be set to adjust
|
When a Session is created several environment variables can be set to adjust
|
||||||
|
@ -218,6 +250,24 @@ $HOME/.aws/config on Linux/Unix based systems, and
|
||||||
|
|
||||||
AWS_CONFIG_FILE=$HOME/my_shared_config
|
AWS_CONFIG_FILE=$HOME/my_shared_config
|
||||||
|
|
||||||
|
Path to a custom Credentials Authority (CA) bundle PEM file that the SDK
|
||||||
|
will use instead of the default system's root CA bundle. Use this only
|
||||||
|
if you want to replace the CA bundle the SDK uses for TLS requests.
|
||||||
|
|
||||||
|
AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle
|
||||||
|
|
||||||
|
Enabling this option will attempt to merge the Transport into the SDK's HTTP
|
||||||
|
client. If the client's Transport is not a http.Transport an error will be
|
||||||
|
returned. If the Transport's TLS config is set this option will cause the SDK
|
||||||
|
to overwrite the Transport's TLS config's RootCAs value. If the CA bundle file
|
||||||
|
contains multiple certificates all of them will be loaded.
|
||||||
|
|
||||||
|
The Session option CustomCABundle is also available when creating sessions
|
||||||
|
to also enable this feature. CustomCABundle session option field has priority
|
||||||
|
over the AWS_CA_BUNDLE environment variable, and will be used if both are set.
|
||||||
|
|
||||||
|
Setting a custom HTTPClient in the aws.Config options will override this setting.
|
||||||
|
To use this option and custom HTTP client, the HTTP client needs to be provided
|
||||||
|
when creating the session. Not the service client.
|
||||||
*/
|
*/
|
||||||
package session
|
package session
|
||||||
|
|
61
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
61
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
|
@ -2,12 +2,14 @@ package session
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"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
|
||||||
|
@ -75,6 +77,24 @@ type envConfig struct {
|
||||||
//
|
//
|
||||||
// AWS_CONFIG_FILE=$HOME/my_shared_config
|
// AWS_CONFIG_FILE=$HOME/my_shared_config
|
||||||
SharedConfigFile string
|
SharedConfigFile string
|
||||||
|
|
||||||
|
// Sets the path to a custom Credentials Authroity (CA) Bundle PEM file
|
||||||
|
// that the SDK will use instead of the system's root CA bundle.
|
||||||
|
// Only use this if you want to configure the SDK to use a custom set
|
||||||
|
// of CAs.
|
||||||
|
//
|
||||||
|
// Enabling this option will attempt to merge the Transport
|
||||||
|
// into the SDK's HTTP client. If the client's Transport is
|
||||||
|
// not a http.Transport an error will be returned. If the
|
||||||
|
// Transport's TLS config is set this option will cause the
|
||||||
|
// SDK to overwrite the Transport's TLS config's RootCAs value.
|
||||||
|
//
|
||||||
|
// Setting a custom HTTPClient in the aws.Config options will override this setting.
|
||||||
|
// To use this option and custom HTTP client, the HTTP client needs to be provided
|
||||||
|
// when creating the session. Not the service client.
|
||||||
|
//
|
||||||
|
// AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle
|
||||||
|
CustomCABundle string
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -98,6 +118,12 @@ var (
|
||||||
"AWS_PROFILE",
|
"AWS_PROFILE",
|
||||||
"AWS_DEFAULT_PROFILE", // Only read if AWS_SDK_LOAD_CONFIG is also set
|
"AWS_DEFAULT_PROFILE", // Only read if AWS_SDK_LOAD_CONFIG is also set
|
||||||
}
|
}
|
||||||
|
sharedCredsFileEnvKey = []string{
|
||||||
|
"AWS_SHARED_CREDENTIALS_FILE",
|
||||||
|
}
|
||||||
|
sharedConfigFileEnvKey = []string{
|
||||||
|
"AWS_CONFIG_FILE",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// loadEnvConfig retrieves the SDK's environment configuration.
|
// loadEnvConfig retrieves the SDK's environment configuration.
|
||||||
|
@ -134,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
|
||||||
|
@ -147,8 +173,10 @@ func envConfigLoad(enableSharedConfig bool) envConfig {
|
||||||
setFromEnvVal(&cfg.Region, regionKeys)
|
setFromEnvVal(&cfg.Region, regionKeys)
|
||||||
setFromEnvVal(&cfg.Profile, profileKeys)
|
setFromEnvVal(&cfg.Profile, profileKeys)
|
||||||
|
|
||||||
cfg.SharedCredentialsFile = sharedCredentialsFilename()
|
setFromEnvVal(&cfg.SharedCredentialsFile, sharedCredsFileEnvKey)
|
||||||
cfg.SharedConfigFile = sharedConfigFilename()
|
setFromEnvVal(&cfg.SharedConfigFile, sharedConfigFileEnvKey)
|
||||||
|
|
||||||
|
cfg.CustomCABundle = os.Getenv("AWS_CA_BUNDLE")
|
||||||
|
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
|
@ -161,28 +189,3 @@ func setFromEnvVal(dst *string, keys []string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func sharedCredentialsFilename() string {
|
|
||||||
if name := os.Getenv("AWS_SHARED_CREDENTIALS_FILE"); len(name) > 0 {
|
|
||||||
return name
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Join(userHomeDir(), ".aws", "credentials")
|
|
||||||
}
|
|
||||||
|
|
||||||
func sharedConfigFilename() string {
|
|
||||||
if name := os.Getenv("AWS_CONFIG_FILE"); len(name) > 0 {
|
|
||||||
return name
|
|
||||||
}
|
|
||||||
|
|
||||||
return filepath.Join(userHomeDir(), ".aws", "config")
|
|
||||||
}
|
|
||||||
|
|
||||||
func userHomeDir() string {
|
|
||||||
homeDir := os.Getenv("HOME") // *nix
|
|
||||||
if len(homeDir) == 0 { // windows
|
|
||||||
homeDir = os.Getenv("USERPROFILE")
|
|
||||||
}
|
|
||||||
|
|
||||||
return homeDir
|
|
||||||
}
|
|
||||||
|
|
242
vendor/github.com/aws/aws-sdk-go/aws/session/session.go
generated
vendored
242
vendor/github.com/aws/aws-sdk-go/aws/session/session.go
generated
vendored
|
@ -1,7 +1,13 @@
|
||||||
package session
|
package session
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"crypto/x509"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
"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"
|
||||||
|
@ -40,7 +46,7 @@ type Session struct {
|
||||||
//
|
//
|
||||||
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
||||||
// the shared config file (~/.aws/config) will also be loaded, in addition to
|
// the shared config file (~/.aws/config) will also be loaded, in addition to
|
||||||
// the shared credentials file (~/.aws/config). Values set in both the
|
// the shared credentials file (~/.aws/credentials). Values set in both the
|
||||||
// shared config, and shared credentials will be taken from the shared
|
// shared config, and shared credentials will be taken from the shared
|
||||||
// credentials file.
|
// credentials file.
|
||||||
//
|
//
|
||||||
|
@ -52,7 +58,7 @@ func New(cfgs ...*aws.Config) *Session {
|
||||||
envCfg := loadEnvConfig()
|
envCfg := loadEnvConfig()
|
||||||
|
|
||||||
if envCfg.EnableSharedConfig {
|
if envCfg.EnableSharedConfig {
|
||||||
s, err := newSession(envCfg, cfgs...)
|
s, err := newSession(Options{}, envCfg, cfgs...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Old session.New expected all errors to be discovered when
|
// Old session.New expected all errors to be discovered when
|
||||||
// a request is made, and would report the errors then. This
|
// a request is made, and would report the errors then. This
|
||||||
|
@ -73,7 +79,7 @@ func New(cfgs ...*aws.Config) *Session {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
return oldNewSession(cfgs...)
|
return deprecatedNewSession(cfgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSession returns a new Session created from SDK defaults, config files,
|
// NewSession returns a new Session created from SDK defaults, config files,
|
||||||
|
@ -83,7 +89,7 @@ func New(cfgs ...*aws.Config) *Session {
|
||||||
//
|
//
|
||||||
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
||||||
// the shared config file (~/.aws/config) will also be loaded in addition to
|
// the shared config file (~/.aws/config) will also be loaded in addition to
|
||||||
// the shared credentials file (~/.aws/config). Values set in both the
|
// the shared credentials file (~/.aws/credentials). Values set in both the
|
||||||
// shared config, and shared credentials will be taken from the shared
|
// shared config, and shared credentials will be taken from the shared
|
||||||
// credentials file. Enabling the Shared Config will also allow the Session
|
// credentials file. Enabling the Shared Config will also allow the Session
|
||||||
// to be built with retrieving credentials with AssumeRole set in the config.
|
// to be built with retrieving credentials with AssumeRole set in the config.
|
||||||
|
@ -92,9 +98,10 @@ func New(cfgs ...*aws.Config) *Session {
|
||||||
// control through code how the Session will be created. Such as specifying the
|
// control through code how the Session will be created. Such as specifying the
|
||||||
// config profile, and controlling if shared config is enabled or not.
|
// config profile, and controlling if shared config is enabled or not.
|
||||||
func NewSession(cfgs ...*aws.Config) (*Session, error) {
|
func NewSession(cfgs ...*aws.Config) (*Session, error) {
|
||||||
envCfg := loadEnvConfig()
|
opts := Options{}
|
||||||
|
opts.Config.MergeIn(cfgs...)
|
||||||
|
|
||||||
return newSession(envCfg, cfgs...)
|
return NewSessionWithOptions(opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SharedConfigState provides the ability to optionally override the state
|
// SharedConfigState provides the ability to optionally override the state
|
||||||
|
@ -147,6 +154,45 @@ type Options struct {
|
||||||
// will allow you to override the AWS_SDK_LOAD_CONFIG environment variable
|
// will allow you to override the AWS_SDK_LOAD_CONFIG environment variable
|
||||||
// and enable or disable the shared config functionality.
|
// and enable or disable the shared config functionality.
|
||||||
SharedConfigState SharedConfigState
|
SharedConfigState SharedConfigState
|
||||||
|
|
||||||
|
// Ordered list of files the session will load configuration from.
|
||||||
|
// It will override environment variable AWS_SHARED_CREDENTIALS_FILE, AWS_CONFIG_FILE.
|
||||||
|
SharedConfigFiles []string
|
||||||
|
|
||||||
|
// When the SDK's shared config is configured to assume a role with MFA
|
||||||
|
// this option is required in order to provide the mechanism that will
|
||||||
|
// retrieve the MFA token. There is no default value for this field. If
|
||||||
|
// it is not set an error will be returned when creating the session.
|
||||||
|
//
|
||||||
|
// This token provider will be called when ever the assumed role's
|
||||||
|
// credentials need to be refreshed. Within the context of service clients
|
||||||
|
// all sharing the same session the SDK will ensure calls to the token
|
||||||
|
// provider are atomic. When sharing a token provider across multiple
|
||||||
|
// sessions additional synchronization logic is needed to ensure the
|
||||||
|
// token providers do not introduce race conditions. It is recommend to
|
||||||
|
// share the session where possible.
|
||||||
|
//
|
||||||
|
// stscreds.StdinTokenProvider is a basic implementation that will prompt
|
||||||
|
// from stdin for the MFA token code.
|
||||||
|
//
|
||||||
|
// This field is only used if the shared configuration is enabled, and
|
||||||
|
// the config enables assume role wit MFA via the mfa_serial field.
|
||||||
|
AssumeRoleTokenProvider func() (string, error)
|
||||||
|
|
||||||
|
// Reader for a custom Credentials Authority (CA) bundle in PEM format that
|
||||||
|
// the SDK will use instead of the default system's root CA bundle. Use this
|
||||||
|
// only if you want to replace the CA bundle the SDK uses for TLS requests.
|
||||||
|
//
|
||||||
|
// Enabling this option will attempt to merge the Transport into the SDK's HTTP
|
||||||
|
// client. If the client's Transport is not a http.Transport an error will be
|
||||||
|
// returned. If the Transport's TLS config is set this option will cause the SDK
|
||||||
|
// to overwrite the Transport's TLS config's RootCAs value. If the CA
|
||||||
|
// bundle reader contains multiple certificates all of them will be loaded.
|
||||||
|
//
|
||||||
|
// The Session option CustomCABundle is also available when creating sessions
|
||||||
|
// to also enable this feature. CustomCABundle session option field has priority
|
||||||
|
// over the AWS_CA_BUNDLE environment variable, and will be used if both are set.
|
||||||
|
CustomCABundle io.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSessionWithOptions returns a new Session created from SDK defaults, config files,
|
// NewSessionWithOptions returns a new Session created from SDK defaults, config files,
|
||||||
|
@ -155,29 +201,29 @@ type Options struct {
|
||||||
//
|
//
|
||||||
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
||||||
// the shared config file (~/.aws/config) will also be loaded in addition to
|
// the shared config file (~/.aws/config) will also be loaded in addition to
|
||||||
// the shared credentials file (~/.aws/config). Values set in both the
|
// the shared credentials file (~/.aws/credentials). Values set in both the
|
||||||
// shared config, and shared credentials will be taken from the shared
|
// shared config, and shared credentials will be taken from the shared
|
||||||
// credentials file. Enabling the Shared Config will also allow the Session
|
// credentials file. Enabling the Shared Config will also allow the Session
|
||||||
// to be built with retrieving credentials with AssumeRole set in the config.
|
// to be built with retrieving credentials with AssumeRole set in the config.
|
||||||
//
|
//
|
||||||
// // Equivalent to session.New
|
// // Equivalent to session.New
|
||||||
// sess, err := session.NewSessionWithOptions(session.Options{})
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{}))
|
||||||
//
|
//
|
||||||
// // Specify profile to load for the session's config
|
// // Specify profile to load for the session's config
|
||||||
// sess, err := session.NewSessionWithOptions(session.Options{
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
// Profile: "profile_name",
|
// Profile: "profile_name",
|
||||||
// })
|
// }))
|
||||||
//
|
//
|
||||||
// // Specify profile for config and region for requests
|
// // Specify profile for config and region for requests
|
||||||
// sess, err := session.NewSessionWithOptions(session.Options{
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
// Config: aws.Config{Region: aws.String("us-east-1")},
|
// Config: aws.Config{Region: aws.String("us-east-1")},
|
||||||
// Profile: "profile_name",
|
// Profile: "profile_name",
|
||||||
// })
|
// }))
|
||||||
//
|
//
|
||||||
// // Force enable Shared Config support
|
// // Force enable Shared Config support
|
||||||
// sess, err := session.NewSessionWithOptions(session.Options{
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
// SharedConfigState: SharedConfigEnable,
|
// SharedConfigState: session.SharedConfigEnable,
|
||||||
// })
|
// }))
|
||||||
func NewSessionWithOptions(opts Options) (*Session, error) {
|
func NewSessionWithOptions(opts Options) (*Session, error) {
|
||||||
var envCfg envConfig
|
var envCfg envConfig
|
||||||
if opts.SharedConfigState == SharedConfigEnable {
|
if opts.SharedConfigState == SharedConfigEnable {
|
||||||
|
@ -197,7 +243,25 @@ func NewSessionWithOptions(opts Options) (*Session, error) {
|
||||||
envCfg.EnableSharedConfig = true
|
envCfg.EnableSharedConfig = true
|
||||||
}
|
}
|
||||||
|
|
||||||
return newSession(envCfg, &opts.Config)
|
if len(envCfg.SharedCredentialsFile) == 0 {
|
||||||
|
envCfg.SharedCredentialsFile = defaults.SharedCredentialsFilename()
|
||||||
|
}
|
||||||
|
if len(envCfg.SharedConfigFile) == 0 {
|
||||||
|
envCfg.SharedConfigFile = defaults.SharedConfigFilename()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only use AWS_CA_BUNDLE if session option is not provided.
|
||||||
|
if len(envCfg.CustomCABundle) != 0 && opts.CustomCABundle == nil {
|
||||||
|
f, err := os.Open(envCfg.CustomCABundle)
|
||||||
|
if err != nil {
|
||||||
|
return nil, awserr.New("LoadCustomCABundleError",
|
||||||
|
"failed to open custom CA bundle PEM file", err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
opts.CustomCABundle = f
|
||||||
|
}
|
||||||
|
|
||||||
|
return newSession(opts, envCfg, &opts.Config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must is a helper function to ensure the Session is valid and there was no
|
// Must is a helper function to ensure the Session is valid and there was no
|
||||||
|
@ -215,7 +279,7 @@ func Must(sess *Session, err error) *Session {
|
||||||
return sess
|
return sess
|
||||||
}
|
}
|
||||||
|
|
||||||
func oldNewSession(cfgs ...*aws.Config) *Session {
|
func deprecatedNewSession(cfgs ...*aws.Config) *Session {
|
||||||
cfg := defaults.Config()
|
cfg := defaults.Config()
|
||||||
handlers := defaults.Handlers()
|
handlers := defaults.Handlers()
|
||||||
|
|
||||||
|
@ -242,7 +306,7 @@ func oldNewSession(cfgs ...*aws.Config) *Session {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSession(envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
||||||
cfg := defaults.Config()
|
cfg := defaults.Config()
|
||||||
handlers := defaults.Handlers()
|
handlers := defaults.Handlers()
|
||||||
|
|
||||||
|
@ -251,13 +315,18 @@ func newSession(envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
||||||
userCfg := &aws.Config{}
|
userCfg := &aws.Config{}
|
||||||
userCfg.MergeIn(cfgs...)
|
userCfg.MergeIn(cfgs...)
|
||||||
|
|
||||||
// Order config files will be loaded in with later files overwriting
|
// Ordered config files will be loaded in with later files overwriting
|
||||||
// previous config file values.
|
// previous config file values.
|
||||||
cfgFiles := []string{envCfg.SharedConfigFile, envCfg.SharedCredentialsFile}
|
var cfgFiles []string
|
||||||
if !envCfg.EnableSharedConfig {
|
if opts.SharedConfigFiles != nil {
|
||||||
// The shared config file (~/.aws/config) is only loaded if instructed
|
cfgFiles = opts.SharedConfigFiles
|
||||||
// to load via the envConfig.EnableSharedConfig (AWS_SDK_LOAD_CONFIG).
|
} else {
|
||||||
cfgFiles = cfgFiles[1:]
|
cfgFiles = []string{envCfg.SharedConfigFile, envCfg.SharedCredentialsFile}
|
||||||
|
if !envCfg.EnableSharedConfig {
|
||||||
|
// The shared config file (~/.aws/config) is only loaded if instructed
|
||||||
|
// to load via the envConfig.EnableSharedConfig (AWS_SDK_LOAD_CONFIG).
|
||||||
|
cfgFiles = cfgFiles[1:]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load additional config from file(s)
|
// Load additional config from file(s)
|
||||||
|
@ -266,7 +335,9 @@ func newSession(envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers)
|
if err := mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers, opts); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
s := &Session{
|
s := &Session{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
|
@ -275,10 +346,62 @@ func newSession(envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
||||||
|
|
||||||
initHandlers(s)
|
initHandlers(s)
|
||||||
|
|
||||||
|
// Setup HTTP client with custom cert bundle if enabled
|
||||||
|
if opts.CustomCABundle != nil {
|
||||||
|
if err := loadCustomCABundle(s, opts.CustomCABundle); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg sharedConfig, handlers request.Handlers) {
|
func loadCustomCABundle(s *Session, bundle io.Reader) error {
|
||||||
|
var t *http.Transport
|
||||||
|
switch v := s.Config.HTTPClient.Transport.(type) {
|
||||||
|
case *http.Transport:
|
||||||
|
t = v
|
||||||
|
default:
|
||||||
|
if s.Config.HTTPClient.Transport != nil {
|
||||||
|
return awserr.New("LoadCustomCABundleError",
|
||||||
|
"unable to load custom CA bundle, HTTPClient's transport unsupported type", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if t == nil {
|
||||||
|
t = &http.Transport{}
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := loadCertPool(bundle)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t.TLSClientConfig == nil {
|
||||||
|
t.TLSClientConfig = &tls.Config{}
|
||||||
|
}
|
||||||
|
t.TLSClientConfig.RootCAs = p
|
||||||
|
|
||||||
|
s.Config.HTTPClient.Transport = t
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadCertPool(r io.Reader) (*x509.CertPool, error) {
|
||||||
|
b, err := ioutil.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, awserr.New("LoadCustomCABundleError",
|
||||||
|
"failed to read custom CA bundle PEM file", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
p := x509.NewCertPool()
|
||||||
|
if !p.AppendCertsFromPEM(b) {
|
||||||
|
return nil, awserr.New("LoadCustomCABundleError",
|
||||||
|
"failed to load custom CA bundle PEM file", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg sharedConfig, handlers request.Handlers, sessOpts Options) error {
|
||||||
// Merge in user provided configuration
|
// Merge in user provided configuration
|
||||||
cfg.MergeIn(userCfg)
|
cfg.MergeIn(userCfg)
|
||||||
|
|
||||||
|
@ -302,6 +425,11 @@ func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg share
|
||||||
cfgCp.Credentials = credentials.NewStaticCredentialsFromCreds(
|
cfgCp.Credentials = credentials.NewStaticCredentialsFromCreds(
|
||||||
sharedCfg.AssumeRoleSource.Creds,
|
sharedCfg.AssumeRoleSource.Creds,
|
||||||
)
|
)
|
||||||
|
if len(sharedCfg.AssumeRole.MFASerial) > 0 && sessOpts.AssumeRoleTokenProvider == nil {
|
||||||
|
// AssumeRole Token provider is required if doing Assume Role
|
||||||
|
// with MFA.
|
||||||
|
return AssumeRoleTokenProviderNotSetError{}
|
||||||
|
}
|
||||||
cfg.Credentials = stscreds.NewCredentials(
|
cfg.Credentials = stscreds.NewCredentials(
|
||||||
&Session{
|
&Session{
|
||||||
Config: &cfgCp,
|
Config: &cfgCp,
|
||||||
|
@ -311,11 +439,16 @@ func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg share
|
||||||
func(opt *stscreds.AssumeRoleProvider) {
|
func(opt *stscreds.AssumeRoleProvider) {
|
||||||
opt.RoleSessionName = sharedCfg.AssumeRole.RoleSessionName
|
opt.RoleSessionName = sharedCfg.AssumeRole.RoleSessionName
|
||||||
|
|
||||||
|
// Assume role with external ID
|
||||||
if len(sharedCfg.AssumeRole.ExternalID) > 0 {
|
if len(sharedCfg.AssumeRole.ExternalID) > 0 {
|
||||||
opt.ExternalID = aws.String(sharedCfg.AssumeRole.ExternalID)
|
opt.ExternalID = aws.String(sharedCfg.AssumeRole.ExternalID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MFA not supported
|
// Assume role with MFA
|
||||||
|
if len(sharedCfg.AssumeRole.MFASerial) > 0 {
|
||||||
|
opt.SerialNumber = aws.String(sharedCfg.AssumeRole.MFASerial)
|
||||||
|
opt.TokenProvider = sessOpts.AssumeRoleTokenProvider
|
||||||
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
} else if len(sharedCfg.Creds.AccessKeyID) > 0 {
|
} else if len(sharedCfg.Creds.AccessKeyID) > 0 {
|
||||||
|
@ -336,6 +469,33 @@ func mergeConfigSrcs(cfg, userCfg *aws.Config, envCfg envConfig, sharedCfg share
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssumeRoleTokenProviderNotSetError is an error returned when creating a session when the
|
||||||
|
// MFAToken option is not set when shared config is configured load assume a
|
||||||
|
// role with an MFA token.
|
||||||
|
type AssumeRoleTokenProviderNotSetError struct{}
|
||||||
|
|
||||||
|
// Code is the short id of the error.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Code() string {
|
||||||
|
return "AssumeRoleTokenProviderNotSetError"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message is the description of the error
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Message() string {
|
||||||
|
return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) OrigErr() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error satisfies the error interface.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Error() string {
|
||||||
|
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
type credProviderError struct {
|
type credProviderError struct {
|
||||||
|
@ -404,6 +564,10 @@ func (s *Session) clientConfigWithErr(serviceName string, cfgs ...*aws.Config) (
|
||||||
func(opt *endpoints.Options) {
|
func(opt *endpoints.Options) {
|
||||||
opt.DisableSSL = aws.BoolValue(s.Config.DisableSSL)
|
opt.DisableSSL = aws.BoolValue(s.Config.DisableSSL)
|
||||||
opt.UseDualStack = aws.BoolValue(s.Config.UseDualStack)
|
opt.UseDualStack = aws.BoolValue(s.Config.UseDualStack)
|
||||||
|
|
||||||
|
// Support the condition where the service is modeled but its
|
||||||
|
// endpoint metadata is not available.
|
||||||
|
opt.ResolveUnknownService = true
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -416,3 +580,27 @@ func (s *Session) clientConfigWithErr(serviceName string, cfgs ...*aws.Config) (
|
||||||
SigningName: resolved.SigningName,
|
SigningName: resolved.SigningName,
|
||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ClientConfigNoResolveEndpoint is the same as ClientConfig with the exception
|
||||||
|
// that the EndpointResolver will not be used to resolve the endpoint. The only
|
||||||
|
// endpoint set must come from the aws.Config.Endpoint field.
|
||||||
|
func (s *Session) ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) client.Config {
|
||||||
|
s = s.Copy(cfgs...)
|
||||||
|
|
||||||
|
var resolved endpoints.ResolvedEndpoint
|
||||||
|
|
||||||
|
region := aws.StringValue(s.Config.Region)
|
||||||
|
|
||||||
|
if ep := aws.StringValue(s.Config.Endpoint); len(ep) > 0 {
|
||||||
|
resolved.URL = endpoints.AddScheme(ep, aws.BoolValue(s.Config.DisableSSL))
|
||||||
|
resolved.SigningRegion = region
|
||||||
|
}
|
||||||
|
|
||||||
|
return client.Config{
|
||||||
|
Config: s.Config,
|
||||||
|
Handlers: s.Handlers,
|
||||||
|
Endpoint: resolved.URL,
|
||||||
|
SigningRegion: resolved.SigningRegion,
|
||||||
|
SigningName: resolved.SigningName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go
generated
vendored
|
@ -113,7 +113,7 @@ func loadSharedConfigIniFiles(filenames []string) ([]sharedConfigFile, error) {
|
||||||
|
|
||||||
f, err := ini.Load(b)
|
f, err := ini.Load(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, SharedConfigLoadError{Filename: filename}
|
return nil, SharedConfigLoadError{Filename: filename, Err: err}
|
||||||
}
|
}
|
||||||
|
|
||||||
files = append(files, sharedConfigFile{
|
files = append(files, sharedConfigFile{
|
||||||
|
|
7
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go
generated
vendored
Normal file
7
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/options.go
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package v4
|
||||||
|
|
||||||
|
// WithUnsignedPayload will enable and set the UnsignedPayload field to
|
||||||
|
// true of the signer.
|
||||||
|
func WithUnsignedPayload(v4 *Signer) {
|
||||||
|
v4.UnsignedPayload = true
|
||||||
|
}
|
127
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
127
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
|
@ -45,7 +45,7 @@
|
||||||
// If signing a request intended for HTTP2 server, and you're using Go 1.6.2
|
// If signing a request intended for HTTP2 server, and you're using Go 1.6.2
|
||||||
// through 1.7.4 you should use the URL.RawPath as the pre-escaped form of the
|
// through 1.7.4 you should use the URL.RawPath as the pre-escaped form of the
|
||||||
// request URL. https://github.com/golang/go/issues/16847 points to a bug in
|
// request URL. https://github.com/golang/go/issues/16847 points to a bug in
|
||||||
// Go pre 1.8 that failes to make HTTP2 requests using absolute URL in the HTTP
|
// Go pre 1.8 that fails to make HTTP2 requests using absolute URL in the HTTP
|
||||||
// message. URL.Opaque generally will force Go to make requests with absolute URL.
|
// message. URL.Opaque generally will force Go to make requests with absolute URL.
|
||||||
// URL.RawPath does not do this, but RawPath must be a valid escaping of Path
|
// URL.RawPath does not do this, but RawPath must be a valid escaping of Path
|
||||||
// or url.EscapedPath will ignore the RawPath escaping.
|
// or url.EscapedPath will ignore the RawPath escaping.
|
||||||
|
@ -55,7 +55,6 @@
|
||||||
package v4
|
package v4
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"crypto/hmac"
|
"crypto/hmac"
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
@ -194,6 +193,10 @@ type Signer struct {
|
||||||
// This value should only be used for testing. If it is nil the default
|
// This value should only be used for testing. If it is nil the default
|
||||||
// time.Now will be used.
|
// time.Now will be used.
|
||||||
currentTimeFn func() time.Time
|
currentTimeFn func() time.Time
|
||||||
|
|
||||||
|
// UnsignedPayload will prevent signing of the payload. This will only
|
||||||
|
// work for services that have support for this.
|
||||||
|
UnsignedPayload bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewSigner returns a Signer pointer configured with the credentials and optional
|
// NewSigner returns a Signer pointer configured with the credentials and optional
|
||||||
|
@ -227,6 +230,7 @@ type signingCtx struct {
|
||||||
isPresign bool
|
isPresign bool
|
||||||
formattedTime string
|
formattedTime string
|
||||||
formattedShortTime string
|
formattedShortTime string
|
||||||
|
unsignedPayload bool
|
||||||
|
|
||||||
bodyDigest string
|
bodyDigest string
|
||||||
signedHeaders string
|
signedHeaders string
|
||||||
|
@ -264,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
|
||||||
|
@ -298,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
|
||||||
|
@ -313,10 +317,11 @@ 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,
|
||||||
|
unsignedPayload: v4.UnsignedPayload,
|
||||||
}
|
}
|
||||||
|
|
||||||
for key := range ctx.Query {
|
for key := range ctx.Query {
|
||||||
|
@ -334,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)
|
||||||
|
|
||||||
|
@ -358,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
|
||||||
|
@ -396,7 +406,7 @@ var SignRequestHandler = request.NamedHandler{
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignSDKRequest signs an AWS request with the V4 signature. This
|
// SignSDKRequest signs an AWS request with the V4 signature. This
|
||||||
// request handler is bested used only with the SDK's built in service client's
|
// request handler should only be used with the SDK's built in service client's
|
||||||
// API operation requests.
|
// API operation requests.
|
||||||
//
|
//
|
||||||
// This function should not be used on its on its own, but in conjunction with
|
// This function should not be used on its on its own, but in conjunction with
|
||||||
|
@ -409,7 +419,18 @@ var SignRequestHandler = request.NamedHandler{
|
||||||
func SignSDKRequest(req *request.Request) {
|
func SignSDKRequest(req *request.Request) {
|
||||||
signSDKRequestWithCurrTime(req, time.Now)
|
signSDKRequestWithCurrTime(req, time.Now)
|
||||||
}
|
}
|
||||||
func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time) {
|
|
||||||
|
// BuildNamedHandler will build a generic handler for signing.
|
||||||
|
func BuildNamedHandler(name string, opts ...func(*Signer)) request.NamedHandler {
|
||||||
|
return request.NamedHandler{
|
||||||
|
Name: name,
|
||||||
|
Fn: func(req *request.Request) {
|
||||||
|
signSDKRequestWithCurrTime(req, time.Now, opts...)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time, opts ...func(*Signer)) {
|
||||||
// If the request does not need to be signed ignore the signing of the
|
// If the request does not need to be signed ignore the signing of the
|
||||||
// request if the AnonymousCredentials object is used.
|
// request if the AnonymousCredentials object is used.
|
||||||
if req.Config.Credentials == credentials.AnonymousCredentials {
|
if req.Config.Credentials == credentials.AnonymousCredentials {
|
||||||
|
@ -441,13 +462,17 @@ func signSDKRequestWithCurrTime(req *request.Request, curTimeFn func() time.Time
|
||||||
v4.DisableRequestBodyOverwrite = true
|
v4.DisableRequestBodyOverwrite = true
|
||||||
})
|
})
|
||||||
|
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(v4)
|
||||||
|
}
|
||||||
|
|
||||||
signingTime := req.Time
|
signingTime := req.Time
|
||||||
if !req.LastSignedAt.IsZero() {
|
if !req.LastSignedAt.IsZero() {
|
||||||
signingTime = req.LastSignedAt
|
signingTime = req.LastSignedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
@ -482,6 +507,8 @@ func (ctx *signingCtx) build(disableHeaderHoisting bool) {
|
||||||
ctx.buildTime() // no depends
|
ctx.buildTime() // no depends
|
||||||
ctx.buildCredentialString() // no depends
|
ctx.buildCredentialString() // no depends
|
||||||
|
|
||||||
|
ctx.buildBodyDigest()
|
||||||
|
|
||||||
unsignedHeaders := ctx.Request.Header
|
unsignedHeaders := ctx.Request.Header
|
||||||
if ctx.isPresign {
|
if ctx.isPresign {
|
||||||
if !disableHeaderHoisting {
|
if !disableHeaderHoisting {
|
||||||
|
@ -493,7 +520,6 @@ func (ctx *signingCtx) build(disableHeaderHoisting bool) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.buildBodyDigest()
|
|
||||||
ctx.buildCanonicalHeaders(ignoredHeaders, unsignedHeaders)
|
ctx.buildCanonicalHeaders(ignoredHeaders, unsignedHeaders)
|
||||||
ctx.buildCanonicalString() // depends on canon headers / signed headers
|
ctx.buildCanonicalString() // depends on canon headers / signed headers
|
||||||
ctx.buildStringToSign() // depends on canon string
|
ctx.buildStringToSign() // depends on canon string
|
||||||
|
@ -583,14 +609,18 @@ func (ctx *signingCtx) buildCanonicalHeaders(r rule, header http.Header) {
|
||||||
headerValues := make([]string, len(headers))
|
headerValues := make([]string, len(headers))
|
||||||
for i, k := range headers {
|
for i, k := range headers {
|
||||||
if k == "host" {
|
if k == "host" {
|
||||||
headerValues[i] = "host:" + ctx.Request.URL.Host
|
if ctx.Request.Host != "" {
|
||||||
|
headerValues[i] = "host:" + ctx.Request.Host
|
||||||
|
} else {
|
||||||
|
headerValues[i] = "host:" + ctx.Request.URL.Host
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
headerValues[i] = k + ":" +
|
headerValues[i] = k + ":" +
|
||||||
strings.Join(ctx.SignedHeaderVals[k], ",")
|
strings.Join(ctx.SignedHeaderVals[k], ",")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stripExcessSpaces(headerValues)
|
||||||
ctx.canonicalHeaders = strings.Join(stripExcessSpaces(headerValues), "\n")
|
ctx.canonicalHeaders = strings.Join(headerValues, "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ctx *signingCtx) buildCanonicalString() {
|
func (ctx *signingCtx) buildCanonicalString() {
|
||||||
|
@ -634,14 +664,14 @@ func (ctx *signingCtx) buildSignature() {
|
||||||
func (ctx *signingCtx) buildBodyDigest() {
|
func (ctx *signingCtx) buildBodyDigest() {
|
||||||
hash := ctx.Request.Header.Get("X-Amz-Content-Sha256")
|
hash := ctx.Request.Header.Get("X-Amz-Content-Sha256")
|
||||||
if hash == "" {
|
if hash == "" {
|
||||||
if ctx.isPresign && ctx.ServiceName == "s3" {
|
if ctx.unsignedPayload || (ctx.isPresign && ctx.ServiceName == "s3") {
|
||||||
hash = "UNSIGNED-PAYLOAD"
|
hash = "UNSIGNED-PAYLOAD"
|
||||||
} else if ctx.Body == nil {
|
} else if ctx.Body == nil {
|
||||||
hash = emptyStringSHA256
|
hash = emptyStringSHA256
|
||||||
} else {
|
} else {
|
||||||
hash = hex.EncodeToString(makeSha256Reader(ctx.Body))
|
hash = hex.EncodeToString(makeSha256Reader(ctx.Body))
|
||||||
}
|
}
|
||||||
if ctx.ServiceName == "s3" || ctx.ServiceName == "glacier" {
|
if ctx.unsignedPayload || ctx.ServiceName == "s3" || ctx.ServiceName == "glacier" {
|
||||||
ctx.Request.Header.Set("X-Amz-Content-Sha256", hash)
|
ctx.Request.Header.Set("X-Amz-Content-Sha256", hash)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,49 +722,46 @@ func makeSha256Reader(reader io.ReadSeeker) []byte {
|
||||||
return hash.Sum(nil)
|
return hash.Sum(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
const doubleSpaces = " "
|
const doubleSpace = " "
|
||||||
|
|
||||||
var doubleSpaceBytes = []byte(doubleSpaces)
|
// stripExcessSpaces will rewrite the passed in slice's string values to not
|
||||||
|
// contain muliple side-by-side spaces.
|
||||||
|
func stripExcessSpaces(vals []string) {
|
||||||
|
var j, k, l, m, spaces int
|
||||||
|
for i, str := range vals {
|
||||||
|
// Trim trailing spaces
|
||||||
|
for j = len(str) - 1; j >= 0 && str[j] == ' '; j-- {
|
||||||
|
}
|
||||||
|
|
||||||
func stripExcessSpaces(headerVals []string) []string {
|
// Trim leading spaces
|
||||||
vals := make([]string, len(headerVals))
|
for k = 0; k < j && str[k] == ' '; k++ {
|
||||||
for i, str := range headerVals {
|
}
|
||||||
// Trim leading and trailing spaces
|
str = str[k : j+1]
|
||||||
trimmed := strings.TrimSpace(str)
|
|
||||||
|
|
||||||
idx := strings.Index(trimmed, doubleSpaces)
|
// Strip multiple spaces.
|
||||||
var buf []byte
|
j = strings.Index(str, doubleSpace)
|
||||||
for idx > -1 {
|
if j < 0 {
|
||||||
// Multiple adjacent spaces found
|
vals[i] = str
|
||||||
if buf == nil {
|
continue
|
||||||
// first time create the buffer
|
}
|
||||||
buf = []byte(trimmed)
|
|
||||||
}
|
|
||||||
|
|
||||||
stripToIdx := -1
|
buf := []byte(str)
|
||||||
for j := idx + 1; j < len(buf); j++ {
|
for k, m, l = j, j, len(buf); k < l; k++ {
|
||||||
if buf[j] != ' ' {
|
if buf[k] == ' ' {
|
||||||
buf = append(buf[:idx+1], buf[j:]...)
|
if spaces == 0 {
|
||||||
stripToIdx = j
|
// First space.
|
||||||
break
|
buf[m] = buf[k]
|
||||||
}
|
m++
|
||||||
}
|
|
||||||
|
|
||||||
if stripToIdx >= 0 {
|
|
||||||
idx = bytes.Index(buf[stripToIdx:], doubleSpaceBytes)
|
|
||||||
if idx >= 0 {
|
|
||||||
idx += stripToIdx
|
|
||||||
}
|
}
|
||||||
|
spaces++
|
||||||
} else {
|
} else {
|
||||||
idx = -1
|
// End of multiple spaces.
|
||||||
|
spaces = 0
|
||||||
|
buf[m] = buf[k]
|
||||||
|
m++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if buf != nil {
|
vals[i] = string(buf[:m])
|
||||||
vals[i] = string(buf)
|
|
||||||
} else {
|
|
||||||
vals[i] = trimmed
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return vals
|
|
||||||
}
|
}
|
||||||
|
|
2
vendor/github.com/aws/aws-sdk-go/aws/types.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/types.go
generated
vendored
|
@ -114,5 +114,5 @@ func (b *WriteAtBuffer) WriteAt(p []byte, pos int64) (n int, err error) {
|
||||||
func (b *WriteAtBuffer) Bytes() []byte {
|
func (b *WriteAtBuffer) Bytes() []byte {
|
||||||
b.m.Lock()
|
b.m.Lock()
|
||||||
defer b.m.Unlock()
|
defer b.m.Unlock()
|
||||||
return b.buf[:len(b.buf):len(b.buf)]
|
return b.buf
|
||||||
}
|
}
|
||||||
|
|
12
vendor/github.com/aws/aws-sdk-go/aws/url.go
generated
vendored
Normal file
12
vendor/github.com/aws/aws-sdk-go/aws/url.go
generated
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// +build go1.8
|
||||||
|
|
||||||
|
package aws
|
||||||
|
|
||||||
|
import "net/url"
|
||||||
|
|
||||||
|
// URLHostname will extract the Hostname without port from the URL value.
|
||||||
|
//
|
||||||
|
// Wrapper of net/url#URL.Hostname for backwards Go version compatibility.
|
||||||
|
func URLHostname(url *url.URL) string {
|
||||||
|
return url.Hostname()
|
||||||
|
}
|
29
vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go
generated
vendored
Normal file
29
vendor/github.com/aws/aws-sdk-go/aws/url_1_7.go
generated
vendored
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// +build !go1.8
|
||||||
|
|
||||||
|
package aws
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// URLHostname will extract the Hostname without port from the URL value.
|
||||||
|
//
|
||||||
|
// Copy of Go 1.8's net/url#URL.Hostname functionality.
|
||||||
|
func URLHostname(url *url.URL) string {
|
||||||
|
return stripPort(url.Host)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// stripPort is copy of Go 1.8 url#URL.Hostname functionality.
|
||||||
|
// https://golang.org/src/net/url/url.go
|
||||||
|
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]
|
||||||
|
}
|
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.6.12"
|
const SDKVersion = "1.12.36"
|
||||||
|
|
40
vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go
generated
vendored
Normal file
40
vendor/github.com/aws/aws-sdk-go/internal/shareddefaults/shared_config.go
generated
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
package shareddefaults
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SharedCredentialsFilename returns the SDK's default file path
|
||||||
|
// for the shared credentials file.
|
||||||
|
//
|
||||||
|
// Builds the shared config file path based on the OS's platform.
|
||||||
|
//
|
||||||
|
// - Linux/Unix: $HOME/.aws/credentials
|
||||||
|
// - Windows: %USERPROFILE%\.aws\credentials
|
||||||
|
func SharedCredentialsFilename() string {
|
||||||
|
return filepath.Join(UserHomeDir(), ".aws", "credentials")
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedConfigFilename returns the SDK's default file path for
|
||||||
|
// the shared config file.
|
||||||
|
//
|
||||||
|
// Builds the shared config file path based on the OS's platform.
|
||||||
|
//
|
||||||
|
// - Linux/Unix: $HOME/.aws/config
|
||||||
|
// - Windows: %USERPROFILE%\.aws\config
|
||||||
|
func SharedConfigFilename() string {
|
||||||
|
return filepath.Join(UserHomeDir(), ".aws", "config")
|
||||||
|
}
|
||||||
|
|
||||||
|
// UserHomeDir returns the home directory for the user the process is
|
||||||
|
// running under.
|
||||||
|
func UserHomeDir() string {
|
||||||
|
if runtime.GOOS == "windows" { // Windows
|
||||||
|
return os.Getenv("USERPROFILE")
|
||||||
|
}
|
||||||
|
|
||||||
|
// *nix
|
||||||
|
return os.Getenv("HOME")
|
||||||
|
}
|
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
|
||||||
|
}
|
11
vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go
generated
vendored
11
vendor/github.com/aws/aws-sdk-go/private/protocol/query/queryutil/queryutil.go
generated
vendored
|
@ -80,7 +80,6 @@ func (q *queryParser) parseStruct(v url.Values, value reflect.Value, prefix stri
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if protocol.CanSetIdempotencyToken(value.Field(i), field) {
|
if protocol.CanSetIdempotencyToken(value.Field(i), field) {
|
||||||
token := protocol.GetIdempotencyToken()
|
token := protocol.GetIdempotencyToken()
|
||||||
elemValue = reflect.ValueOf(token)
|
elemValue = reflect.ValueOf(token)
|
||||||
|
@ -122,9 +121,17 @@ 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") == "" {
|
||||||
prefix += ".member"
|
if listName := tag.Get("locationNameList"); listName == "" {
|
||||||
|
prefix += ".member"
|
||||||
|
} else {
|
||||||
|
prefix += "." + listName
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < value.Len(); i++ {
|
for i := 0; i < value.Len(); i++ {
|
||||||
|
|
51
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go
generated
vendored
51
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/build.go
generated
vendored
|
@ -17,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
|
||||||
|
@ -82,8 +83,12 @@ func buildLocationElements(r *request.Request, v reflect.Value, buildGETQuery bo
|
||||||
if name == "" {
|
if name == "" {
|
||||||
name = field.Name
|
name = field.Name
|
||||||
}
|
}
|
||||||
if m.Kind() == reflect.Ptr {
|
if kind := m.Kind(); kind == reflect.Ptr {
|
||||||
m = m.Elem()
|
m = m.Elem()
|
||||||
|
} else if kind == reflect.Interface {
|
||||||
|
if !m.Elem().IsValid() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if !m.IsValid() {
|
if !m.IsValid() {
|
||||||
continue
|
continue
|
||||||
|
@ -95,16 +100,16 @@ func buildLocationElements(r *request.Request, v reflect.Value, buildGETQuery bo
|
||||||
var err error
|
var err error
|
||||||
switch field.Tag.Get("location") {
|
switch field.Tag.Get("location") {
|
||||||
case "headers": // header maps
|
case "headers": // header maps
|
||||||
err = buildHeaderMap(&r.HTTPRequest.Header, m, field.Tag.Get("locationName"))
|
err = buildHeaderMap(&r.HTTPRequest.Header, m, field.Tag)
|
||||||
case "header":
|
case "header":
|
||||||
err = buildHeader(&r.HTTPRequest.Header, m, name)
|
err = buildHeader(&r.HTTPRequest.Header, m, name, field.Tag)
|
||||||
case "uri":
|
case "uri":
|
||||||
err = buildURI(r.HTTPRequest.URL, m, name)
|
err = buildURI(r.HTTPRequest.URL, m, name, field.Tag)
|
||||||
case "querystring":
|
case "querystring":
|
||||||
err = buildQueryString(query, m, name)
|
err = buildQueryString(query, m, name, field.Tag)
|
||||||
default:
|
default:
|
||||||
if buildGETQuery {
|
if buildGETQuery {
|
||||||
err = buildQueryString(query, m, name)
|
err = buildQueryString(query, m, name, field.Tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r.Error = err
|
r.Error = err
|
||||||
|
@ -145,8 +150,8 @@ func buildBody(r *request.Request, v reflect.Value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildHeader(header *http.Header, v reflect.Value, name string) error {
|
func buildHeader(header *http.Header, v reflect.Value, name string, tag reflect.StructTag) error {
|
||||||
str, err := convertType(v)
|
str, err := convertType(v, tag)
|
||||||
if err == errValueNotSet {
|
if err == errValueNotSet {
|
||||||
return nil
|
return nil
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
|
@ -158,9 +163,10 @@ func buildHeader(header *http.Header, v reflect.Value, name string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildHeaderMap(header *http.Header, v reflect.Value, prefix string) error {
|
func buildHeaderMap(header *http.Header, v reflect.Value, tag reflect.StructTag) error {
|
||||||
|
prefix := tag.Get("locationName")
|
||||||
for _, key := range v.MapKeys() {
|
for _, key := range v.MapKeys() {
|
||||||
str, err := convertType(v.MapIndex(key))
|
str, err := convertType(v.MapIndex(key), tag)
|
||||||
if err == errValueNotSet {
|
if err == errValueNotSet {
|
||||||
continue
|
continue
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
|
@ -173,8 +179,8 @@ func buildHeaderMap(header *http.Header, v reflect.Value, prefix string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildURI(u *url.URL, v reflect.Value, name string) error {
|
func buildURI(u *url.URL, v reflect.Value, name string, tag reflect.StructTag) error {
|
||||||
value, err := convertType(v)
|
value, err := convertType(v, tag)
|
||||||
if err == errValueNotSet {
|
if err == errValueNotSet {
|
||||||
return nil
|
return nil
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
|
@ -190,7 +196,7 @@ func buildURI(u *url.URL, v reflect.Value, name string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildQueryString(query url.Values, v reflect.Value, name string) error {
|
func buildQueryString(query url.Values, v reflect.Value, name string, tag reflect.StructTag) error {
|
||||||
switch value := v.Interface().(type) {
|
switch value := v.Interface().(type) {
|
||||||
case []*string:
|
case []*string:
|
||||||
for _, item := range value {
|
for _, item := range value {
|
||||||
|
@ -207,7 +213,7 @@ func buildQueryString(query url.Values, v reflect.Value, name string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
str, err := convertType(v)
|
str, err := convertType(v, tag)
|
||||||
if err == errValueNotSet {
|
if err == errValueNotSet {
|
||||||
return nil
|
return nil
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
|
@ -246,13 +252,12 @@ func EscapePath(path string, encodeSep bool) string {
|
||||||
return buf.String()
|
return buf.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertType(v reflect.Value) (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
|
||||||
|
@ -266,8 +271,20 @@ func convertType(v reflect.Value) (string, error) {
|
||||||
str = strconv.FormatFloat(value, 'f', -1, 64)
|
str = strconv.FormatFloat(value, 'f', -1, 64)
|
||||||
case time.Time:
|
case time.Time:
|
||||||
str = value.UTC().Format(RFC822)
|
str = value.UTC().Format(RFC822)
|
||||||
|
case aws.JSONValue:
|
||||||
|
if len(value) == 0 {
|
||||||
|
return "", errValueNotSet
|
||||||
|
}
|
||||||
|
escaping := protocol.NoEscape
|
||||||
|
if tag.Get("location") == "header" {
|
||||||
|
escaping = protocol.Base64Escape
|
||||||
|
}
|
||||||
|
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
|
||||||
|
|
23
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go
generated
vendored
23
vendor/github.com/aws/aws-sdk-go/private/protocol/rest/unmarshal.go
generated
vendored
|
@ -12,8 +12,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"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
|
||||||
|
@ -111,7 +113,7 @@ func unmarshalLocationElements(r *request.Request, v reflect.Value) {
|
||||||
case "statusCode":
|
case "statusCode":
|
||||||
unmarshalStatusCode(m, r.HTTPResponse.StatusCode)
|
unmarshalStatusCode(m, r.HTTPResponse.StatusCode)
|
||||||
case "header":
|
case "header":
|
||||||
err := unmarshalHeader(m, r.HTTPResponse.Header.Get(name))
|
err := unmarshalHeader(m, r.HTTPResponse.Header.Get(name), field.Tag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.Error = awserr.New("SerializationError", "failed to decode REST response", err)
|
r.Error = awserr.New("SerializationError", "failed to decode REST response", err)
|
||||||
break
|
break
|
||||||
|
@ -158,8 +160,13 @@ func unmarshalHeaderMap(r reflect.Value, headers http.Header, prefix string) err
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func unmarshalHeader(v reflect.Value, header string) error {
|
func unmarshalHeader(v reflect.Value, header string, tag reflect.StructTag) error {
|
||||||
if !v.IsValid() || (header == "" && v.Elem().Kind() != reflect.String) {
|
isJSONValue := tag.Get("type") == "jsonvalue"
|
||||||
|
if isJSONValue {
|
||||||
|
if len(header) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
} else if !v.IsValid() || (header == "" && v.Elem().Kind() != reflect.String) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,6 +203,16 @@ func unmarshalHeader(v reflect.Value, header string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
v.Set(reflect.ValueOf(&t))
|
v.Set(reflect.ValueOf(&t))
|
||||||
|
case aws.JSONValue:
|
||||||
|
escaping := protocol.NoEscape
|
||||||
|
if tag.Get("location") == "header" {
|
||||||
|
escaping = protocol.Base64Escape
|
||||||
|
}
|
||||||
|
m, err := protocol.DecodeJSONValue(header, escaping)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
v.Set(reflect.ValueOf(m))
|
||||||
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
|
||||||
|
|
1
vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go
generated
vendored
1
vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/build.go
generated
vendored
|
@ -131,7 +131,6 @@ func (b *xmlBuilder) buildStruct(value reflect.Value, current *XMLNode, tag refl
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
mTag := field.Tag
|
mTag := field.Tag
|
||||||
if mTag.Get("location") != "" { // skip non-body members
|
if mTag.Get("location") != "" { // skip non-body members
|
||||||
continue
|
continue
|
||||||
|
|
7
vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go
generated
vendored
7
vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/unmarshal.go
generated
vendored
|
@ -15,7 +15,10 @@ import (
|
||||||
// needs to match the shape of the XML expected to be decoded.
|
// needs to match the shape of the XML expected to be decoded.
|
||||||
// If the shape doesn't match unmarshaling will fail.
|
// If the shape doesn't match unmarshaling will fail.
|
||||||
func UnmarshalXML(v interface{}, d *xml.Decoder, wrapper string) error {
|
func UnmarshalXML(v interface{}, d *xml.Decoder, wrapper string) error {
|
||||||
n, _ := XMLToStruct(d, nil)
|
n, err := XMLToStruct(d, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if n.Children != nil {
|
if n.Children != nil {
|
||||||
for _, root := range n.Children {
|
for _, root := range n.Children {
|
||||||
for _, c := range root {
|
for _, c := range root {
|
||||||
|
@ -23,7 +26,7 @@ func UnmarshalXML(v interface{}, d *xml.Decoder, wrapper string) error {
|
||||||
c = wrappedChild[0] // pull out wrapped element
|
c = wrappedChild[0] // pull out wrapped element
|
||||||
}
|
}
|
||||||
|
|
||||||
err := parse(reflect.ValueOf(v), c, "")
|
err = parse(reflect.ValueOf(v), c, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
return nil
|
return nil
|
||||||
|
|
13
vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go
generated
vendored
13
vendor/github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil/xml_to_struct.go
generated
vendored
|
@ -40,11 +40,16 @@ func XMLToStruct(d *xml.Decoder, s *xml.StartElement) (*XMLNode, error) {
|
||||||
out := &XMLNode{}
|
out := &XMLNode{}
|
||||||
for {
|
for {
|
||||||
tok, err := d.Token()
|
tok, err := d.Token()
|
||||||
if tok == nil || err == io.EOF {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return out, err
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
return out, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if tok == nil {
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
switch typed := tok.(type) {
|
switch typed := tok.(type) {
|
||||||
|
|
134
vendor/github.com/aws/aws-sdk-go/private/waiter/waiter.go
generated
vendored
134
vendor/github.com/aws/aws-sdk-go/private/waiter/waiter.go
generated
vendored
|
@ -1,134 +0,0 @@
|
||||||
package waiter
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"reflect"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awsutil"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A Config provides a collection of configuration values to setup a generated
|
|
||||||
// waiter code with.
|
|
||||||
type Config struct {
|
|
||||||
Name string
|
|
||||||
Delay int
|
|
||||||
MaxAttempts int
|
|
||||||
Operation string
|
|
||||||
Acceptors []WaitAcceptor
|
|
||||||
}
|
|
||||||
|
|
||||||
// A WaitAcceptor provides the information needed to wait for an API operation
|
|
||||||
// to complete.
|
|
||||||
type WaitAcceptor struct {
|
|
||||||
Expected interface{}
|
|
||||||
Matcher string
|
|
||||||
State string
|
|
||||||
Argument string
|
|
||||||
}
|
|
||||||
|
|
||||||
// A Waiter provides waiting for an operation to complete.
|
|
||||||
type Waiter struct {
|
|
||||||
Config
|
|
||||||
Client interface{}
|
|
||||||
Input interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait waits for an operation to complete, expire max attempts, or fail. Error
|
|
||||||
// is returned if the operation fails.
|
|
||||||
func (w *Waiter) Wait() error {
|
|
||||||
client := reflect.ValueOf(w.Client)
|
|
||||||
in := reflect.ValueOf(w.Input)
|
|
||||||
method := client.MethodByName(w.Config.Operation + "Request")
|
|
||||||
|
|
||||||
for i := 0; i < w.MaxAttempts; i++ {
|
|
||||||
res := method.Call([]reflect.Value{in})
|
|
||||||
req := res[0].Interface().(*request.Request)
|
|
||||||
req.Handlers.Build.PushBack(request.MakeAddToUserAgentFreeFormHandler("Waiter"))
|
|
||||||
|
|
||||||
err := req.Send()
|
|
||||||
for _, a := range w.Acceptors {
|
|
||||||
result := false
|
|
||||||
var vals []interface{}
|
|
||||||
switch a.Matcher {
|
|
||||||
case "pathAll", "path":
|
|
||||||
// Require all matches to be equal for result to match
|
|
||||||
vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument)
|
|
||||||
if len(vals) == 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
result = true
|
|
||||||
for _, val := range vals {
|
|
||||||
if !awsutil.DeepEqual(val, a.Expected) {
|
|
||||||
result = false
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case "pathAny":
|
|
||||||
// Only a single match needs to equal for the result to match
|
|
||||||
vals, _ = awsutil.ValuesAtPath(req.Data, a.Argument)
|
|
||||||
for _, val := range vals {
|
|
||||||
if awsutil.DeepEqual(val, a.Expected) {
|
|
||||||
result = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case "status":
|
|
||||||
s := a.Expected.(int)
|
|
||||||
result = s == req.HTTPResponse.StatusCode
|
|
||||||
case "error":
|
|
||||||
if aerr, ok := err.(awserr.Error); ok {
|
|
||||||
result = aerr.Code() == a.Expected.(string)
|
|
||||||
}
|
|
||||||
case "pathList":
|
|
||||||
// ignored matcher
|
|
||||||
default:
|
|
||||||
logf(client, "WARNING: Waiter for %s encountered unexpected matcher: %s",
|
|
||||||
w.Config.Operation, a.Matcher)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !result {
|
|
||||||
// If there was no matching result found there is nothing more to do
|
|
||||||
// for this response, retry the request.
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch a.State {
|
|
||||||
case "success":
|
|
||||||
// waiter completed
|
|
||||||
return nil
|
|
||||||
case "failure":
|
|
||||||
// Waiter failure state triggered
|
|
||||||
return awserr.New("ResourceNotReady",
|
|
||||||
fmt.Sprintf("failed waiting for successful resource state"), err)
|
|
||||||
case "retry":
|
|
||||||
// clear the error and retry the operation
|
|
||||||
err = nil
|
|
||||||
default:
|
|
||||||
logf(client, "WARNING: Waiter for %s encountered unexpected state: %s",
|
|
||||||
w.Config.Operation, a.State)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
time.Sleep(time.Second * time.Duration(w.Delay))
|
|
||||||
}
|
|
||||||
|
|
||||||
return awserr.New("ResourceNotReady",
|
|
||||||
fmt.Sprintf("exceeded %d wait attempts", w.MaxAttempts), nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func logf(client reflect.Value, msg string, args ...interface{}) {
|
|
||||||
cfgVal := client.FieldByName("Config")
|
|
||||||
if !cfgVal.IsValid() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if cfg, ok := cfgVal.Interface().(*aws.Config); ok && cfg.Logger != nil {
|
|
||||||
cfg.Logger.Log(fmt.Sprintf(msg, args...))
|
|
||||||
}
|
|
||||||
}
|
|
6
vendor/github.com/aws/aws-sdk-go/service/cloudfront/sign/sign_cookie.go
generated
vendored
6
vendor/github.com/aws/aws-sdk-go/service/cloudfront/sign/sign_cookie.go
generated
vendored
|
@ -81,7 +81,7 @@ func NewCookieSigner(keyID string, privKey *rsa.PrivateKey, opts ...func(*Cookie
|
||||||
// server's response.
|
// server's response.
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
// s := NewCookieSigner(keyID, privKey)
|
// s := sign.NewCookieSigner(keyID, privKey)
|
||||||
//
|
//
|
||||||
// // Get Signed cookies for a resource that will expire in 1 hour
|
// // Get Signed cookies for a resource that will expire in 1 hour
|
||||||
// cookies, err := s.Sign("*", time.Now().Add(1 * time.Hour))
|
// cookies, err := s.Sign("*", time.Now().Add(1 * time.Hour))
|
||||||
|
@ -150,14 +150,14 @@ func cookieURLScheme(u string) (string, error) {
|
||||||
// server's response.
|
// server's response.
|
||||||
//
|
//
|
||||||
// Example:
|
// Example:
|
||||||
// s := NewCookieSigner(keyID, privKey)
|
// s := sign.NewCookieSigner(keyID, privKey)
|
||||||
//
|
//
|
||||||
// policy := &sign.Policy{
|
// policy := &sign.Policy{
|
||||||
// Statements: []sign.Statement{
|
// Statements: []sign.Statement{
|
||||||
// {
|
// {
|
||||||
// // Read the provided documentation on how to set this
|
// // Read the provided documentation on how to set this
|
||||||
// // correctly, you'll probably want to use wildcards.
|
// // correctly, you'll probably want to use wildcards.
|
||||||
// Resource: RawCloudFrontURL,
|
// Resource: rawCloudFrontURL,
|
||||||
// Condition: sign.Condition{
|
// Condition: sign.Condition{
|
||||||
// // Optional IP source address range
|
// // Optional IP source address range
|
||||||
// IPAddress: &sign.IPAddress{SourceIP: "192.0.2.0/24"},
|
// IPAddress: &sign.IPAddress{SourceIP: "192.0.2.0/24"},
|
||||||
|
|
5299
vendor/github.com/aws/aws-sdk-go/service/s3/api.go
generated
vendored
5299
vendor/github.com/aws/aws-sdk-go/service/s3/api.go
generated
vendored
File diff suppressed because it is too large
Load diff
65
vendor/github.com/aws/aws-sdk-go/service/s3/bucket_location.go
generated
vendored
65
vendor/github.com/aws/aws-sdk-go/service/s3/bucket_location.go
generated
vendored
|
@ -12,6 +12,69 @@ import (
|
||||||
|
|
||||||
var reBucketLocation = regexp.MustCompile(`>([^<>]+)<\/Location`)
|
var reBucketLocation = regexp.MustCompile(`>([^<>]+)<\/Location`)
|
||||||
|
|
||||||
|
// NormalizeBucketLocation is a utility function which will update the
|
||||||
|
// passed in value to always be a region ID. Generally this would be used
|
||||||
|
// with GetBucketLocation API operation.
|
||||||
|
//
|
||||||
|
// Replaces empty string with "us-east-1", and "EU" with "eu-west-1".
|
||||||
|
//
|
||||||
|
// See http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html
|
||||||
|
// for more information on the values that can be returned.
|
||||||
|
func NormalizeBucketLocation(loc string) string {
|
||||||
|
switch loc {
|
||||||
|
case "":
|
||||||
|
loc = "us-east-1"
|
||||||
|
case "EU":
|
||||||
|
loc = "eu-west-1"
|
||||||
|
}
|
||||||
|
|
||||||
|
return loc
|
||||||
|
}
|
||||||
|
|
||||||
|
// NormalizeBucketLocationHandler is a request handler which will update the
|
||||||
|
// GetBucketLocation's result LocationConstraint value to always be a region ID.
|
||||||
|
//
|
||||||
|
// Replaces empty string with "us-east-1", and "EU" with "eu-west-1".
|
||||||
|
//
|
||||||
|
// See http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html
|
||||||
|
// for more information on the values that can be returned.
|
||||||
|
//
|
||||||
|
// req, result := svc.GetBucketLocationRequest(&s3.GetBucketLocationInput{
|
||||||
|
// Bucket: aws.String(bucket),
|
||||||
|
// })
|
||||||
|
// req.Handlers.Unmarshal.PushBackNamed(NormalizeBucketLocationHandler)
|
||||||
|
// err := req.Send()
|
||||||
|
var NormalizeBucketLocationHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.s3.NormalizeBucketLocation",
|
||||||
|
Fn: func(req *request.Request) {
|
||||||
|
if req.Error != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
out := req.Data.(*GetBucketLocationOutput)
|
||||||
|
loc := NormalizeBucketLocation(aws.StringValue(out.LocationConstraint))
|
||||||
|
out.LocationConstraint = aws.String(loc)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithNormalizeBucketLocation is a request option which will update the
|
||||||
|
// GetBucketLocation's result LocationConstraint value to always be a region ID.
|
||||||
|
//
|
||||||
|
// Replaces empty string with "us-east-1", and "EU" with "eu-west-1".
|
||||||
|
//
|
||||||
|
// See http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETlocation.html
|
||||||
|
// for more information on the values that can be returned.
|
||||||
|
//
|
||||||
|
// result, err := svc.GetBucketLocationWithContext(ctx,
|
||||||
|
// &s3.GetBucketLocationInput{
|
||||||
|
// Bucket: aws.String(bucket),
|
||||||
|
// },
|
||||||
|
// s3.WithNormalizeBucketLocation,
|
||||||
|
// )
|
||||||
|
func WithNormalizeBucketLocation(r *request.Request) {
|
||||||
|
r.Handlers.Unmarshal.PushBackNamed(NormalizeBucketLocationHandler)
|
||||||
|
}
|
||||||
|
|
||||||
func buildGetBucketLocation(r *request.Request) {
|
func buildGetBucketLocation(r *request.Request) {
|
||||||
if r.DataFilled() {
|
if r.DataFilled() {
|
||||||
out := r.Data.(*GetBucketLocationOutput)
|
out := r.Data.(*GetBucketLocationOutput)
|
||||||
|
@ -24,7 +87,7 @@ func buildGetBucketLocation(r *request.Request) {
|
||||||
match := reBucketLocation.FindSubmatch(b)
|
match := reBucketLocation.FindSubmatch(b)
|
||||||
if len(match) > 1 {
|
if len(match) > 1 {
|
||||||
loc := string(match[1])
|
loc := string(match[1])
|
||||||
out.LocationConstraint = &loc
|
out.LocationConstraint = aws.String(loc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
18
vendor/github.com/aws/aws-sdk-go/service/s3/customizations.go
generated
vendored
18
vendor/github.com/aws/aws-sdk-go/service/s3/customizations.go
generated
vendored
|
@ -44,3 +44,21 @@ func defaultInitRequestFn(r *request.Request) {
|
||||||
r.Handlers.Unmarshal.PushFront(copyMultipartStatusOKUnmarhsalError)
|
r.Handlers.Unmarshal.PushFront(copyMultipartStatusOKUnmarhsalError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// bucketGetter is an accessor interface to grab the "Bucket" field from
|
||||||
|
// an S3 type.
|
||||||
|
type bucketGetter interface {
|
||||||
|
getBucket() string
|
||||||
|
}
|
||||||
|
|
||||||
|
// sseCustomerKeyGetter is an accessor interface to grab the "SSECustomerKey"
|
||||||
|
// field from an S3 type.
|
||||||
|
type sseCustomerKeyGetter interface {
|
||||||
|
getSSECustomerKey() string
|
||||||
|
}
|
||||||
|
|
||||||
|
// copySourceSSECustomerKeyGetter is an accessor interface to grab the
|
||||||
|
// "CopySourceSSECustomerKey" field from an S3 type.
|
||||||
|
type copySourceSSECustomerKeyGetter interface {
|
||||||
|
getCopySourceSSECustomerKey() string
|
||||||
|
}
|
||||||
|
|
26
vendor/github.com/aws/aws-sdk-go/service/s3/doc.go
generated
vendored
Normal file
26
vendor/github.com/aws/aws-sdk-go/service/s3/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package s3 provides the client and types for making API
|
||||||
|
// requests to Amazon Simple Storage Service.
|
||||||
|
//
|
||||||
|
// See https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01 for more information on this service.
|
||||||
|
//
|
||||||
|
// See s3 package documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/s3/
|
||||||
|
//
|
||||||
|
// Using the Client
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
// These clients are safe to use concurrently.
|
||||||
|
//
|
||||||
|
// See the SDK's documentation for more information on how to use the SDK.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/
|
||||||
|
//
|
||||||
|
// See aws.Config documentation for more information on configuring SDK clients.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
||||||
|
//
|
||||||
|
// See the Amazon Simple Storage Service client S3 for more
|
||||||
|
// information on creating client for this service.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/s3/#New
|
||||||
|
package s3
|
109
vendor/github.com/aws/aws-sdk-go/service/s3/doc_custom.go
generated
vendored
Normal file
109
vendor/github.com/aws/aws-sdk-go/service/s3/doc_custom.go
generated
vendored
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
// Upload Managers
|
||||||
|
//
|
||||||
|
// The s3manager package's Uploader provides concurrent upload of content to S3
|
||||||
|
// by taking advantage of S3's Multipart APIs. The Uploader also supports both
|
||||||
|
// io.Reader for streaming uploads, and will also take advantage of io.ReadSeeker
|
||||||
|
// for optimizations if the Body satisfies that type. Once the Uploader instance
|
||||||
|
// is created you can call Upload concurrently from multiple goroutines safely.
|
||||||
|
//
|
||||||
|
// // The session the S3 Uploader will use
|
||||||
|
// sess := session.Must(session.NewSession())
|
||||||
|
//
|
||||||
|
// // Create an uploader with the session and default options
|
||||||
|
// uploader := s3manager.NewUploader(sess)
|
||||||
|
//
|
||||||
|
// f, err := os.Open(filename)
|
||||||
|
// if err != nil {
|
||||||
|
// return fmt.Errorf("failed to open file %q, %v", filename, err)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Upload the file to S3.
|
||||||
|
// result, err := uploader.Upload(&s3manager.UploadInput{
|
||||||
|
// Bucket: aws.String(myBucket),
|
||||||
|
// Key: aws.String(myString),
|
||||||
|
// Body: f,
|
||||||
|
// })
|
||||||
|
// if err != nil {
|
||||||
|
// return fmt.Errorf("failed to upload file, %v", err)
|
||||||
|
// }
|
||||||
|
// fmt.Printf("file uploaded to, %s\n", aws.StringValue(result.Location))
|
||||||
|
//
|
||||||
|
// See the s3manager package's Uploader type documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#Uploader
|
||||||
|
//
|
||||||
|
// Download Manager
|
||||||
|
//
|
||||||
|
// The s3manager package's Downloader provides concurrently downloading of Objects
|
||||||
|
// from S3. The Downloader will write S3 Object content with an io.WriterAt.
|
||||||
|
// Once the Downloader instance is created you can call Download concurrently from
|
||||||
|
// multiple goroutines safely.
|
||||||
|
//
|
||||||
|
// // The session the S3 Downloader will use
|
||||||
|
// sess := session.Must(session.NewSession())
|
||||||
|
//
|
||||||
|
// // Create a downloader with the session and default options
|
||||||
|
// downloader := s3manager.NewDownloader(sess)
|
||||||
|
//
|
||||||
|
// // Create a file to write the S3 Object contents to.
|
||||||
|
// f, err := os.Create(filename)
|
||||||
|
// if err != nil {
|
||||||
|
// return fmt.Errorf("failed to create file %q, %v", filename, err)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Write the contents of S3 Object to the file
|
||||||
|
// n, err := downloader.Download(f, &s3.GetObjectInput{
|
||||||
|
// Bucket: aws.String(myBucket),
|
||||||
|
// Key: aws.String(myString),
|
||||||
|
// })
|
||||||
|
// if err != nil {
|
||||||
|
// return fmt.Errorf("failed to download file, %v", err)
|
||||||
|
// }
|
||||||
|
// fmt.Printf("file downloaded, %d bytes\n", n)
|
||||||
|
//
|
||||||
|
// See the s3manager package's Downloader type documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#Downloader
|
||||||
|
//
|
||||||
|
// Get Bucket Region
|
||||||
|
//
|
||||||
|
// GetBucketRegion will attempt to get the region for a bucket using a region
|
||||||
|
// hint to determine which AWS partition to perform the query on. Use this utility
|
||||||
|
// to determine the region a bucket is in.
|
||||||
|
//
|
||||||
|
// sess := session.Must(session.NewSession())
|
||||||
|
//
|
||||||
|
// bucket := "my-bucket"
|
||||||
|
// region, err := s3manager.GetBucketRegion(ctx, sess, bucket, "us-west-2")
|
||||||
|
// if err != nil {
|
||||||
|
// if aerr, ok := err.(awserr.Error); ok && aerr.Code() == "NotFound" {
|
||||||
|
// fmt.Fprintf(os.Stderr, "unable to find bucket %s's region not found\n", bucket)
|
||||||
|
// }
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
// fmt.Printf("Bucket %s is in %s region\n", bucket, region)
|
||||||
|
//
|
||||||
|
// See the s3manager package's GetBucketRegion function documentation for more information
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/#GetBucketRegion
|
||||||
|
//
|
||||||
|
// S3 Crypto Client
|
||||||
|
//
|
||||||
|
// The s3crypto package provides the tools to upload and download encrypted
|
||||||
|
// content from S3. The Encryption and Decryption clients can be used concurrently
|
||||||
|
// once the client is created.
|
||||||
|
//
|
||||||
|
// sess := session.Must(session.NewSession())
|
||||||
|
//
|
||||||
|
// // Create the decryption client.
|
||||||
|
// svc := s3crypto.NewDecryptionClient(sess)
|
||||||
|
//
|
||||||
|
// // The object will be downloaded from S3 and decrypted locally. By metadata
|
||||||
|
// // about the object's encryption will instruct the decryption client how
|
||||||
|
// // decrypt the content of the object. By default KMS is used for keys.
|
||||||
|
// result, err := svc.GetObject(&s3.GetObjectInput {
|
||||||
|
// Bucket: aws.String(myBucket),
|
||||||
|
// Key: aws.String(myKey),
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// See the s3crypto package documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3crypto/
|
||||||
|
//
|
||||||
|
package s3
|
48
vendor/github.com/aws/aws-sdk-go/service/s3/errors.go
generated
vendored
Normal file
48
vendor/github.com/aws/aws-sdk-go/service/s3/errors.go
generated
vendored
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package s3
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
// ErrCodeBucketAlreadyExists for service response error code
|
||||||
|
// "BucketAlreadyExists".
|
||||||
|
//
|
||||||
|
// The requested bucket name is not available. The bucket namespace is shared
|
||||||
|
// by all users of the system. Please select a different name and try again.
|
||||||
|
ErrCodeBucketAlreadyExists = "BucketAlreadyExists"
|
||||||
|
|
||||||
|
// ErrCodeBucketAlreadyOwnedByYou for service response error code
|
||||||
|
// "BucketAlreadyOwnedByYou".
|
||||||
|
ErrCodeBucketAlreadyOwnedByYou = "BucketAlreadyOwnedByYou"
|
||||||
|
|
||||||
|
// ErrCodeNoSuchBucket for service response error code
|
||||||
|
// "NoSuchBucket".
|
||||||
|
//
|
||||||
|
// The specified bucket does not exist.
|
||||||
|
ErrCodeNoSuchBucket = "NoSuchBucket"
|
||||||
|
|
||||||
|
// ErrCodeNoSuchKey for service response error code
|
||||||
|
// "NoSuchKey".
|
||||||
|
//
|
||||||
|
// The specified key does not exist.
|
||||||
|
ErrCodeNoSuchKey = "NoSuchKey"
|
||||||
|
|
||||||
|
// ErrCodeNoSuchUpload for service response error code
|
||||||
|
// "NoSuchUpload".
|
||||||
|
//
|
||||||
|
// The specified multipart upload does not exist.
|
||||||
|
ErrCodeNoSuchUpload = "NoSuchUpload"
|
||||||
|
|
||||||
|
// ErrCodeObjectAlreadyInActiveTierError for service response error code
|
||||||
|
// "ObjectAlreadyInActiveTierError".
|
||||||
|
//
|
||||||
|
// This operation is not allowed against this storage tier
|
||||||
|
ErrCodeObjectAlreadyInActiveTierError = "ObjectAlreadyInActiveTierError"
|
||||||
|
|
||||||
|
// ErrCodeObjectNotInActiveTierError for service response error code
|
||||||
|
// "ObjectNotInActiveTierError".
|
||||||
|
//
|
||||||
|
// The source object of the COPY operation is not in the active tier and is
|
||||||
|
// only stored in Amazon Glacier.
|
||||||
|
ErrCodeObjectNotInActiveTierError = "ObjectNotInActiveTierError"
|
||||||
|
)
|
13
vendor/github.com/aws/aws-sdk-go/service/s3/host_style_bucket.go
generated
vendored
13
vendor/github.com/aws/aws-sdk-go/service/s3/host_style_bucket.go
generated
vendored
|
@ -8,7 +8,6 @@ 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/awsutil"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -113,15 +112,9 @@ func updateEndpointForAccelerate(r *request.Request) {
|
||||||
// Attempts to retrieve the bucket name from the request input parameters.
|
// Attempts to retrieve the bucket name from the request input parameters.
|
||||||
// If no bucket is found, or the field is empty "", false will be returned.
|
// If no bucket is found, or the field is empty "", false will be returned.
|
||||||
func bucketNameFromReqParams(params interface{}) (string, bool) {
|
func bucketNameFromReqParams(params interface{}) (string, bool) {
|
||||||
b, _ := awsutil.ValuesAtPath(params, "Bucket")
|
if iface, ok := params.(bucketGetter); ok {
|
||||||
if len(b) == 0 {
|
b := iface.getBucket()
|
||||||
return "", false
|
return b, len(b) > 0
|
||||||
}
|
|
||||||
|
|
||||||
if bucket, ok := b[0].(*string); ok {
|
|
||||||
if bucketStr := aws.StringValue(bucket); bucketStr != "" {
|
|
||||||
return bucketStr, true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", false
|
return "", false
|
||||||
|
|
12
vendor/github.com/aws/aws-sdk-go/service/s3/service.go
generated
vendored
12
vendor/github.com/aws/aws-sdk-go/service/s3/service.go
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
package s3
|
package s3
|
||||||
|
|
||||||
|
@ -11,10 +11,12 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/private/protocol/restxml"
|
"github.com/aws/aws-sdk-go/private/protocol/restxml"
|
||||||
)
|
)
|
||||||
|
|
||||||
// S3 is a client for Amazon S3.
|
// S3 provides the API operation methods for making requests to
|
||||||
// The service client's operations are safe to be used concurrently.
|
// Amazon Simple Storage Service. See this package's package overview docs
|
||||||
// It is not safe to mutate any of the client's properties though.
|
// for details on the service.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/s3-2006-03-01
|
//
|
||||||
|
// S3 methods are safe to use concurrently. It is not safe to
|
||||||
|
// modify mutate any of the struct's properties though.
|
||||||
type S3 struct {
|
type S3 struct {
|
||||||
*client.Client
|
*client.Client
|
||||||
}
|
}
|
||||||
|
|
18
vendor/github.com/aws/aws-sdk-go/service/s3/sse.go
generated
vendored
18
vendor/github.com/aws/aws-sdk-go/service/s3/sse.go
generated
vendored
|
@ -5,17 +5,27 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"github.com/aws/aws-sdk-go/aws/awsutil"
|
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errSSERequiresSSL = awserr.New("ConfigError", "cannot send SSE keys over HTTP.", nil)
|
var errSSERequiresSSL = awserr.New("ConfigError", "cannot send SSE keys over HTTP.", nil)
|
||||||
|
|
||||||
func validateSSERequiresSSL(r *request.Request) {
|
func validateSSERequiresSSL(r *request.Request) {
|
||||||
if r.HTTPRequest.URL.Scheme != "https" {
|
if r.HTTPRequest.URL.Scheme == "https" {
|
||||||
p, _ := awsutil.ValuesAtPath(r.Params, "SSECustomerKey||CopySourceSSECustomerKey")
|
return
|
||||||
if len(p) > 0 {
|
}
|
||||||
|
|
||||||
|
if iface, ok := r.Params.(sseCustomerKeyGetter); ok {
|
||||||
|
if len(iface.getSSECustomerKey()) > 0 {
|
||||||
r.Error = errSSERequiresSSL
|
r.Error = errSSERequiresSSL
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if iface, ok := r.Params.(copySourceSSECustomerKeyGetter); ok {
|
||||||
|
if len(iface.getCopySourceSSECustomerKey()) > 0 {
|
||||||
|
r.Error = errSSERequiresSSL
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
64
vendor/github.com/aws/aws-sdk-go/service/s3/unmarshal_error.go
generated
vendored
64
vendor/github.com/aws/aws-sdk-go/service/s3/unmarshal_error.go
generated
vendored
|
@ -23,17 +23,22 @@ func unmarshalError(r *request.Request) {
|
||||||
defer r.HTTPResponse.Body.Close()
|
defer r.HTTPResponse.Body.Close()
|
||||||
defer io.Copy(ioutil.Discard, r.HTTPResponse.Body)
|
defer io.Copy(ioutil.Discard, r.HTTPResponse.Body)
|
||||||
|
|
||||||
|
hostID := r.HTTPResponse.Header.Get("X-Amz-Id-2")
|
||||||
|
|
||||||
// Bucket exists in a different region, and request needs
|
// Bucket exists in a different region, and request needs
|
||||||
// to be made to the correct region.
|
// to be made to the correct region.
|
||||||
if r.HTTPResponse.StatusCode == http.StatusMovedPermanently {
|
if r.HTTPResponse.StatusCode == http.StatusMovedPermanently {
|
||||||
r.Error = awserr.NewRequestFailure(
|
r.Error = requestFailure{
|
||||||
awserr.New("BucketRegionError",
|
RequestFailure: awserr.NewRequestFailure(
|
||||||
fmt.Sprintf("incorrect region, the bucket is not in '%s' region",
|
awserr.New("BucketRegionError",
|
||||||
aws.StringValue(r.Config.Region)),
|
fmt.Sprintf("incorrect region, the bucket is not in '%s' region",
|
||||||
nil),
|
aws.StringValue(r.Config.Region)),
|
||||||
r.HTTPResponse.StatusCode,
|
nil),
|
||||||
r.RequestID,
|
r.HTTPResponse.StatusCode,
|
||||||
)
|
r.RequestID,
|
||||||
|
),
|
||||||
|
hostID: hostID,
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +53,7 @@ func unmarshalError(r *request.Request) {
|
||||||
} else {
|
} else {
|
||||||
errCode = resp.Code
|
errCode = resp.Code
|
||||||
errMsg = resp.Message
|
errMsg = resp.Message
|
||||||
|
err = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback to status code converted to message if still no error code
|
// Fallback to status code converted to message if still no error code
|
||||||
|
@ -57,9 +63,41 @@ func unmarshalError(r *request.Request) {
|
||||||
errMsg = statusText
|
errMsg = statusText
|
||||||
}
|
}
|
||||||
|
|
||||||
r.Error = awserr.NewRequestFailure(
|
r.Error = requestFailure{
|
||||||
awserr.New(errCode, errMsg, nil),
|
RequestFailure: awserr.NewRequestFailure(
|
||||||
r.HTTPResponse.StatusCode,
|
awserr.New(errCode, errMsg, err),
|
||||||
r.RequestID,
|
r.HTTPResponse.StatusCode,
|
||||||
)
|
r.RequestID,
|
||||||
|
),
|
||||||
|
hostID: hostID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A RequestFailure provides access to the S3 Request ID and Host ID values
|
||||||
|
// returned from API operation errors. Getting the error as a string will
|
||||||
|
// return the formated error with the same information as awserr.RequestFailure,
|
||||||
|
// while also adding the HostID value from the response.
|
||||||
|
type RequestFailure interface {
|
||||||
|
awserr.RequestFailure
|
||||||
|
|
||||||
|
// Host ID is the S3 Host ID needed for debug, and contacting support
|
||||||
|
HostID() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type requestFailure struct {
|
||||||
|
awserr.RequestFailure
|
||||||
|
|
||||||
|
hostID string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r requestFailure) Error() string {
|
||||||
|
extra := fmt.Sprintf("status code: %d, request id: %s, host id: %s",
|
||||||
|
r.StatusCode(), r.RequestID(), r.hostID)
|
||||||
|
return awserr.SprintError(r.Code(), r.Message(), extra, r.OrigErr())
|
||||||
|
}
|
||||||
|
func (r requestFailure) String() string {
|
||||||
|
return r.Error()
|
||||||
|
}
|
||||||
|
func (r requestFailure) HostID() string {
|
||||||
|
return r.hostID
|
||||||
}
|
}
|
||||||
|
|
215
vendor/github.com/aws/aws-sdk-go/service/s3/waiters.go
generated
vendored
215
vendor/github.com/aws/aws-sdk-go/service/s3/waiters.go
generated
vendored
|
@ -1,139 +1,214 @@
|
||||||
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
package s3
|
package s3
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/aws/aws-sdk-go/private/waiter"
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
)
|
)
|
||||||
|
|
||||||
// WaitUntilBucketExists uses the Amazon S3 API operation
|
// WaitUntilBucketExists uses the Amazon S3 API operation
|
||||||
// HeadBucket to wait for a condition to be met before returning.
|
// HeadBucket to wait for a condition to be met before returning.
|
||||||
// If the condition is not meet within the max attempt window an error will
|
// If the condition is not met within the max attempt window, an error will
|
||||||
// be returned.
|
// be returned.
|
||||||
func (c *S3) WaitUntilBucketExists(input *HeadBucketInput) error {
|
func (c *S3) WaitUntilBucketExists(input *HeadBucketInput) error {
|
||||||
waiterCfg := waiter.Config{
|
return c.WaitUntilBucketExistsWithContext(aws.BackgroundContext(), input)
|
||||||
Operation: "HeadBucket",
|
}
|
||||||
Delay: 5,
|
|
||||||
|
// WaitUntilBucketExistsWithContext is an extended version of WaitUntilBucketExists.
|
||||||
|
// With the support for passing in a context and options to configure the
|
||||||
|
// Waiter and the underlying request options.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *S3) WaitUntilBucketExistsWithContext(ctx aws.Context, input *HeadBucketInput, opts ...request.WaiterOption) error {
|
||||||
|
w := request.Waiter{
|
||||||
|
Name: "WaitUntilBucketExists",
|
||||||
MaxAttempts: 20,
|
MaxAttempts: 20,
|
||||||
Acceptors: []waiter.WaitAcceptor{
|
Delay: request.ConstantWaiterDelay(5 * time.Second),
|
||||||
|
Acceptors: []request.WaiterAcceptor{
|
||||||
{
|
{
|
||||||
State: "success",
|
State: request.SuccessWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 200,
|
Expected: 200,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
State: "success",
|
State: request.SuccessWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 301,
|
Expected: 301,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
State: "success",
|
State: request.SuccessWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 403,
|
Expected: 403,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
State: "retry",
|
State: request.RetryWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 404,
|
Expected: 404,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Logger: c.Config.Logger,
|
||||||
|
NewRequest: func(opts []request.Option) (*request.Request, error) {
|
||||||
|
var inCpy *HeadBucketInput
|
||||||
|
if input != nil {
|
||||||
|
tmp := *input
|
||||||
|
inCpy = &tmp
|
||||||
|
}
|
||||||
|
req, _ := c.HeadBucketRequest(inCpy)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return req, nil
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
w.ApplyOptions(opts...)
|
||||||
|
|
||||||
w := waiter.Waiter{
|
return w.WaitWithContext(ctx)
|
||||||
Client: c,
|
|
||||||
Input: input,
|
|
||||||
Config: waiterCfg,
|
|
||||||
}
|
|
||||||
return w.Wait()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitUntilBucketNotExists uses the Amazon S3 API operation
|
// WaitUntilBucketNotExists uses the Amazon S3 API operation
|
||||||
// HeadBucket to wait for a condition to be met before returning.
|
// HeadBucket to wait for a condition to be met before returning.
|
||||||
// If the condition is not meet within the max attempt window an error will
|
// If the condition is not met within the max attempt window, an error will
|
||||||
// be returned.
|
// be returned.
|
||||||
func (c *S3) WaitUntilBucketNotExists(input *HeadBucketInput) error {
|
func (c *S3) WaitUntilBucketNotExists(input *HeadBucketInput) error {
|
||||||
waiterCfg := waiter.Config{
|
return c.WaitUntilBucketNotExistsWithContext(aws.BackgroundContext(), input)
|
||||||
Operation: "HeadBucket",
|
}
|
||||||
Delay: 5,
|
|
||||||
|
// WaitUntilBucketNotExistsWithContext is an extended version of WaitUntilBucketNotExists.
|
||||||
|
// With the support for passing in a context and options to configure the
|
||||||
|
// Waiter and the underlying request options.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *S3) WaitUntilBucketNotExistsWithContext(ctx aws.Context, input *HeadBucketInput, opts ...request.WaiterOption) error {
|
||||||
|
w := request.Waiter{
|
||||||
|
Name: "WaitUntilBucketNotExists",
|
||||||
MaxAttempts: 20,
|
MaxAttempts: 20,
|
||||||
Acceptors: []waiter.WaitAcceptor{
|
Delay: request.ConstantWaiterDelay(5 * time.Second),
|
||||||
|
Acceptors: []request.WaiterAcceptor{
|
||||||
{
|
{
|
||||||
State: "success",
|
State: request.SuccessWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 404,
|
Expected: 404,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Logger: c.Config.Logger,
|
||||||
|
NewRequest: func(opts []request.Option) (*request.Request, error) {
|
||||||
|
var inCpy *HeadBucketInput
|
||||||
|
if input != nil {
|
||||||
|
tmp := *input
|
||||||
|
inCpy = &tmp
|
||||||
|
}
|
||||||
|
req, _ := c.HeadBucketRequest(inCpy)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return req, nil
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
w.ApplyOptions(opts...)
|
||||||
|
|
||||||
w := waiter.Waiter{
|
return w.WaitWithContext(ctx)
|
||||||
Client: c,
|
|
||||||
Input: input,
|
|
||||||
Config: waiterCfg,
|
|
||||||
}
|
|
||||||
return w.Wait()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitUntilObjectExists uses the Amazon S3 API operation
|
// WaitUntilObjectExists uses the Amazon S3 API operation
|
||||||
// HeadObject to wait for a condition to be met before returning.
|
// HeadObject to wait for a condition to be met before returning.
|
||||||
// If the condition is not meet within the max attempt window an error will
|
// If the condition is not met within the max attempt window, an error will
|
||||||
// be returned.
|
// be returned.
|
||||||
func (c *S3) WaitUntilObjectExists(input *HeadObjectInput) error {
|
func (c *S3) WaitUntilObjectExists(input *HeadObjectInput) error {
|
||||||
waiterCfg := waiter.Config{
|
return c.WaitUntilObjectExistsWithContext(aws.BackgroundContext(), input)
|
||||||
Operation: "HeadObject",
|
}
|
||||||
Delay: 5,
|
|
||||||
|
// WaitUntilObjectExistsWithContext is an extended version of WaitUntilObjectExists.
|
||||||
|
// With the support for passing in a context and options to configure the
|
||||||
|
// Waiter and the underlying request options.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *S3) WaitUntilObjectExistsWithContext(ctx aws.Context, input *HeadObjectInput, opts ...request.WaiterOption) error {
|
||||||
|
w := request.Waiter{
|
||||||
|
Name: "WaitUntilObjectExists",
|
||||||
MaxAttempts: 20,
|
MaxAttempts: 20,
|
||||||
Acceptors: []waiter.WaitAcceptor{
|
Delay: request.ConstantWaiterDelay(5 * time.Second),
|
||||||
|
Acceptors: []request.WaiterAcceptor{
|
||||||
{
|
{
|
||||||
State: "success",
|
State: request.SuccessWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 200,
|
Expected: 200,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
State: "retry",
|
State: request.RetryWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 404,
|
Expected: 404,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Logger: c.Config.Logger,
|
||||||
|
NewRequest: func(opts []request.Option) (*request.Request, error) {
|
||||||
|
var inCpy *HeadObjectInput
|
||||||
|
if input != nil {
|
||||||
|
tmp := *input
|
||||||
|
inCpy = &tmp
|
||||||
|
}
|
||||||
|
req, _ := c.HeadObjectRequest(inCpy)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return req, nil
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
w.ApplyOptions(opts...)
|
||||||
|
|
||||||
w := waiter.Waiter{
|
return w.WaitWithContext(ctx)
|
||||||
Client: c,
|
|
||||||
Input: input,
|
|
||||||
Config: waiterCfg,
|
|
||||||
}
|
|
||||||
return w.Wait()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WaitUntilObjectNotExists uses the Amazon S3 API operation
|
// WaitUntilObjectNotExists uses the Amazon S3 API operation
|
||||||
// HeadObject to wait for a condition to be met before returning.
|
// HeadObject to wait for a condition to be met before returning.
|
||||||
// If the condition is not meet within the max attempt window an error will
|
// If the condition is not met within the max attempt window, an error will
|
||||||
// be returned.
|
// be returned.
|
||||||
func (c *S3) WaitUntilObjectNotExists(input *HeadObjectInput) error {
|
func (c *S3) WaitUntilObjectNotExists(input *HeadObjectInput) error {
|
||||||
waiterCfg := waiter.Config{
|
return c.WaitUntilObjectNotExistsWithContext(aws.BackgroundContext(), input)
|
||||||
Operation: "HeadObject",
|
}
|
||||||
Delay: 5,
|
|
||||||
|
// WaitUntilObjectNotExistsWithContext is an extended version of WaitUntilObjectNotExists.
|
||||||
|
// With the support for passing in a context and options to configure the
|
||||||
|
// Waiter and the underlying request options.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *S3) WaitUntilObjectNotExistsWithContext(ctx aws.Context, input *HeadObjectInput, opts ...request.WaiterOption) error {
|
||||||
|
w := request.Waiter{
|
||||||
|
Name: "WaitUntilObjectNotExists",
|
||||||
MaxAttempts: 20,
|
MaxAttempts: 20,
|
||||||
Acceptors: []waiter.WaitAcceptor{
|
Delay: request.ConstantWaiterDelay(5 * time.Second),
|
||||||
|
Acceptors: []request.WaiterAcceptor{
|
||||||
{
|
{
|
||||||
State: "success",
|
State: request.SuccessWaiterState,
|
||||||
Matcher: "status",
|
Matcher: request.StatusWaiterMatch,
|
||||||
Argument: "",
|
|
||||||
Expected: 404,
|
Expected: 404,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Logger: c.Config.Logger,
|
||||||
|
NewRequest: func(opts []request.Option) (*request.Request, error) {
|
||||||
|
var inCpy *HeadObjectInput
|
||||||
|
if input != nil {
|
||||||
|
tmp := *input
|
||||||
|
inCpy = &tmp
|
||||||
|
}
|
||||||
|
req, _ := c.HeadObjectRequest(inCpy)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return req, nil
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
w.ApplyOptions(opts...)
|
||||||
|
|
||||||
w := waiter.Waiter{
|
return w.WaitWithContext(ctx)
|
||||||
Client: c,
|
|
||||||
Input: input,
|
|
||||||
Config: waiterCfg,
|
|
||||||
}
|
|
||||||
return w.Wait()
|
|
||||||
}
|
}
|
||||||
|
|
318
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
318
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
|
@ -1,11 +1,11 @@
|
||||||
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
// Package sts provides a client for AWS Security Token Service.
|
|
||||||
package sts
|
package sts
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/awsutil"
|
"github.com/aws/aws-sdk-go/aws/awsutil"
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
)
|
)
|
||||||
|
@ -14,19 +14,18 @@ const opAssumeRole = "AssumeRole"
|
||||||
|
|
||||||
// AssumeRoleRequest generates a "aws/request.Request" representing the
|
// AssumeRoleRequest generates a "aws/request.Request" representing the
|
||||||
// client's request for the AssumeRole operation. The "output" return
|
// client's request for the AssumeRole operation. The "output" return
|
||||||
// value can be used to capture response data after the request's "Send" method
|
// value will be populated with the request's response once the request complets
|
||||||
// is called.
|
// successfuly.
|
||||||
//
|
//
|
||||||
// See AssumeRole for usage and error information.
|
// Use "Send" method on the returned Request to send the API call to the service.
|
||||||
|
// the "output" return value is not valid until after Send returns without error.
|
||||||
//
|
//
|
||||||
// Creating a request object using this method should be used when you want to inject
|
// See AssumeRole for more information on using the AssumeRole
|
||||||
// custom logic into the request's lifecycle using a custom handler, or if you want to
|
// API call, and error handling.
|
||||||
// access properties on the request object before or after sending the request. If
|
//
|
||||||
// you just want the service response, call the AssumeRole method directly
|
// This method is useful when you want to inject custom logic or configuration
|
||||||
// instead.
|
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||||
//
|
//
|
||||||
// Note: You must call the "Send" method on the returned request object in order
|
|
||||||
// to execute the request.
|
|
||||||
//
|
//
|
||||||
// // Example sending a request using the AssumeRoleRequest method.
|
// // Example sending a request using the AssumeRoleRequest method.
|
||||||
// req, resp := client.AssumeRoleRequest(params)
|
// req, resp := client.AssumeRoleRequest(params)
|
||||||
|
@ -153,16 +152,16 @@ func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, o
|
||||||
// API operation AssumeRole for usage and error information.
|
// API operation AssumeRole for usage and error information.
|
||||||
//
|
//
|
||||||
// Returned Error Codes:
|
// Returned Error Codes:
|
||||||
// * MalformedPolicyDocument
|
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
|
||||||
// The request was rejected because the policy document was malformed. The error
|
// The request was rejected because the policy document was malformed. The error
|
||||||
// message describes the specific error.
|
// message describes the specific error.
|
||||||
//
|
//
|
||||||
// * PackedPolicyTooLarge
|
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
|
||||||
// The request was rejected because the policy document was too large. The error
|
// The request was rejected because the policy document was too large. The error
|
||||||
// message describes how big the policy document is, in packed form, as a percentage
|
// message describes how big the policy document is, in packed form, as a percentage
|
||||||
// of what the API allows.
|
// of what the API allows.
|
||||||
//
|
//
|
||||||
// * RegionDisabledException
|
// * ErrCodeRegionDisabledException "RegionDisabledException"
|
||||||
// STS is not activated in the requested region for the account that is being
|
// STS is not activated in the requested region for the account that is being
|
||||||
// asked to generate credentials. The account administrator must use the IAM
|
// asked to generate credentials. The account administrator must use the IAM
|
||||||
// console to activate STS in that region. For more information, see Activating
|
// console to activate STS in that region. For more information, see Activating
|
||||||
|
@ -172,27 +171,41 @@ func (c *STS) AssumeRoleRequest(input *AssumeRoleInput) (req *request.Request, o
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRole
|
// Please also see 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)
|
||||||
err := req.Send()
|
return out, req.Send()
|
||||||
return out, err
|
}
|
||||||
|
|
||||||
|
// AssumeRoleWithContext is the same as AssumeRole with the addition of
|
||||||
|
// the ability to pass a context and additional request options.
|
||||||
|
//
|
||||||
|
// See AssumeRole for details on how to use this API operation.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *STS) AssumeRoleWithContext(ctx aws.Context, input *AssumeRoleInput, opts ...request.Option) (*AssumeRoleOutput, error) {
|
||||||
|
req, out := c.AssumeRoleRequest(input)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
const opAssumeRoleWithSAML = "AssumeRoleWithSAML"
|
const opAssumeRoleWithSAML = "AssumeRoleWithSAML"
|
||||||
|
|
||||||
// AssumeRoleWithSAMLRequest generates a "aws/request.Request" representing the
|
// AssumeRoleWithSAMLRequest generates a "aws/request.Request" representing the
|
||||||
// client's request for the AssumeRoleWithSAML operation. The "output" return
|
// client's request for the AssumeRoleWithSAML operation. The "output" return
|
||||||
// value can be used to capture response data after the request's "Send" method
|
// value will be populated with the request's response once the request complets
|
||||||
// is called.
|
// successfuly.
|
||||||
//
|
//
|
||||||
// See AssumeRoleWithSAML for usage and error information.
|
// Use "Send" method on the returned Request to send the API call to the service.
|
||||||
|
// the "output" return value is not valid until after Send returns without error.
|
||||||
//
|
//
|
||||||
// Creating a request object using this method should be used when you want to inject
|
// See AssumeRoleWithSAML for more information on using the AssumeRoleWithSAML
|
||||||
// custom logic into the request's lifecycle using a custom handler, or if you want to
|
// API call, and error handling.
|
||||||
// access properties on the request object before or after sending the request. If
|
//
|
||||||
// you just want the service response, call the AssumeRoleWithSAML method directly
|
// This method is useful when you want to inject custom logic or configuration
|
||||||
// instead.
|
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||||
//
|
//
|
||||||
// Note: You must call the "Send" method on the returned request object in order
|
|
||||||
// to execute the request.
|
|
||||||
//
|
//
|
||||||
// // Example sending a request using the AssumeRoleWithSAMLRequest method.
|
// // Example sending a request using the AssumeRoleWithSAMLRequest method.
|
||||||
// req, resp := client.AssumeRoleWithSAMLRequest(params)
|
// req, resp := client.AssumeRoleWithSAMLRequest(params)
|
||||||
|
@ -297,31 +310,31 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re
|
||||||
// API operation AssumeRoleWithSAML for usage and error information.
|
// API operation AssumeRoleWithSAML for usage and error information.
|
||||||
//
|
//
|
||||||
// Returned Error Codes:
|
// Returned Error Codes:
|
||||||
// * MalformedPolicyDocument
|
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
|
||||||
// The request was rejected because the policy document was malformed. The error
|
// The request was rejected because the policy document was malformed. The error
|
||||||
// message describes the specific error.
|
// message describes the specific error.
|
||||||
//
|
//
|
||||||
// * PackedPolicyTooLarge
|
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
|
||||||
// The request was rejected because the policy document was too large. The error
|
// The request was rejected because the policy document was too large. The error
|
||||||
// message describes how big the policy document is, in packed form, as a percentage
|
// message describes how big the policy document is, in packed form, as a percentage
|
||||||
// of what the API allows.
|
// of what the API allows.
|
||||||
//
|
//
|
||||||
// * IDPRejectedClaim
|
// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim"
|
||||||
// The identity provider (IdP) reported that authentication failed. This might
|
// The identity provider (IdP) reported that authentication failed. This might
|
||||||
// be because the claim is invalid.
|
// be because the claim is invalid.
|
||||||
//
|
//
|
||||||
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
|
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
|
||||||
// can also mean that the claim has expired or has been explicitly revoked.
|
// can also mean that the claim has expired or has been explicitly revoked.
|
||||||
//
|
//
|
||||||
// * InvalidIdentityToken
|
// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken"
|
||||||
// The web identity token that was passed could not be validated by AWS. Get
|
// The web identity token that was passed could not be validated by AWS. Get
|
||||||
// a new identity token from the identity provider and then retry the request.
|
// a new identity token from the identity provider and then retry the request.
|
||||||
//
|
//
|
||||||
// * ExpiredTokenException
|
// * ErrCodeExpiredTokenException "ExpiredTokenException"
|
||||||
// The web identity token that was passed is expired or is not valid. Get a
|
// The web identity token that was passed is expired or is not valid. Get a
|
||||||
// new identity token from the identity provider and then retry the request.
|
// new identity token from the identity provider and then retry the request.
|
||||||
//
|
//
|
||||||
// * RegionDisabledException
|
// * ErrCodeRegionDisabledException "RegionDisabledException"
|
||||||
// STS is not activated in the requested region for the account that is being
|
// STS is not activated in the requested region for the account that is being
|
||||||
// asked to generate credentials. The account administrator must use the IAM
|
// asked to generate credentials. The account administrator must use the IAM
|
||||||
// console to activate STS in that region. For more information, see Activating
|
// console to activate STS in that region. For more information, see Activating
|
||||||
|
@ -331,27 +344,41 @@ func (c *STS) AssumeRoleWithSAMLRequest(input *AssumeRoleWithSAMLInput) (req *re
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithSAML
|
// Please also see 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)
|
||||||
err := req.Send()
|
return out, req.Send()
|
||||||
return out, err
|
}
|
||||||
|
|
||||||
|
// AssumeRoleWithSAMLWithContext is the same as AssumeRoleWithSAML with the addition of
|
||||||
|
// the ability to pass a context and additional request options.
|
||||||
|
//
|
||||||
|
// See AssumeRoleWithSAML for details on how to use this API operation.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *STS) AssumeRoleWithSAMLWithContext(ctx aws.Context, input *AssumeRoleWithSAMLInput, opts ...request.Option) (*AssumeRoleWithSAMLOutput, error) {
|
||||||
|
req, out := c.AssumeRoleWithSAMLRequest(input)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
const opAssumeRoleWithWebIdentity = "AssumeRoleWithWebIdentity"
|
const opAssumeRoleWithWebIdentity = "AssumeRoleWithWebIdentity"
|
||||||
|
|
||||||
// AssumeRoleWithWebIdentityRequest generates a "aws/request.Request" representing the
|
// AssumeRoleWithWebIdentityRequest generates a "aws/request.Request" representing the
|
||||||
// client's request for the AssumeRoleWithWebIdentity operation. The "output" return
|
// client's request for the AssumeRoleWithWebIdentity operation. The "output" return
|
||||||
// value can be used to capture response data after the request's "Send" method
|
// value will be populated with the request's response once the request complets
|
||||||
// is called.
|
// successfuly.
|
||||||
//
|
//
|
||||||
// See AssumeRoleWithWebIdentity for usage and error information.
|
// Use "Send" method on the returned Request to send the API call to the service.
|
||||||
|
// the "output" return value is not valid until after Send returns without error.
|
||||||
//
|
//
|
||||||
// Creating a request object using this method should be used when you want to inject
|
// See AssumeRoleWithWebIdentity for more information on using the AssumeRoleWithWebIdentity
|
||||||
// custom logic into the request's lifecycle using a custom handler, or if you want to
|
// API call, and error handling.
|
||||||
// access properties on the request object before or after sending the request. If
|
//
|
||||||
// you just want the service response, call the AssumeRoleWithWebIdentity method directly
|
// This method is useful when you want to inject custom logic or configuration
|
||||||
// instead.
|
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||||
//
|
//
|
||||||
// Note: You must call the "Send" method on the returned request object in order
|
|
||||||
// to execute the request.
|
|
||||||
//
|
//
|
||||||
// // Example sending a request using the AssumeRoleWithWebIdentityRequest method.
|
// // Example sending a request using the AssumeRoleWithWebIdentityRequest method.
|
||||||
// req, resp := client.AssumeRoleWithWebIdentityRequest(params)
|
// req, resp := client.AssumeRoleWithWebIdentityRequest(params)
|
||||||
|
@ -478,38 +505,38 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI
|
||||||
// API operation AssumeRoleWithWebIdentity for usage and error information.
|
// API operation AssumeRoleWithWebIdentity for usage and error information.
|
||||||
//
|
//
|
||||||
// Returned Error Codes:
|
// Returned Error Codes:
|
||||||
// * MalformedPolicyDocument
|
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
|
||||||
// The request was rejected because the policy document was malformed. The error
|
// The request was rejected because the policy document was malformed. The error
|
||||||
// message describes the specific error.
|
// message describes the specific error.
|
||||||
//
|
//
|
||||||
// * PackedPolicyTooLarge
|
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
|
||||||
// The request was rejected because the policy document was too large. The error
|
// The request was rejected because the policy document was too large. The error
|
||||||
// message describes how big the policy document is, in packed form, as a percentage
|
// message describes how big the policy document is, in packed form, as a percentage
|
||||||
// of what the API allows.
|
// of what the API allows.
|
||||||
//
|
//
|
||||||
// * IDPRejectedClaim
|
// * ErrCodeIDPRejectedClaimException "IDPRejectedClaim"
|
||||||
// The identity provider (IdP) reported that authentication failed. This might
|
// The identity provider (IdP) reported that authentication failed. This might
|
||||||
// be because the claim is invalid.
|
// be because the claim is invalid.
|
||||||
//
|
//
|
||||||
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
|
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
|
||||||
// can also mean that the claim has expired or has been explicitly revoked.
|
// can also mean that the claim has expired or has been explicitly revoked.
|
||||||
//
|
//
|
||||||
// * IDPCommunicationError
|
// * ErrCodeIDPCommunicationErrorException "IDPCommunicationError"
|
||||||
// The request could not be fulfilled because the non-AWS identity provider
|
// The request could not be fulfilled because the non-AWS identity provider
|
||||||
// (IDP) that was asked to verify the incoming identity token could not be reached.
|
// (IDP) that was asked to verify the incoming identity token could not be reached.
|
||||||
// This is often a transient error caused by network conditions. Retry the request
|
// This is often a transient error caused by network conditions. Retry the request
|
||||||
// a limited number of times so that you don't exceed the request rate. If the
|
// a limited number of times so that you don't exceed the request rate. If the
|
||||||
// error persists, the non-AWS identity provider might be down or not responding.
|
// error persists, the non-AWS identity provider might be down or not responding.
|
||||||
//
|
//
|
||||||
// * InvalidIdentityToken
|
// * ErrCodeInvalidIdentityTokenException "InvalidIdentityToken"
|
||||||
// The web identity token that was passed could not be validated by AWS. Get
|
// The web identity token that was passed could not be validated by AWS. Get
|
||||||
// a new identity token from the identity provider and then retry the request.
|
// a new identity token from the identity provider and then retry the request.
|
||||||
//
|
//
|
||||||
// * ExpiredTokenException
|
// * ErrCodeExpiredTokenException "ExpiredTokenException"
|
||||||
// The web identity token that was passed is expired or is not valid. Get a
|
// The web identity token that was passed is expired or is not valid. Get a
|
||||||
// new identity token from the identity provider and then retry the request.
|
// new identity token from the identity provider and then retry the request.
|
||||||
//
|
//
|
||||||
// * RegionDisabledException
|
// * ErrCodeRegionDisabledException "RegionDisabledException"
|
||||||
// STS is not activated in the requested region for the account that is being
|
// STS is not activated in the requested region for the account that is being
|
||||||
// asked to generate credentials. The account administrator must use the IAM
|
// asked to generate credentials. The account administrator must use the IAM
|
||||||
// console to activate STS in that region. For more information, see Activating
|
// console to activate STS in that region. For more information, see Activating
|
||||||
|
@ -519,27 +546,41 @@ func (c *STS) AssumeRoleWithWebIdentityRequest(input *AssumeRoleWithWebIdentityI
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleWithWebIdentity
|
// Please also see 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)
|
||||||
err := req.Send()
|
return out, req.Send()
|
||||||
return out, err
|
}
|
||||||
|
|
||||||
|
// AssumeRoleWithWebIdentityWithContext is the same as AssumeRoleWithWebIdentity with the addition of
|
||||||
|
// the ability to pass a context and additional request options.
|
||||||
|
//
|
||||||
|
// See AssumeRoleWithWebIdentity for details on how to use this API operation.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *STS) AssumeRoleWithWebIdentityWithContext(ctx aws.Context, input *AssumeRoleWithWebIdentityInput, opts ...request.Option) (*AssumeRoleWithWebIdentityOutput, error) {
|
||||||
|
req, out := c.AssumeRoleWithWebIdentityRequest(input)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
const opDecodeAuthorizationMessage = "DecodeAuthorizationMessage"
|
const opDecodeAuthorizationMessage = "DecodeAuthorizationMessage"
|
||||||
|
|
||||||
// DecodeAuthorizationMessageRequest generates a "aws/request.Request" representing the
|
// DecodeAuthorizationMessageRequest generates a "aws/request.Request" representing the
|
||||||
// client's request for the DecodeAuthorizationMessage operation. The "output" return
|
// client's request for the DecodeAuthorizationMessage operation. The "output" return
|
||||||
// value can be used to capture response data after the request's "Send" method
|
// value will be populated with the request's response once the request complets
|
||||||
// is called.
|
// successfuly.
|
||||||
//
|
//
|
||||||
// See DecodeAuthorizationMessage for usage and error information.
|
// Use "Send" method on the returned Request to send the API call to the service.
|
||||||
|
// the "output" return value is not valid until after Send returns without error.
|
||||||
//
|
//
|
||||||
// Creating a request object using this method should be used when you want to inject
|
// See DecodeAuthorizationMessage for more information on using the DecodeAuthorizationMessage
|
||||||
// custom logic into the request's lifecycle using a custom handler, or if you want to
|
// API call, and error handling.
|
||||||
// access properties on the request object before or after sending the request. If
|
//
|
||||||
// you just want the service response, call the DecodeAuthorizationMessage method directly
|
// This method is useful when you want to inject custom logic or configuration
|
||||||
// instead.
|
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||||
//
|
//
|
||||||
// Note: You must call the "Send" method on the returned request object in order
|
|
||||||
// to execute the request.
|
|
||||||
//
|
//
|
||||||
// // Example sending a request using the DecodeAuthorizationMessageRequest method.
|
// // Example sending a request using the DecodeAuthorizationMessageRequest method.
|
||||||
// req, resp := client.DecodeAuthorizationMessageRequest(params)
|
// req, resp := client.DecodeAuthorizationMessageRequest(params)
|
||||||
|
@ -609,7 +650,7 @@ func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessag
|
||||||
// API operation DecodeAuthorizationMessage for usage and error information.
|
// API operation DecodeAuthorizationMessage for usage and error information.
|
||||||
//
|
//
|
||||||
// Returned Error Codes:
|
// Returned Error Codes:
|
||||||
// * InvalidAuthorizationMessageException
|
// * ErrCodeInvalidAuthorizationMessageException "InvalidAuthorizationMessageException"
|
||||||
// The error returned if the message passed to DecodeAuthorizationMessage was
|
// The error returned if the message passed to DecodeAuthorizationMessage was
|
||||||
// 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.
|
||||||
|
@ -617,27 +658,41 @@ func (c *STS) DecodeAuthorizationMessageRequest(input *DecodeAuthorizationMessag
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/DecodeAuthorizationMessage
|
// Please also see 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)
|
||||||
err := req.Send()
|
return out, req.Send()
|
||||||
return out, err
|
}
|
||||||
|
|
||||||
|
// DecodeAuthorizationMessageWithContext is the same as DecodeAuthorizationMessage with the addition of
|
||||||
|
// the ability to pass a context and additional request options.
|
||||||
|
//
|
||||||
|
// See DecodeAuthorizationMessage for details on how to use this API operation.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *STS) DecodeAuthorizationMessageWithContext(ctx aws.Context, input *DecodeAuthorizationMessageInput, opts ...request.Option) (*DecodeAuthorizationMessageOutput, error) {
|
||||||
|
req, out := c.DecodeAuthorizationMessageRequest(input)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
const opGetCallerIdentity = "GetCallerIdentity"
|
const opGetCallerIdentity = "GetCallerIdentity"
|
||||||
|
|
||||||
// GetCallerIdentityRequest generates a "aws/request.Request" representing the
|
// GetCallerIdentityRequest generates a "aws/request.Request" representing the
|
||||||
// client's request for the GetCallerIdentity operation. The "output" return
|
// client's request for the GetCallerIdentity operation. The "output" return
|
||||||
// value can be used to capture response data after the request's "Send" method
|
// value will be populated with the request's response once the request complets
|
||||||
// is called.
|
// successfuly.
|
||||||
//
|
//
|
||||||
// See GetCallerIdentity for usage and error information.
|
// Use "Send" method on the returned Request to send the API call to the service.
|
||||||
|
// the "output" return value is not valid until after Send returns without error.
|
||||||
//
|
//
|
||||||
// Creating a request object using this method should be used when you want to inject
|
// See GetCallerIdentity for more information on using the GetCallerIdentity
|
||||||
// custom logic into the request's lifecycle using a custom handler, or if you want to
|
// API call, and error handling.
|
||||||
// access properties on the request object before or after sending the request. If
|
//
|
||||||
// you just want the service response, call the GetCallerIdentity method directly
|
// This method is useful when you want to inject custom logic or configuration
|
||||||
// instead.
|
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||||
//
|
//
|
||||||
// Note: You must call the "Send" method on the returned request object in order
|
|
||||||
// to execute the request.
|
|
||||||
//
|
//
|
||||||
// // Example sending a request using the GetCallerIdentityRequest method.
|
// // Example sending a request using the GetCallerIdentityRequest method.
|
||||||
// req, resp := client.GetCallerIdentityRequest(params)
|
// req, resp := client.GetCallerIdentityRequest(params)
|
||||||
|
@ -678,27 +733,41 @@ func (c *STS) GetCallerIdentityRequest(input *GetCallerIdentityInput) (req *requ
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetCallerIdentity
|
// Please also see 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)
|
||||||
err := req.Send()
|
return out, req.Send()
|
||||||
return out, err
|
}
|
||||||
|
|
||||||
|
// GetCallerIdentityWithContext is the same as GetCallerIdentity with the addition of
|
||||||
|
// the ability to pass a context and additional request options.
|
||||||
|
//
|
||||||
|
// See GetCallerIdentity for details on how to use this API operation.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *STS) GetCallerIdentityWithContext(ctx aws.Context, input *GetCallerIdentityInput, opts ...request.Option) (*GetCallerIdentityOutput, error) {
|
||||||
|
req, out := c.GetCallerIdentityRequest(input)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
const opGetFederationToken = "GetFederationToken"
|
const opGetFederationToken = "GetFederationToken"
|
||||||
|
|
||||||
// GetFederationTokenRequest generates a "aws/request.Request" representing the
|
// GetFederationTokenRequest generates a "aws/request.Request" representing the
|
||||||
// client's request for the GetFederationToken operation. The "output" return
|
// client's request for the GetFederationToken operation. The "output" return
|
||||||
// value can be used to capture response data after the request's "Send" method
|
// value will be populated with the request's response once the request complets
|
||||||
// is called.
|
// successfuly.
|
||||||
//
|
//
|
||||||
// See GetFederationToken for usage and error information.
|
// Use "Send" method on the returned Request to send the API call to the service.
|
||||||
|
// the "output" return value is not valid until after Send returns without error.
|
||||||
//
|
//
|
||||||
// Creating a request object using this method should be used when you want to inject
|
// See GetFederationToken for more information on using the GetFederationToken
|
||||||
// custom logic into the request's lifecycle using a custom handler, or if you want to
|
// API call, and error handling.
|
||||||
// access properties on the request object before or after sending the request. If
|
//
|
||||||
// you just want the service response, call the GetFederationToken method directly
|
// This method is useful when you want to inject custom logic or configuration
|
||||||
// instead.
|
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||||
//
|
//
|
||||||
// Note: You must call the "Send" method on the returned request object in order
|
|
||||||
// to execute the request.
|
|
||||||
//
|
//
|
||||||
// // Example sending a request using the GetFederationTokenRequest method.
|
// // Example sending a request using the GetFederationTokenRequest method.
|
||||||
// req, resp := client.GetFederationTokenRequest(params)
|
// req, resp := client.GetFederationTokenRequest(params)
|
||||||
|
@ -814,16 +883,16 @@ func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *re
|
||||||
// API operation GetFederationToken for usage and error information.
|
// API operation GetFederationToken for usage and error information.
|
||||||
//
|
//
|
||||||
// Returned Error Codes:
|
// Returned Error Codes:
|
||||||
// * MalformedPolicyDocument
|
// * ErrCodeMalformedPolicyDocumentException "MalformedPolicyDocument"
|
||||||
// The request was rejected because the policy document was malformed. The error
|
// The request was rejected because the policy document was malformed. The error
|
||||||
// message describes the specific error.
|
// message describes the specific error.
|
||||||
//
|
//
|
||||||
// * PackedPolicyTooLarge
|
// * ErrCodePackedPolicyTooLargeException "PackedPolicyTooLarge"
|
||||||
// The request was rejected because the policy document was too large. The error
|
// The request was rejected because the policy document was too large. The error
|
||||||
// message describes how big the policy document is, in packed form, as a percentage
|
// message describes how big the policy document is, in packed form, as a percentage
|
||||||
// of what the API allows.
|
// of what the API allows.
|
||||||
//
|
//
|
||||||
// * RegionDisabledException
|
// * ErrCodeRegionDisabledException "RegionDisabledException"
|
||||||
// STS is not activated in the requested region for the account that is being
|
// STS is not activated in the requested region for the account that is being
|
||||||
// asked to generate credentials. The account administrator must use the IAM
|
// asked to generate credentials. The account administrator must use the IAM
|
||||||
// console to activate STS in that region. For more information, see Activating
|
// console to activate STS in that region. For more information, see Activating
|
||||||
|
@ -833,27 +902,41 @@ func (c *STS) GetFederationTokenRequest(input *GetFederationTokenInput) (req *re
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetFederationToken
|
// Please also see 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)
|
||||||
err := req.Send()
|
return out, req.Send()
|
||||||
return out, err
|
}
|
||||||
|
|
||||||
|
// GetFederationTokenWithContext is the same as GetFederationToken with the addition of
|
||||||
|
// the ability to pass a context and additional request options.
|
||||||
|
//
|
||||||
|
// See GetFederationToken for details on how to use this API operation.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *STS) GetFederationTokenWithContext(ctx aws.Context, input *GetFederationTokenInput, opts ...request.Option) (*GetFederationTokenOutput, error) {
|
||||||
|
req, out := c.GetFederationTokenRequest(input)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
const opGetSessionToken = "GetSessionToken"
|
const opGetSessionToken = "GetSessionToken"
|
||||||
|
|
||||||
// GetSessionTokenRequest generates a "aws/request.Request" representing the
|
// GetSessionTokenRequest generates a "aws/request.Request" representing the
|
||||||
// client's request for the GetSessionToken operation. The "output" return
|
// client's request for the GetSessionToken operation. The "output" return
|
||||||
// value can be used to capture response data after the request's "Send" method
|
// value will be populated with the request's response once the request complets
|
||||||
// is called.
|
// successfuly.
|
||||||
//
|
//
|
||||||
// See GetSessionToken for usage and error information.
|
// Use "Send" method on the returned Request to send the API call to the service.
|
||||||
|
// the "output" return value is not valid until after Send returns without error.
|
||||||
//
|
//
|
||||||
// Creating a request object using this method should be used when you want to inject
|
// See GetSessionToken for more information on using the GetSessionToken
|
||||||
// custom logic into the request's lifecycle using a custom handler, or if you want to
|
// API call, and error handling.
|
||||||
// access properties on the request object before or after sending the request. If
|
//
|
||||||
// you just want the service response, call the GetSessionToken method directly
|
// This method is useful when you want to inject custom logic or configuration
|
||||||
// instead.
|
// into the SDK's request lifecycle. Such as custom headers, or retry logic.
|
||||||
//
|
//
|
||||||
// Note: You must call the "Send" method on the returned request object in order
|
|
||||||
// to execute the request.
|
|
||||||
//
|
//
|
||||||
// // Example sending a request using the GetSessionTokenRequest method.
|
// // Example sending a request using the GetSessionTokenRequest method.
|
||||||
// req, resp := client.GetSessionTokenRequest(params)
|
// req, resp := client.GetSessionTokenRequest(params)
|
||||||
|
@ -937,7 +1020,7 @@ func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.
|
||||||
// API operation GetSessionToken for usage and error information.
|
// API operation GetSessionToken for usage and error information.
|
||||||
//
|
//
|
||||||
// Returned Error Codes:
|
// Returned Error Codes:
|
||||||
// * RegionDisabledException
|
// * ErrCodeRegionDisabledException "RegionDisabledException"
|
||||||
// STS is not activated in the requested region for the account that is being
|
// STS is not activated in the requested region for the account that is being
|
||||||
// asked to generate credentials. The account administrator must use the IAM
|
// asked to generate credentials. The account administrator must use the IAM
|
||||||
// console to activate STS in that region. For more information, see Activating
|
// console to activate STS in that region. For more information, see Activating
|
||||||
|
@ -947,8 +1030,23 @@ func (c *STS) GetSessionTokenRequest(input *GetSessionTokenInput) (req *request.
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/GetSessionToken
|
// Please also see 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)
|
||||||
err := req.Send()
|
return out, req.Send()
|
||||||
return out, err
|
}
|
||||||
|
|
||||||
|
// GetSessionTokenWithContext is the same as GetSessionToken with the addition of
|
||||||
|
// the ability to pass a context and additional request options.
|
||||||
|
//
|
||||||
|
// See GetSessionToken for details on how to use this API operation.
|
||||||
|
//
|
||||||
|
// The context must be non-nil and will be used for request cancellation. If
|
||||||
|
// the context is nil a panic will occur. In the future the SDK may create
|
||||||
|
// sub-contexts for http.Requests. See https://golang.org/pkg/context/
|
||||||
|
// for more information on using Contexts.
|
||||||
|
func (c *STS) GetSessionTokenWithContext(ctx aws.Context, input *GetSessionTokenInput, opts ...request.Option) (*GetSessionTokenOutput, error) {
|
||||||
|
req, out := c.GetSessionTokenRequest(input)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.ApplyOptions(opts...)
|
||||||
|
return out, req.Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleRequest
|
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15/AssumeRoleRequest
|
||||||
|
@ -980,7 +1078,7 @@ type AssumeRoleInput struct {
|
||||||
//
|
//
|
||||||
// The regex used to validated this parameter is a string of characters consisting
|
// The regex used to validated this parameter is a string of characters consisting
|
||||||
// of upper- and lower-case alphanumeric characters with no spaces. You can
|
// of upper- and lower-case alphanumeric characters with no spaces. You can
|
||||||
// also include underscores or any of the following characters: =,.@:\/-
|
// also include underscores or any of the following characters: =,.@:/-
|
||||||
ExternalId *string `min:"2" type:"string"`
|
ExternalId *string `min:"2" type:"string"`
|
||||||
|
|
||||||
// An IAM policy in JSON format.
|
// An IAM policy in JSON format.
|
||||||
|
@ -2164,9 +2262,9 @@ type GetSessionTokenInput struct {
|
||||||
// You can find the device for an IAM user by going to the AWS Management Console
|
// You can find the device for an IAM user by going to the AWS Management Console
|
||||||
// and viewing the user's security credentials.
|
// and viewing the user's security credentials.
|
||||||
//
|
//
|
||||||
// The regex used to validate this parameter is a string of characters consisting
|
// The regex used to validated this parameter is a string of characters consisting
|
||||||
// of upper- and lower-case alphanumeric characters with no spaces. You can
|
// of upper- and lower-case alphanumeric characters with no spaces. You can
|
||||||
// also include underscores or any of the following characters: =,.@-
|
// also include underscores or any of the following characters: =,.@:/-
|
||||||
SerialNumber *string `min:"9" type:"string"`
|
SerialNumber *string `min:"9" type:"string"`
|
||||||
|
|
||||||
// The value provided by the MFA device, if MFA is required. If any policy requires
|
// The value provided by the MFA device, if MFA is required. If any policy requires
|
||||||
|
|
72
vendor/github.com/aws/aws-sdk-go/service/sts/doc.go
generated
vendored
Normal file
72
vendor/github.com/aws/aws-sdk-go/service/sts/doc.go
generated
vendored
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package sts provides the client and types for making API
|
||||||
|
// requests to AWS Security Token Service.
|
||||||
|
//
|
||||||
|
// The AWS Security Token Service (STS) is a web service that enables you to
|
||||||
|
// request temporary, limited-privilege credentials for AWS Identity and Access
|
||||||
|
// Management (IAM) users or for users that you authenticate (federated users).
|
||||||
|
// This guide provides descriptions of the STS API. For more detailed information
|
||||||
|
// about using this service, go to Temporary Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html).
|
||||||
|
//
|
||||||
|
// As an alternative to using the API, you can use one of the AWS SDKs, which
|
||||||
|
// consist of libraries and sample code for various programming languages and
|
||||||
|
// platforms (Java, Ruby, .NET, iOS, Android, etc.). The SDKs provide a convenient
|
||||||
|
// way to create programmatic access to STS. For example, the SDKs take care
|
||||||
|
// of cryptographically signing requests, managing errors, and retrying requests
|
||||||
|
// automatically. For information about the AWS SDKs, including how to download
|
||||||
|
// and install them, see the Tools for Amazon Web Services page (http://aws.amazon.com/tools/).
|
||||||
|
//
|
||||||
|
// For information about setting up signatures and authorization through the
|
||||||
|
// API, go to Signing AWS API Requests (http://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)
|
||||||
|
// in the AWS General Reference. For general information about the Query API,
|
||||||
|
// go to Making Query Requests (http://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html)
|
||||||
|
// in Using IAM. For information about using security tokens with other AWS
|
||||||
|
// products, go to AWS Services That Work with IAM (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)
|
||||||
|
// in the IAM User Guide.
|
||||||
|
//
|
||||||
|
// If you're new to AWS and need additional technical information about a specific
|
||||||
|
// AWS product, you can find the product's technical documentation at http://aws.amazon.com/documentation/
|
||||||
|
// (http://aws.amazon.com/documentation/).
|
||||||
|
//
|
||||||
|
// Endpoints
|
||||||
|
//
|
||||||
|
// The AWS Security Token Service (STS) has a default endpoint of https://sts.amazonaws.com
|
||||||
|
// that maps to the US East (N. Virginia) region. Additional regions are available
|
||||||
|
// and are activated by default. For more information, see Activating 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.
|
||||||
|
//
|
||||||
|
// For information about STS endpoints, see Regions and Endpoints (http://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)
|
||||||
|
// in the AWS General Reference.
|
||||||
|
//
|
||||||
|
// Recording API requests
|
||||||
|
//
|
||||||
|
// STS supports AWS CloudTrail, which is a service that records AWS calls for
|
||||||
|
// your AWS account and delivers log files to an Amazon S3 bucket. By using
|
||||||
|
// information collected by CloudTrail, you can determine what requests were
|
||||||
|
// successfully made to STS, who made the request, when it was made, and so
|
||||||
|
// on. To learn more about CloudTrail, including how to turn it on and find
|
||||||
|
// your log files, see the AWS CloudTrail User Guide (http://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_top_level.html).
|
||||||
|
//
|
||||||
|
// See https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15 for more information on this service.
|
||||||
|
//
|
||||||
|
// See sts package documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/
|
||||||
|
//
|
||||||
|
// Using the Client
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
// These clients are safe to use concurrently.
|
||||||
|
//
|
||||||
|
// See the SDK's documentation for more information on how to use the SDK.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/
|
||||||
|
//
|
||||||
|
// See aws.Config documentation for more information on configuring SDK clients.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
||||||
|
//
|
||||||
|
// See the AWS Security Token Service client STS for more
|
||||||
|
// information on creating client for this service.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/#New
|
||||||
|
package sts
|
73
vendor/github.com/aws/aws-sdk-go/service/sts/errors.go
generated
vendored
Normal file
73
vendor/github.com/aws/aws-sdk-go/service/sts/errors.go
generated
vendored
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package sts
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
// ErrCodeExpiredTokenException for service response error code
|
||||||
|
// "ExpiredTokenException".
|
||||||
|
//
|
||||||
|
// The web identity token that was passed is expired or is not valid. Get a
|
||||||
|
// new identity token from the identity provider and then retry the request.
|
||||||
|
ErrCodeExpiredTokenException = "ExpiredTokenException"
|
||||||
|
|
||||||
|
// ErrCodeIDPCommunicationErrorException for service response error code
|
||||||
|
// "IDPCommunicationError".
|
||||||
|
//
|
||||||
|
// The request could not be fulfilled because the non-AWS identity provider
|
||||||
|
// (IDP) that was asked to verify the incoming identity token could not be reached.
|
||||||
|
// This is often a transient error caused by network conditions. Retry the request
|
||||||
|
// a limited number of times so that you don't exceed the request rate. If the
|
||||||
|
// error persists, the non-AWS identity provider might be down or not responding.
|
||||||
|
ErrCodeIDPCommunicationErrorException = "IDPCommunicationError"
|
||||||
|
|
||||||
|
// ErrCodeIDPRejectedClaimException for service response error code
|
||||||
|
// "IDPRejectedClaim".
|
||||||
|
//
|
||||||
|
// The identity provider (IdP) reported that authentication failed. This might
|
||||||
|
// be because the claim is invalid.
|
||||||
|
//
|
||||||
|
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
|
||||||
|
// can also mean that the claim has expired or has been explicitly revoked.
|
||||||
|
ErrCodeIDPRejectedClaimException = "IDPRejectedClaim"
|
||||||
|
|
||||||
|
// ErrCodeInvalidAuthorizationMessageException for service response error code
|
||||||
|
// "InvalidAuthorizationMessageException".
|
||||||
|
//
|
||||||
|
// The error returned if the message passed to DecodeAuthorizationMessage was
|
||||||
|
// invalid. This can happen if the token contains invalid characters, such as
|
||||||
|
// linebreaks.
|
||||||
|
ErrCodeInvalidAuthorizationMessageException = "InvalidAuthorizationMessageException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidIdentityTokenException for service response error code
|
||||||
|
// "InvalidIdentityToken".
|
||||||
|
//
|
||||||
|
// The web identity token that was passed could not be validated by AWS. Get
|
||||||
|
// a new identity token from the identity provider and then retry the request.
|
||||||
|
ErrCodeInvalidIdentityTokenException = "InvalidIdentityToken"
|
||||||
|
|
||||||
|
// ErrCodeMalformedPolicyDocumentException for service response error code
|
||||||
|
// "MalformedPolicyDocument".
|
||||||
|
//
|
||||||
|
// The request was rejected because the policy document was malformed. The error
|
||||||
|
// message describes the specific error.
|
||||||
|
ErrCodeMalformedPolicyDocumentException = "MalformedPolicyDocument"
|
||||||
|
|
||||||
|
// ErrCodePackedPolicyTooLargeException for service response error code
|
||||||
|
// "PackedPolicyTooLarge".
|
||||||
|
//
|
||||||
|
// The request was rejected because the policy document was too large. The error
|
||||||
|
// message describes how big the policy document is, in packed form, as a percentage
|
||||||
|
// of what the API allows.
|
||||||
|
ErrCodePackedPolicyTooLargeException = "PackedPolicyTooLarge"
|
||||||
|
|
||||||
|
// ErrCodeRegionDisabledException for service response error code
|
||||||
|
// "RegionDisabledException".
|
||||||
|
//
|
||||||
|
// STS is not activated in the requested region for the account that is being
|
||||||
|
// asked to generate credentials. The account administrator must use the IAM
|
||||||
|
// console to activate STS in that region. For more information, see Activating
|
||||||
|
// 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.
|
||||||
|
ErrCodeRegionDisabledException = "RegionDisabledException"
|
||||||
|
)
|
54
vendor/github.com/aws/aws-sdk-go/service/sts/service.go
generated
vendored
54
vendor/github.com/aws/aws-sdk-go/service/sts/service.go
generated
vendored
|
@ -1,4 +1,4 @@
|
||||||
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
package sts
|
package sts
|
||||||
|
|
||||||
|
@ -11,54 +11,12 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/private/protocol/query"
|
"github.com/aws/aws-sdk-go/private/protocol/query"
|
||||||
)
|
)
|
||||||
|
|
||||||
// The AWS Security Token Service (STS) is a web service that enables you to
|
// STS provides the API operation methods for making requests to
|
||||||
// request temporary, limited-privilege credentials for AWS Identity and Access
|
// AWS Security Token Service. See this package's package overview docs
|
||||||
// Management (IAM) users or for users that you authenticate (federated users).
|
// for details on the service.
|
||||||
// This guide provides descriptions of the STS API. For more detailed information
|
|
||||||
// about using this service, go to Temporary Security Credentials (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html).
|
|
||||||
//
|
//
|
||||||
// As an alternative to using the API, you can use one of the AWS SDKs, which
|
// STS methods are safe to use concurrently. It is not safe to
|
||||||
// consist of libraries and sample code for various programming languages and
|
// modify mutate any of the struct's properties though.
|
||||||
// platforms (Java, Ruby, .NET, iOS, Android, etc.). The SDKs provide a convenient
|
|
||||||
// way to create programmatic access to STS. For example, the SDKs take care
|
|
||||||
// of cryptographically signing requests, managing errors, and retrying requests
|
|
||||||
// automatically. For information about the AWS SDKs, including how to download
|
|
||||||
// and install them, see the Tools for Amazon Web Services page (http://aws.amazon.com/tools/).
|
|
||||||
//
|
|
||||||
// For information about setting up signatures and authorization through the
|
|
||||||
// API, go to Signing AWS API Requests (http://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)
|
|
||||||
// in the AWS General Reference. For general information about the Query API,
|
|
||||||
// go to Making Query Requests (http://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html)
|
|
||||||
// in Using IAM. For information about using security tokens with other AWS
|
|
||||||
// products, go to AWS Services That Work with IAM (http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)
|
|
||||||
// in the IAM User Guide.
|
|
||||||
//
|
|
||||||
// If you're new to AWS and need additional technical information about a specific
|
|
||||||
// AWS product, you can find the product's technical documentation at http://aws.amazon.com/documentation/
|
|
||||||
// (http://aws.amazon.com/documentation/).
|
|
||||||
//
|
|
||||||
// Endpoints
|
|
||||||
//
|
|
||||||
// The AWS Security Token Service (STS) has a default endpoint of https://sts.amazonaws.com
|
|
||||||
// that maps to the US East (N. Virginia) region. Additional regions are available
|
|
||||||
// and are activated by default. For more information, see Activating 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.
|
|
||||||
//
|
|
||||||
// For information about STS endpoints, see Regions and Endpoints (http://docs.aws.amazon.com/general/latest/gr/rande.html#sts_region)
|
|
||||||
// in the AWS General Reference.
|
|
||||||
//
|
|
||||||
// Recording API requests
|
|
||||||
//
|
|
||||||
// STS supports AWS CloudTrail, which is a service that records AWS calls for
|
|
||||||
// your AWS account and delivers log files to an Amazon S3 bucket. By using
|
|
||||||
// information collected by CloudTrail, you can determine what requests were
|
|
||||||
// successfully made to STS, who made the request, when it was made, and so
|
|
||||||
// on. To learn more about CloudTrail, including how to turn it on and find
|
|
||||||
// your log files, see the AWS CloudTrail User Guide (http://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_top_level.html).
|
|
||||||
// The service client's operations are safe to be used concurrently.
|
|
||||||
// It is not safe to mutate any of the client's properties though.
|
|
||||||
// Please also see https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15
|
|
||||||
type STS struct {
|
type STS struct {
|
||||||
*client.Client
|
*client.Client
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue