@@ -58,7 +58,7 @@ func (e *SigningError) Unwrap() error {
58
58
// S3 PutObject API allows unsigned payload signing auth usage when TLS is enabled, and uses this middleware to
59
59
// dynamically switch between unsigned and signed payload based on TLS state for request.
60
60
func UseDynamicPayloadSigningMiddleware (stack * middleware.Stack ) error {
61
- _ , err := stack .Build .Swap (computePayloadHashMiddlewareID , & dynamicPayloadSigningMiddleware {})
61
+ _ , err := stack .Finalize .Swap (computePayloadHashMiddlewareID , & dynamicPayloadSigningMiddleware {})
62
62
return err
63
63
}
64
64
@@ -71,24 +71,22 @@ func (m *dynamicPayloadSigningMiddleware) ID() string {
71
71
return computePayloadHashMiddlewareID
72
72
}
73
73
74
- // HandleBuild sets a resolver that directs to the payload sha256 compute handler.
75
- func (m * dynamicPayloadSigningMiddleware ) HandleBuild (
76
- ctx context.Context , in middleware.BuildInput , next middleware.BuildHandler ,
74
+ // HandleFinalize delegates SHA256 computation according to whether the request
75
+ // is TLS-enabled.
76
+ func (m * dynamicPayloadSigningMiddleware ) HandleFinalize (
77
+ ctx context.Context , in middleware.FinalizeInput , next middleware.FinalizeHandler ,
77
78
) (
78
- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
79
+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
79
80
) {
80
81
req , ok := in .Request .(* smithyhttp.Request )
81
82
if ! ok {
82
83
return out , metadata , fmt .Errorf ("unknown transport type %T" , in .Request )
83
84
}
84
85
85
- // if TLS is enabled, use unsigned payload when supported
86
86
if req .IsHTTPS () {
87
- return (& unsignedPayload {}).HandleBuild (ctx , in , next )
87
+ return (& unsignedPayload {}).HandleFinalize (ctx , in , next )
88
88
}
89
-
90
- // else fall back to signed payload
91
- return (& computePayloadSHA256 {}).HandleBuild (ctx , in , next )
89
+ return (& computePayloadSHA256 {}).HandleFinalize (ctx , in , next )
92
90
}
93
91
94
92
// unsignedPayload sets the SigV4 request payload hash to unsigned.
@@ -104,31 +102,24 @@ type unsignedPayload struct{}
104
102
// AddUnsignedPayloadMiddleware adds unsignedPayload to the operation
105
103
// middleware stack
106
104
func AddUnsignedPayloadMiddleware (stack * middleware.Stack ) error {
107
- return stack .Build . Add (& unsignedPayload {}, middleware .After )
105
+ return stack .Finalize . Insert (& unsignedPayload {}, "ResolveEndpointV2" , middleware .After )
108
106
}
109
107
110
108
// ID returns the unsignedPayload identifier
111
109
func (m * unsignedPayload ) ID () string {
112
110
return computePayloadHashMiddlewareID
113
111
}
114
112
115
- // HandleBuild sets the payload hash to be an unsigned payload
116
- func (m * unsignedPayload ) HandleBuild (
117
- ctx context.Context , in middleware.BuildInput , next middleware.BuildHandler ,
113
+ // HandleFinalize sets the payload hash magic value to the unsigned sentinel.
114
+ func (m * unsignedPayload ) HandleFinalize (
115
+ ctx context.Context , in middleware.FinalizeInput , next middleware.FinalizeHandler ,
118
116
) (
119
- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
117
+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
120
118
) {
121
- // This should not compute the content SHA256 if the value is already
122
- // known. (e.g. application pre-computed SHA256 before making API call).
123
- // Does not have any tight coupling to the X-Amz-Content-Sha256 header, if
124
- // that header is provided a middleware must translate it into the context.
125
- contentSHA := GetPayloadHash (ctx )
126
- if len (contentSHA ) == 0 {
127
- contentSHA = v4Internal .UnsignedPayload
119
+ if GetPayloadHash (ctx ) == "" {
120
+ ctx = SetPayloadHash (ctx , v4Internal .UnsignedPayload )
128
121
}
129
-
130
- ctx = SetPayloadHash (ctx , contentSHA )
131
- return next .HandleBuild (ctx , in )
122
+ return next .HandleFinalize (ctx , in )
132
123
}
133
124
134
125
// computePayloadSHA256 computes SHA256 payload hash to sign.
@@ -144,13 +135,13 @@ type computePayloadSHA256 struct{}
144
135
// AddComputePayloadSHA256Middleware adds computePayloadSHA256 to the
145
136
// operation middleware stack
146
137
func AddComputePayloadSHA256Middleware (stack * middleware.Stack ) error {
147
- return stack .Build . Add (& computePayloadSHA256 {}, middleware .After )
138
+ return stack .Finalize . Insert (& computePayloadSHA256 {}, "ResolveEndpointV2" , middleware .After )
148
139
}
149
140
150
141
// RemoveComputePayloadSHA256Middleware removes computePayloadSHA256 from the
151
142
// operation middleware stack
152
143
func RemoveComputePayloadSHA256Middleware (stack * middleware.Stack ) error {
153
- _ , err := stack .Build .Remove (computePayloadHashMiddlewareID )
144
+ _ , err := stack .Finalize .Remove (computePayloadHashMiddlewareID )
154
145
return err
155
146
}
156
147
@@ -159,27 +150,24 @@ func (m *computePayloadSHA256) ID() string {
159
150
return computePayloadHashMiddlewareID
160
151
}
161
152
162
- // HandleBuild compute the payload hash for the request payload
163
- func (m * computePayloadSHA256 ) HandleBuild (
164
- ctx context.Context , in middleware.BuildInput , next middleware.BuildHandler ,
153
+ // HandleFinalize computes the payload hash for the request, storing it to the
154
+ // context. This is a no-op if a caller has previously set that value.
155
+ func (m * computePayloadSHA256 ) HandleFinalize (
156
+ ctx context.Context , in middleware.FinalizeInput , next middleware.FinalizeHandler ,
165
157
) (
166
- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
158
+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
167
159
) {
160
+ if GetPayloadHash (ctx ) != "" {
161
+ return next .HandleFinalize (ctx , in )
162
+ }
163
+
168
164
req , ok := in .Request .(* smithyhttp.Request )
169
165
if ! ok {
170
166
return out , metadata , & HashComputationError {
171
167
Err : fmt .Errorf ("unexpected request middleware type %T" , in .Request ),
172
168
}
173
169
}
174
170
175
- // This should not compute the content SHA256 if the value is already
176
- // known. (e.g. application pre-computed SHA256 before making API call)
177
- // Does not have any tight coupling to the X-Amz-Content-Sha256 header, if
178
- // that header is provided a middleware must translate it into the context.
179
- if contentSHA := GetPayloadHash (ctx ); len (contentSHA ) != 0 {
180
- return next .HandleBuild (ctx , in )
181
- }
182
-
183
171
hash := sha256 .New ()
184
172
if stream := req .GetStream (); stream != nil {
185
173
_ , err = io .Copy (hash , stream )
@@ -198,7 +186,7 @@ func (m *computePayloadSHA256) HandleBuild(
198
186
199
187
ctx = SetPayloadHash (ctx , hex .EncodeToString (hash .Sum (nil )))
200
188
201
- return next .HandleBuild (ctx , in )
189
+ return next .HandleFinalize (ctx , in )
202
190
}
203
191
204
192
// SwapComputePayloadSHA256ForUnsignedPayloadMiddleware replaces the
@@ -207,7 +195,7 @@ func (m *computePayloadSHA256) HandleBuild(
207
195
// Use this to disable computing the Payload SHA256 checksum and instead use
208
196
// UNSIGNED-PAYLOAD for the SHA256 value.
209
197
func SwapComputePayloadSHA256ForUnsignedPayloadMiddleware (stack * middleware.Stack ) error {
210
- _ , err := stack .Build .Swap (computePayloadHashMiddlewareID , & unsignedPayload {})
198
+ _ , err := stack .Finalize .Swap (computePayloadHashMiddlewareID , & unsignedPayload {})
211
199
return err
212
200
}
213
201
@@ -218,13 +206,13 @@ type contentSHA256Header struct{}
218
206
// AddContentSHA256HeaderMiddleware adds ContentSHA256Header to the
219
207
// operation middleware stack
220
208
func AddContentSHA256HeaderMiddleware (stack * middleware.Stack ) error {
221
- return stack .Build .Insert (& contentSHA256Header {}, computePayloadHashMiddlewareID , middleware .After )
209
+ return stack .Finalize .Insert (& contentSHA256Header {}, computePayloadHashMiddlewareID , middleware .After )
222
210
}
223
211
224
212
// RemoveContentSHA256HeaderMiddleware removes contentSHA256Header middleware
225
213
// from the operation middleware stack
226
214
func RemoveContentSHA256HeaderMiddleware (stack * middleware.Stack ) error {
227
- _ , err := stack .Build .Remove ((* contentSHA256Header )(nil ).ID ())
215
+ _ , err := stack .Finalize .Remove ((* contentSHA256Header )(nil ).ID ())
228
216
return err
229
217
}
230
218
@@ -233,21 +221,20 @@ func (m *contentSHA256Header) ID() string {
233
221
return "SigV4ContentSHA256Header"
234
222
}
235
223
236
- // HandleBuild sets the X-Amz-Content-Sha256 header value to the Payload hash
224
+ // HandleFinalize sets the X-Amz-Content-Sha256 header value to the Payload hash
237
225
// stored in the context.
238
- func (m * contentSHA256Header ) HandleBuild (
239
- ctx context.Context , in middleware.BuildInput , next middleware.BuildHandler ,
226
+ func (m * contentSHA256Header ) HandleFinalize (
227
+ ctx context.Context , in middleware.FinalizeInput , next middleware.FinalizeHandler ,
240
228
) (
241
- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
229
+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
242
230
) {
243
231
req , ok := in .Request .(* smithyhttp.Request )
244
232
if ! ok {
245
233
return out , metadata , & HashComputationError {Err : fmt .Errorf ("unexpected request middleware type %T" , in .Request )}
246
234
}
247
235
248
236
req .Header .Set (v4Internal .ContentSHAKey , GetPayloadHash (ctx ))
249
-
250
- return next .HandleBuild (ctx , in )
237
+ return next .HandleFinalize (ctx , in )
251
238
}
252
239
253
240
// SignHTTPRequestMiddlewareOptions is the configuration options for the SignHTTPRequestMiddleware middleware.
@@ -332,17 +319,17 @@ type streamingEventsPayload struct{}
332
319
333
320
// AddStreamingEventsPayload adds the streamingEventsPayload middleware to the stack.
334
321
func AddStreamingEventsPayload (stack * middleware.Stack ) error {
335
- return stack .Build .Add (& streamingEventsPayload {}, middleware .After )
322
+ return stack .Finalize .Add (& streamingEventsPayload {}, middleware .Before )
336
323
}
337
324
338
325
func (s * streamingEventsPayload ) ID () string {
339
326
return computePayloadHashMiddlewareID
340
327
}
341
328
342
- func (s * streamingEventsPayload ) HandleBuild (
343
- ctx context.Context , in middleware.BuildInput , next middleware.BuildHandler ,
329
+ func (s * streamingEventsPayload ) HandleFinalize (
330
+ ctx context.Context , in middleware.FinalizeInput , next middleware.FinalizeHandler ,
344
331
) (
345
- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
332
+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
346
333
) {
347
334
contentSHA := GetPayloadHash (ctx )
348
335
if len (contentSHA ) == 0 {
@@ -351,7 +338,7 @@ func (s *streamingEventsPayload) HandleBuild(
351
338
352
339
ctx = SetPayloadHash (ctx , contentSHA )
353
340
354
- return next .HandleBuild (ctx , in )
341
+ return next .HandleFinalize (ctx , in )
355
342
}
356
343
357
344
// GetSignedRequestSignature attempts to extract the signature of the request.
0 commit comments