@@ -58,7 +58,7 @@ func (e *SigningError) Unwrap() error {
5858// S3 PutObject API allows unsigned payload signing auth usage when TLS is enabled, and uses this middleware to
5959// dynamically switch between unsigned and signed payload based on TLS state for request.
6060func UseDynamicPayloadSigningMiddleware (stack * middleware.Stack ) error {
61- _ , err := stack .Build .Swap (computePayloadHashMiddlewareID , & dynamicPayloadSigningMiddleware {})
61+ _ , err := stack .Finalize .Swap (computePayloadHashMiddlewareID , & dynamicPayloadSigningMiddleware {})
6262 return err
6363}
6464
@@ -71,24 +71,22 @@ func (m *dynamicPayloadSigningMiddleware) ID() string {
7171 return computePayloadHashMiddlewareID
7272}
7373
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 ,
7778) (
78- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
79+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
7980) {
8081 req , ok := in .Request .(* smithyhttp.Request )
8182 if ! ok {
8283 return out , metadata , fmt .Errorf ("unknown transport type %T" , in .Request )
8384 }
8485
85- // if TLS is enabled, use unsigned payload when supported
8686 if req .IsHTTPS () {
87- return (& unsignedPayload {}).HandleBuild (ctx , in , next )
87+ return (& unsignedPayload {}).HandleFinalize (ctx , in , next )
8888 }
89-
90- // else fall back to signed payload
91- return (& computePayloadSHA256 {}).HandleBuild (ctx , in , next )
89+ return (& computePayloadSHA256 {}).HandleFinalize (ctx , in , next )
9290}
9391
9492// unsignedPayload sets the SigV4 request payload hash to unsigned.
@@ -104,31 +102,24 @@ type unsignedPayload struct{}
104102// AddUnsignedPayloadMiddleware adds unsignedPayload to the operation
105103// middleware stack
106104func AddUnsignedPayloadMiddleware (stack * middleware.Stack ) error {
107- return stack .Build . Add (& unsignedPayload {}, middleware .After )
105+ return stack .Finalize . Insert (& unsignedPayload {}, "ResolveEndpointV2" , middleware .After )
108106}
109107
110108// ID returns the unsignedPayload identifier
111109func (m * unsignedPayload ) ID () string {
112110 return computePayloadHashMiddlewareID
113111}
114112
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 ,
118116) (
119- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
117+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
120118) {
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 )
128121 }
129-
130- ctx = SetPayloadHash (ctx , contentSHA )
131- return next .HandleBuild (ctx , in )
122+ return next .HandleFinalize (ctx , in )
132123}
133124
134125// computePayloadSHA256 computes SHA256 payload hash to sign.
@@ -144,13 +135,13 @@ type computePayloadSHA256 struct{}
144135// AddComputePayloadSHA256Middleware adds computePayloadSHA256 to the
145136// operation middleware stack
146137func AddComputePayloadSHA256Middleware (stack * middleware.Stack ) error {
147- return stack .Build . Add (& computePayloadSHA256 {}, middleware .After )
138+ return stack .Finalize . Insert (& computePayloadSHA256 {}, "ResolveEndpointV2" , middleware .After )
148139}
149140
150141// RemoveComputePayloadSHA256Middleware removes computePayloadSHA256 from the
151142// operation middleware stack
152143func RemoveComputePayloadSHA256Middleware (stack * middleware.Stack ) error {
153- _ , err := stack .Build .Remove (computePayloadHashMiddlewareID )
144+ _ , err := stack .Finalize .Remove (computePayloadHashMiddlewareID )
154145 return err
155146}
156147
@@ -159,27 +150,24 @@ func (m *computePayloadSHA256) ID() string {
159150 return computePayloadHashMiddlewareID
160151}
161152
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 ,
165157) (
166- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
158+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
167159) {
160+ if GetPayloadHash (ctx ) != "" {
161+ return next .HandleFinalize (ctx , in )
162+ }
163+
168164 req , ok := in .Request .(* smithyhttp.Request )
169165 if ! ok {
170166 return out , metadata , & HashComputationError {
171167 Err : fmt .Errorf ("unexpected request middleware type %T" , in .Request ),
172168 }
173169 }
174170
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-
183171 hash := sha256 .New ()
184172 if stream := req .GetStream (); stream != nil {
185173 _ , err = io .Copy (hash , stream )
@@ -198,7 +186,7 @@ func (m *computePayloadSHA256) HandleBuild(
198186
199187 ctx = SetPayloadHash (ctx , hex .EncodeToString (hash .Sum (nil )))
200188
201- return next .HandleBuild (ctx , in )
189+ return next .HandleFinalize (ctx , in )
202190}
203191
204192// SwapComputePayloadSHA256ForUnsignedPayloadMiddleware replaces the
@@ -207,7 +195,7 @@ func (m *computePayloadSHA256) HandleBuild(
207195// Use this to disable computing the Payload SHA256 checksum and instead use
208196// UNSIGNED-PAYLOAD for the SHA256 value.
209197func SwapComputePayloadSHA256ForUnsignedPayloadMiddleware (stack * middleware.Stack ) error {
210- _ , err := stack .Build .Swap (computePayloadHashMiddlewareID , & unsignedPayload {})
198+ _ , err := stack .Finalize .Swap (computePayloadHashMiddlewareID , & unsignedPayload {})
211199 return err
212200}
213201
@@ -218,13 +206,13 @@ type contentSHA256Header struct{}
218206// AddContentSHA256HeaderMiddleware adds ContentSHA256Header to the
219207// operation middleware stack
220208func AddContentSHA256HeaderMiddleware (stack * middleware.Stack ) error {
221- return stack .Build .Insert (& contentSHA256Header {}, computePayloadHashMiddlewareID , middleware .After )
209+ return stack .Finalize .Insert (& contentSHA256Header {}, computePayloadHashMiddlewareID , middleware .After )
222210}
223211
224212// RemoveContentSHA256HeaderMiddleware removes contentSHA256Header middleware
225213// from the operation middleware stack
226214func RemoveContentSHA256HeaderMiddleware (stack * middleware.Stack ) error {
227- _ , err := stack .Build .Remove ((* contentSHA256Header )(nil ).ID ())
215+ _ , err := stack .Finalize .Remove ((* contentSHA256Header )(nil ).ID ())
228216 return err
229217}
230218
@@ -233,21 +221,20 @@ func (m *contentSHA256Header) ID() string {
233221 return "SigV4ContentSHA256Header"
234222}
235223
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
237225// 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 ,
240228) (
241- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
229+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
242230) {
243231 req , ok := in .Request .(* smithyhttp.Request )
244232 if ! ok {
245233 return out , metadata , & HashComputationError {Err : fmt .Errorf ("unexpected request middleware type %T" , in .Request )}
246234 }
247235
248236 req .Header .Set (v4Internal .ContentSHAKey , GetPayloadHash (ctx ))
249-
250- return next .HandleBuild (ctx , in )
237+ return next .HandleFinalize (ctx , in )
251238}
252239
253240// SignHTTPRequestMiddlewareOptions is the configuration options for the SignHTTPRequestMiddleware middleware.
@@ -332,17 +319,17 @@ type streamingEventsPayload struct{}
332319
333320// AddStreamingEventsPayload adds the streamingEventsPayload middleware to the stack.
334321func AddStreamingEventsPayload (stack * middleware.Stack ) error {
335- return stack .Build .Add (& streamingEventsPayload {}, middleware .After )
322+ return stack .Finalize .Add (& streamingEventsPayload {}, middleware .Before )
336323}
337324
338325func (s * streamingEventsPayload ) ID () string {
339326 return computePayloadHashMiddlewareID
340327}
341328
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 ,
344331) (
345- out middleware.BuildOutput , metadata middleware.Metadata , err error ,
332+ out middleware.FinalizeOutput , metadata middleware.Metadata , err error ,
346333) {
347334 contentSHA := GetPayloadHash (ctx )
348335 if len (contentSHA ) == 0 {
@@ -351,7 +338,7 @@ func (s *streamingEventsPayload) HandleBuild(
351338
352339 ctx = SetPayloadHash (ctx , contentSHA )
353340
354- return next .HandleBuild (ctx , in )
341+ return next .HandleFinalize (ctx , in )
355342}
356343
357344// GetSignedRequestSignature attempts to extract the signature of the request.
0 commit comments