mirror of
https://github.com/versity/versitygw.git
synced 2026-01-03 10:35:15 +00:00
54 lines
1.4 KiB
Go
54 lines
1.4 KiB
Go
package smithy
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
|
|
"github.com/aws/smithy-go"
|
|
"github.com/aws/smithy-go/auth"
|
|
"github.com/aws/smithy-go/logging"
|
|
smithyhttp "github.com/aws/smithy-go/transport/http"
|
|
"github.com/versity/versitygw/aws/internal/sdk"
|
|
)
|
|
|
|
// V4SignerAdapter adapts v4.HTTPSigner to smithy http.Signer.
|
|
type V4SignerAdapter struct {
|
|
Signer v4.HTTPSigner
|
|
Logger logging.Logger
|
|
LogSigning bool
|
|
}
|
|
|
|
var _ (smithyhttp.Signer) = (*V4SignerAdapter)(nil)
|
|
|
|
// SignRequest signs the request with the provided identity.
|
|
func (v *V4SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error {
|
|
ca, ok := identity.(*CredentialsAdapter)
|
|
if !ok {
|
|
return fmt.Errorf("unexpected identity type: %T", identity)
|
|
}
|
|
|
|
name, ok := smithyhttp.GetSigV4SigningName(&props)
|
|
if !ok {
|
|
return fmt.Errorf("sigv4 signing name is required")
|
|
}
|
|
|
|
region, ok := smithyhttp.GetSigV4SigningRegion(&props)
|
|
if !ok {
|
|
return fmt.Errorf("sigv4 signing region is required")
|
|
}
|
|
|
|
hash := v4.GetPayloadHash(ctx)
|
|
err := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, region, sdk.NowTime(), func(o *v4.SignerOptions) {
|
|
o.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props)
|
|
|
|
o.Logger = v.Logger
|
|
o.LogSigning = v.LogSigning
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("sign http: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|