package v4a
import (
awsmiddleware
v4
smithyhttp
)
type HTTPSigner interface {
SignHTTP(ctx context.Context, credentials Credentials, r *http.Request, payloadHash string, service string, regionSet []string, signingTime time.Time, optfns ...func(*SignerOptions)) error
}
type SignHTTPRequestMiddlewareOptions struct {
Credentials CredentialsProvider
Signer HTTPSigner
LogSigning bool
}
type SignHTTPRequestMiddleware struct {
credentials CredentialsProvider
signer HTTPSigner
logSigning bool
}
func ( SignHTTPRequestMiddlewareOptions) *SignHTTPRequestMiddleware {
return &SignHTTPRequestMiddleware{
credentials: .Credentials,
signer: .Signer,
logSigning: .LogSigning,
}
}
func ( *SignHTTPRequestMiddleware) () string {
return "Signing"
}
func ( *SignHTTPRequestMiddleware) (
context.Context, middleware.FinalizeInput, middleware.FinalizeHandler,
) (
middleware.FinalizeOutput, middleware.Metadata, error,
) {
if !hasCredentialProvider(.credentials) {
return .HandleFinalize(, )
}
, := .Request.(*smithyhttp.Request)
if ! {
return , , fmt.Errorf("unexpected request middleware type %T", .Request)
}
, := awsmiddleware.GetSigningName(), awsmiddleware.GetSigningRegion()
:= v4.GetPayloadHash()
if len() == 0 {
return , , &SigningError{Err: fmt.Errorf("computed payload hash missing from context")}
}
, := .credentials.RetrievePrivateKey()
if != nil {
return , , &SigningError{Err: fmt.Errorf("failed to retrieve credentials: %w", )}
}
= .signer.SignHTTP(, , .Request, , , []string{}, time.Now().UTC(), func( *SignerOptions) {
.Logger = middleware.GetLogger()
.LogSigning = .logSigning
})
if != nil {
return , , &SigningError{Err: fmt.Errorf("failed to sign http request, %w", )}
}
return .HandleFinalize(, )
}
func ( CredentialsProvider) bool {
if == nil {
return false
}
return true
}
func ( *middleware.Stack, *SignHTTPRequestMiddleware) ( error) {
const = "Signing"
, := .Finalize.Get()
if {
_, = .Finalize.Swap(, )
} else {
= .Finalize.Add(, middleware.After)
}
return
}