forked from aws/aws-sdk-go-v2
/
customizations.go
119 lines (98 loc) · 3.72 KB
/
customizations.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package rds
import (
"time"
"github.com/aws/aws-sdk-go-v2/aws"
request "github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/internal/awsutil"
)
func init() {
ops := []string{
opCopyDBSnapshot,
opCreateDBInstanceReadReplica,
opCopyDBClusterSnapshot,
opCreateDBCluster,
}
initRequest = func(c *RDS, r *request.Request) {
for _, operation := range ops {
if r.Operation.Name == operation {
r.Handlers.Build.PushFront(fillPresignedURL)
}
}
}
}
func fillPresignedURL(r *request.Request) {
fns := map[string]func(r *request.Request){
opCopyDBSnapshot: copyDBSnapshotPresign,
opCreateDBInstanceReadReplica: createDBInstanceReadReplicaPresign,
opCopyDBClusterSnapshot: copyDBClusterSnapshotPresign,
opCreateDBCluster: createDBClusterPresign,
}
if !r.ParamsFilled() {
return
}
if f, ok := fns[r.Operation.Name]; ok {
f(r)
}
}
func copyDBSnapshotPresign(r *request.Request) {
originParams := r.Params.(*CopyDBSnapshotInput)
if originParams.SourceRegion == nil || originParams.PreSignedUrl != nil || originParams.DestinationRegion != nil {
return
}
originParams.DestinationRegion = aws.String(r.Config.Region)
newParams := awsutil.CopyOf(r.Params).(*CopyDBSnapshotInput)
originParams.PreSignedUrl = presignURL(r, originParams.SourceRegion, newParams)
}
func createDBInstanceReadReplicaPresign(r *request.Request) {
originParams := r.Params.(*CreateDBInstanceReadReplicaInput)
if originParams.SourceRegion == nil || originParams.PreSignedUrl != nil || originParams.DestinationRegion != nil {
return
}
originParams.DestinationRegion = aws.String(r.Config.Region)
newParams := awsutil.CopyOf(r.Params).(*CreateDBInstanceReadReplicaInput)
originParams.PreSignedUrl = presignURL(r, originParams.SourceRegion, newParams)
}
func copyDBClusterSnapshotPresign(r *request.Request) {
originParams := r.Params.(*CopyDBClusterSnapshotInput)
if originParams.SourceRegion == nil || originParams.PreSignedUrl != nil || originParams.DestinationRegion != nil {
return
}
originParams.DestinationRegion = aws.String(r.Config.Region)
newParams := awsutil.CopyOf(r.Params).(*CopyDBClusterSnapshotInput)
originParams.PreSignedUrl = presignURL(r, originParams.SourceRegion, newParams)
}
func createDBClusterPresign(r *request.Request) {
originParams := r.Params.(*CreateDBClusterInput)
if originParams.SourceRegion == nil || originParams.PreSignedUrl != nil || originParams.DestinationRegion != nil {
return
}
originParams.DestinationRegion = aws.String(r.Config.Region)
newParams := awsutil.CopyOf(r.Params).(*CreateDBClusterInput)
originParams.PreSignedUrl = presignURL(r, originParams.SourceRegion, newParams)
}
// presignURL will presign the request by using SoureRegion to sign with. SourceRegion is not
// sent to the service, and is only used to not have the SDKs parsing ARNs.
func presignURL(r *request.Request, sourceRegion *string, newParams interface{}) *string {
cfgCp := r.Config.Copy()
cfgCp.EndpointResolver = nil
cfgCp.Region = aws.StringValue(sourceRegion)
metadata := r.Metadata
resolved, err := r.Config.EndpointResolver.ResolveEndpoint(metadata.ServiceName, cfgCp.Region)
if err != nil {
r.Error = err
return nil
}
cfgCp.EndpointResolver = aws.ResolveWithEndpoint(resolved)
metadata.Endpoint = resolved.URL
metadata.SigningRegion = resolved.SigningRegion
// Presign a request with modified params
req := request.New(cfgCp, metadata, r.Handlers, r.Retryer, r.Operation, newParams, r.Data)
req.Operation.HTTPMethod = "GET"
uri, err := req.Presign(5 * time.Minute) // 5 minutes should be enough.
if err != nil { // bubble error back up to original request
r.Error = err
return nil
}
// We have our URL, set it on params
return &uri
}