github.com/aavshr/aws-sdk-go@v1.41.3/service/docdb/customizations.go (about)

     1  package docdb
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/aavshr/aws-sdk-go/aws"
     7  	"github.com/aavshr/aws-sdk-go/aws/awsutil"
     8  	"github.com/aavshr/aws-sdk-go/aws/endpoints"
     9  	"github.com/aavshr/aws-sdk-go/aws/request"
    10  )
    11  
    12  func init() {
    13  	ops := []string{
    14  		opCopyDBClusterSnapshot,
    15  		opCreateDBCluster,
    16  	}
    17  	initRequest = func(r *request.Request) {
    18  		for _, operation := range ops {
    19  			if r.Operation.Name == operation {
    20  				r.Handlers.Build.PushFront(fillPresignedURL)
    21  			}
    22  		}
    23  	}
    24  }
    25  
    26  func fillPresignedURL(r *request.Request) {
    27  	fns := map[string]func(r *request.Request){
    28  		opCopyDBClusterSnapshot: copyDBClusterSnapshotPresign,
    29  		opCreateDBCluster:       createDBClusterPresign,
    30  	}
    31  	if !r.ParamsFilled() {
    32  		return
    33  	}
    34  	if f, ok := fns[r.Operation.Name]; ok {
    35  		f(r)
    36  	}
    37  }
    38  
    39  func copyDBClusterSnapshotPresign(r *request.Request) {
    40  	originParams := r.Params.(*CopyDBClusterSnapshotInput)
    41  
    42  	if originParams.SourceRegion == nil || originParams.PreSignedUrl != nil || originParams.DestinationRegion != nil {
    43  		return
    44  	}
    45  
    46  	originParams.DestinationRegion = r.Config.Region
    47  	// preSignedUrl is not required for instances in the same region.
    48  	if *originParams.SourceRegion == *originParams.DestinationRegion {
    49  		return
    50  	}
    51  
    52  	newParams := awsutil.CopyOf(r.Params).(*CopyDBClusterSnapshotInput)
    53  	originParams.PreSignedUrl = presignURL(r, originParams.SourceRegion, newParams)
    54  }
    55  
    56  func createDBClusterPresign(r *request.Request) {
    57  	originParams := r.Params.(*CreateDBClusterInput)
    58  
    59  	if originParams.SourceRegion == nil || originParams.PreSignedUrl != nil || originParams.DestinationRegion != nil {
    60  		return
    61  	}
    62  
    63  	originParams.DestinationRegion = r.Config.Region
    64  	// preSignedUrl is not required for instances in the same region.
    65  	if *originParams.SourceRegion == *originParams.DestinationRegion {
    66  		return
    67  	}
    68  
    69  	newParams := awsutil.CopyOf(r.Params).(*CreateDBClusterInput)
    70  	originParams.PreSignedUrl = presignURL(r, originParams.SourceRegion, newParams)
    71  }
    72  
    73  // presignURL will presign the request by using SoureRegion to sign with. SourceRegion is not
    74  // sent to the service, and is only used to not have the SDKs parsing ARNs.
    75  func presignURL(r *request.Request, sourceRegion *string, newParams interface{}) *string {
    76  	cfg := r.Config.Copy(aws.NewConfig().
    77  		WithEndpoint("").
    78  		WithRegion(aws.StringValue(sourceRegion)))
    79  
    80  	clientInfo := r.ClientInfo
    81  	resolved, err := r.Config.EndpointResolver.EndpointFor(
    82  		EndpointsID, aws.StringValue(cfg.Region),
    83  		func(opt *endpoints.Options) {
    84  			opt.DisableSSL = aws.BoolValue(cfg.DisableSSL)
    85  			opt.UseDualStack = aws.BoolValue(cfg.UseDualStack)
    86  		},
    87  	)
    88  	if err != nil {
    89  		r.Error = err
    90  		return nil
    91  	}
    92  
    93  	clientInfo.Endpoint = resolved.URL
    94  	clientInfo.SigningRegion = resolved.SigningRegion
    95  
    96  	// Presign a request with modified params
    97  	req := request.New(*cfg, clientInfo, r.Handlers, r.Retryer, r.Operation, newParams, r.Data)
    98  	req.Operation.HTTPMethod = "GET"
    99  	uri, err := req.Presign(5 * time.Minute) // 5 minutes should be enough.
   100  	if err != nil {                          // bubble error back up to original request
   101  		r.Error = err
   102  		return nil
   103  	}
   104  
   105  	// We have our URL, set it on params
   106  	return &uri
   107  }