package presignedurl
import (
awsmiddleware
v4
)
type URLPresigner interface {
PresignURL(ctx context.Context, srcRegion string, params interface{}) (*v4.PresignedHTTPRequest, error)
}
type ParameterAccessor struct {
GetPresignedURL func(interface{}) (string, bool, error)
GetSourceRegion func(interface{}) (string, bool, error)
CopyInput func(interface{}) (interface{}, error)
SetDestinationRegion func(interface{}, string) error
SetPresignedURL func(interface{}, string) error
}
type Options struct {
Accessor ParameterAccessor
Presigner URLPresigner
}
func ( *middleware.Stack, Options) error {
return .Initialize.Add(&presign{options: }, middleware.Before)
}
func ( *middleware.Stack) error {
, := .Initialize.Remove((*presign)(nil).ID())
return
}
type presign struct {
options Options
}
func ( *presign) () string { return "Presign" }
func ( *presign) (
context.Context, middleware.InitializeInput, middleware.InitializeHandler,
) (
middleware.InitializeOutput, middleware.Metadata, error,
) {
if , , := .options.Accessor.GetPresignedURL(.Parameters); != nil {
return , , fmt.Errorf("presign middleware failed, %w", )
} else if {
return .HandleInitialize(, )
}
, , := .options.Accessor.GetSourceRegion(.Parameters)
if != nil {
return , , fmt.Errorf("presign middleware failed, %w", )
} else if ! || len() == 0 {
return .HandleInitialize(, )
}
, := .options.Accessor.CopyInput(.Parameters)
if != nil {
return , , fmt.Errorf("unable to create presigned URL, %w", )
}
:= awsmiddleware.GetRegion()
if = .options.Accessor.SetDestinationRegion(, ); != nil {
return , , fmt.Errorf("presign middleware failed, %w", )
}
, := .options.Presigner.PresignURL(, , )
if != nil {
return , , fmt.Errorf("unable to create presigned URL, %w", )
}
if = .options.Accessor.SetPresignedURL(.Parameters, .URL); != nil {
return , , fmt.Errorf("presign middleware failed, %w", )
}
return .HandleInitialize(, )
}