src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

api_client.go (30261B)


      1 // Code generated by smithy-go-codegen DO NOT EDIT.
      2 
      3 package sso
      4 
      5 import (
      6 	"context"
      7 	"errors"
      8 	"fmt"
      9 	"github.com/aws/aws-sdk-go-v2/aws"
     10 	"github.com/aws/aws-sdk-go-v2/aws/defaults"
     11 	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
     12 	"github.com/aws/aws-sdk-go-v2/aws/retry"
     13 	"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
     14 	awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
     15 	internalauth "github.com/aws/aws-sdk-go-v2/internal/auth"
     16 	internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy"
     17 	internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources"
     18 	internalmiddleware "github.com/aws/aws-sdk-go-v2/internal/middleware"
     19 	smithy "github.com/aws/smithy-go"
     20 	smithyauth "github.com/aws/smithy-go/auth"
     21 	smithydocument "github.com/aws/smithy-go/document"
     22 	"github.com/aws/smithy-go/logging"
     23 	"github.com/aws/smithy-go/metrics"
     24 	"github.com/aws/smithy-go/middleware"
     25 	"github.com/aws/smithy-go/tracing"
     26 	smithyhttp "github.com/aws/smithy-go/transport/http"
     27 	"net"
     28 	"net/http"
     29 	"sync/atomic"
     30 	"time"
     31 )
     32 
     33 const ServiceID = "SSO"
     34 const ServiceAPIVersion = "2019-06-10"
     35 
     36 type operationMetrics struct {
     37 	Duration                metrics.Float64Histogram
     38 	SerializeDuration       metrics.Float64Histogram
     39 	ResolveIdentityDuration metrics.Float64Histogram
     40 	ResolveEndpointDuration metrics.Float64Histogram
     41 	SignRequestDuration     metrics.Float64Histogram
     42 	DeserializeDuration     metrics.Float64Histogram
     43 }
     44 
     45 func (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram {
     46 	switch name {
     47 	case "client.call.duration":
     48 		return m.Duration
     49 	case "client.call.serialization_duration":
     50 		return m.SerializeDuration
     51 	case "client.call.resolve_identity_duration":
     52 		return m.ResolveIdentityDuration
     53 	case "client.call.resolve_endpoint_duration":
     54 		return m.ResolveEndpointDuration
     55 	case "client.call.signing_duration":
     56 		return m.SignRequestDuration
     57 	case "client.call.deserialization_duration":
     58 		return m.DeserializeDuration
     59 	default:
     60 		panic("unrecognized operation metric")
     61 	}
     62 }
     63 
     64 func timeOperationMetric[T any](
     65 	ctx context.Context, metric string, fn func() (T, error),
     66 	opts ...metrics.RecordMetricOption,
     67 ) (T, error) {
     68 	instr := getOperationMetrics(ctx).histogramFor(metric)
     69 	opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)
     70 
     71 	start := time.Now()
     72 	v, err := fn()
     73 	end := time.Now()
     74 
     75 	elapsed := end.Sub(start)
     76 	instr.Record(ctx, float64(elapsed)/1e9, opts...)
     77 	return v, err
     78 }
     79 
     80 func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() {
     81 	instr := getOperationMetrics(ctx).histogramFor(metric)
     82 	opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)
     83 
     84 	var ended bool
     85 	start := time.Now()
     86 	return func() {
     87 		if ended {
     88 			return
     89 		}
     90 		ended = true
     91 
     92 		end := time.Now()
     93 
     94 		elapsed := end.Sub(start)
     95 		instr.Record(ctx, float64(elapsed)/1e9, opts...)
     96 	}
     97 }
     98 
     99 func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption {
    100 	return func(o *metrics.RecordMetricOptions) {
    101 		o.Properties.Set("rpc.service", middleware.GetServiceID(ctx))
    102 		o.Properties.Set("rpc.method", middleware.GetOperationName(ctx))
    103 	}
    104 }
    105 
    106 type operationMetricsKey struct{}
    107 
    108 func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) {
    109 	meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/sso")
    110 	om := &operationMetrics{}
    111 
    112 	var err error
    113 
    114 	om.Duration, err = operationMetricTimer(meter, "client.call.duration",
    115 		"Overall call duration (including retries and time to send or receive request and response body)")
    116 	if err != nil {
    117 		return nil, err
    118 	}
    119 	om.SerializeDuration, err = operationMetricTimer(meter, "client.call.serialization_duration",
    120 		"The time it takes to serialize a message body")
    121 	if err != nil {
    122 		return nil, err
    123 	}
    124 	om.ResolveIdentityDuration, err = operationMetricTimer(meter, "client.call.auth.resolve_identity_duration",
    125 		"The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider")
    126 	if err != nil {
    127 		return nil, err
    128 	}
    129 	om.ResolveEndpointDuration, err = operationMetricTimer(meter, "client.call.resolve_endpoint_duration",
    130 		"The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request")
    131 	if err != nil {
    132 		return nil, err
    133 	}
    134 	om.SignRequestDuration, err = operationMetricTimer(meter, "client.call.auth.signing_duration",
    135 		"The time it takes to sign a request")
    136 	if err != nil {
    137 		return nil, err
    138 	}
    139 	om.DeserializeDuration, err = operationMetricTimer(meter, "client.call.deserialization_duration",
    140 		"The time it takes to deserialize a message body")
    141 	if err != nil {
    142 		return nil, err
    143 	}
    144 
    145 	return context.WithValue(parent, operationMetricsKey{}, om), nil
    146 }
    147 
    148 func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) {
    149 	return m.Float64Histogram(name, func(o *metrics.InstrumentOptions) {
    150 		o.UnitLabel = "s"
    151 		o.Description = desc
    152 	})
    153 }
    154 
    155 func getOperationMetrics(ctx context.Context) *operationMetrics {
    156 	return ctx.Value(operationMetricsKey{}).(*operationMetrics)
    157 }
    158 
    159 func operationTracer(p tracing.TracerProvider) tracing.Tracer {
    160 	return p.Tracer("github.com/aws/aws-sdk-go-v2/service/sso")
    161 }
    162 
    163 // Client provides the API client to make operations call for AWS Single Sign-On.
    164 type Client struct {
    165 	options Options
    166 
    167 	// Difference between the time reported by the server and the client
    168 	timeOffset *atomic.Int64
    169 }
    170 
    171 // New returns an initialized Client based on the functional options. Provide
    172 // additional functional options to further configure the behavior of the client,
    173 // such as changing the client's endpoint or adding custom middleware behavior.
    174 func New(options Options, optFns ...func(*Options)) *Client {
    175 	options = options.Copy()
    176 
    177 	resolveDefaultLogger(&options)
    178 
    179 	setResolvedDefaultsMode(&options)
    180 
    181 	resolveRetryer(&options)
    182 
    183 	resolveHTTPClient(&options)
    184 
    185 	resolveHTTPSignerV4(&options)
    186 
    187 	resolveEndpointResolverV2(&options)
    188 
    189 	resolveTracerProvider(&options)
    190 
    191 	resolveMeterProvider(&options)
    192 
    193 	resolveAuthSchemeResolver(&options)
    194 
    195 	for _, fn := range optFns {
    196 		fn(&options)
    197 	}
    198 
    199 	finalizeRetryMaxAttempts(&options)
    200 
    201 	ignoreAnonymousAuth(&options)
    202 
    203 	wrapWithAnonymousAuth(&options)
    204 
    205 	resolveAuthSchemes(&options)
    206 
    207 	client := &Client{
    208 		options: options,
    209 	}
    210 
    211 	initializeTimeOffsetResolver(client)
    212 
    213 	return client
    214 }
    215 
    216 // Options returns a copy of the client configuration.
    217 //
    218 // Callers SHOULD NOT perform mutations on any inner structures within client
    219 // config. Config overrides should instead be made on a per-operation basis through
    220 // functional options.
    221 func (c *Client) Options() Options {
    222 	return c.options.Copy()
    223 }
    224 
    225 func (c *Client) invokeOperation(
    226 	ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error,
    227 ) (
    228 	result interface{}, metadata middleware.Metadata, err error,
    229 ) {
    230 	ctx = middleware.ClearStackValues(ctx)
    231 	ctx = middleware.WithServiceID(ctx, ServiceID)
    232 	ctx = middleware.WithOperationName(ctx, opID)
    233 
    234 	stack := middleware.NewStack(opID, smithyhttp.NewStackRequest)
    235 	options := c.options.Copy()
    236 
    237 	for _, fn := range optFns {
    238 		fn(&options)
    239 	}
    240 
    241 	finalizeOperationRetryMaxAttempts(&options, *c)
    242 
    243 	finalizeClientEndpointResolverOptions(&options)
    244 
    245 	for _, fn := range stackFns {
    246 		if err := fn(stack, options); err != nil {
    247 			return nil, metadata, err
    248 		}
    249 	}
    250 
    251 	for _, fn := range options.APIOptions {
    252 		if err := fn(stack); err != nil {
    253 			return nil, metadata, err
    254 		}
    255 	}
    256 
    257 	ctx, err = withOperationMetrics(ctx, options.MeterProvider)
    258 	if err != nil {
    259 		return nil, metadata, err
    260 	}
    261 
    262 	tracer := operationTracer(options.TracerProvider)
    263 	spanName := fmt.Sprintf("%s.%s", ServiceID, opID)
    264 
    265 	ctx = tracing.WithOperationTracer(ctx, tracer)
    266 
    267 	ctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) {
    268 		o.Kind = tracing.SpanKindClient
    269 		o.Properties.Set("rpc.system", "aws-api")
    270 		o.Properties.Set("rpc.method", opID)
    271 		o.Properties.Set("rpc.service", ServiceID)
    272 	})
    273 	endTimer := startMetricTimer(ctx, "client.call.duration")
    274 	defer endTimer()
    275 	defer span.End()
    276 
    277 	handler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) {
    278 		o.Meter = options.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/sso")
    279 	})
    280 	decorated := middleware.DecorateHandler(handler, stack)
    281 	result, metadata, err = decorated.Handle(ctx, params)
    282 	if err != nil {
    283 		span.SetProperty("exception.type", fmt.Sprintf("%T", err))
    284 		span.SetProperty("exception.message", err.Error())
    285 
    286 		var aerr smithy.APIError
    287 		if errors.As(err, &aerr) {
    288 			span.SetProperty("api.error_code", aerr.ErrorCode())
    289 			span.SetProperty("api.error_message", aerr.ErrorMessage())
    290 			span.SetProperty("api.error_fault", aerr.ErrorFault().String())
    291 		}
    292 
    293 		err = &smithy.OperationError{
    294 			ServiceID:     ServiceID,
    295 			OperationName: opID,
    296 			Err:           err,
    297 		}
    298 	}
    299 
    300 	span.SetProperty("error", err != nil)
    301 	if err == nil {
    302 		span.SetStatus(tracing.SpanStatusOK)
    303 	} else {
    304 		span.SetStatus(tracing.SpanStatusError)
    305 	}
    306 
    307 	return result, metadata, err
    308 }
    309 
    310 type operationInputKey struct{}
    311 
    312 func setOperationInput(ctx context.Context, input interface{}) context.Context {
    313 	return middleware.WithStackValue(ctx, operationInputKey{}, input)
    314 }
    315 
    316 func getOperationInput(ctx context.Context) interface{} {
    317 	return middleware.GetStackValue(ctx, operationInputKey{})
    318 }
    319 
    320 type setOperationInputMiddleware struct {
    321 }
    322 
    323 func (*setOperationInputMiddleware) ID() string {
    324 	return "setOperationInput"
    325 }
    326 
    327 func (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (
    328 	out middleware.SerializeOutput, metadata middleware.Metadata, err error,
    329 ) {
    330 	ctx = setOperationInput(ctx, in.Parameters)
    331 	return next.HandleSerialize(ctx, in)
    332 }
    333 
    334 func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {
    335 	if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {
    336 		return fmt.Errorf("add ResolveAuthScheme: %w", err)
    337 	}
    338 	if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil {
    339 		return fmt.Errorf("add GetIdentity: %v", err)
    340 	}
    341 	if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil {
    342 		return fmt.Errorf("add ResolveEndpointV2: %v", err)
    343 	}
    344 	if err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, "ResolveEndpointV2", middleware.After); err != nil {
    345 		return fmt.Errorf("add Signing: %w", err)
    346 	}
    347 	return nil
    348 }
    349 func resolveAuthSchemeResolver(options *Options) {
    350 	if options.AuthSchemeResolver == nil {
    351 		options.AuthSchemeResolver = &defaultAuthSchemeResolver{}
    352 	}
    353 }
    354 
    355 func resolveAuthSchemes(options *Options) {
    356 	if options.AuthSchemes == nil {
    357 		options.AuthSchemes = []smithyhttp.AuthScheme{
    358 			internalauth.NewHTTPAuthScheme("aws.auth#sigv4", &internalauthsmithy.V4SignerAdapter{
    359 				Signer:     options.HTTPSignerV4,
    360 				Logger:     options.Logger,
    361 				LogSigning: options.ClientLogMode.IsSigning(),
    362 			}),
    363 		}
    364 	}
    365 }
    366 
    367 type noSmithyDocumentSerde = smithydocument.NoSerde
    368 
    369 type legacyEndpointContextSetter struct {
    370 	LegacyResolver EndpointResolver
    371 }
    372 
    373 func (*legacyEndpointContextSetter) ID() string {
    374 	return "legacyEndpointContextSetter"
    375 }
    376 
    377 func (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (
    378 	out middleware.InitializeOutput, metadata middleware.Metadata, err error,
    379 ) {
    380 	if m.LegacyResolver != nil {
    381 		ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true)
    382 	}
    383 
    384 	return next.HandleInitialize(ctx, in)
    385 
    386 }
    387 func addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error {
    388 	return stack.Initialize.Add(&legacyEndpointContextSetter{
    389 		LegacyResolver: o.EndpointResolver,
    390 	}, middleware.Before)
    391 }
    392 
    393 func resolveDefaultLogger(o *Options) {
    394 	if o.Logger != nil {
    395 		return
    396 	}
    397 	o.Logger = logging.Nop{}
    398 }
    399 
    400 func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {
    401 	return middleware.AddSetLoggerMiddleware(stack, o.Logger)
    402 }
    403 
    404 func setResolvedDefaultsMode(o *Options) {
    405 	if len(o.resolvedDefaultsMode) > 0 {
    406 		return
    407 	}
    408 
    409 	var mode aws.DefaultsMode
    410 	mode.SetFromString(string(o.DefaultsMode))
    411 
    412 	if mode == aws.DefaultsModeAuto {
    413 		mode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment)
    414 	}
    415 
    416 	o.resolvedDefaultsMode = mode
    417 }
    418 
    419 // NewFromConfig returns a new client from the provided config.
    420 func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {
    421 	opts := Options{
    422 		Region:               cfg.Region,
    423 		DefaultsMode:         cfg.DefaultsMode,
    424 		RuntimeEnvironment:   cfg.RuntimeEnvironment,
    425 		HTTPClient:           cfg.HTTPClient,
    426 		Credentials:          cfg.Credentials,
    427 		APIOptions:           cfg.APIOptions,
    428 		Logger:               cfg.Logger,
    429 		ClientLogMode:        cfg.ClientLogMode,
    430 		AppID:                cfg.AppID,
    431 		AuthSchemePreference: cfg.AuthSchemePreference,
    432 	}
    433 	resolveAWSRetryerProvider(cfg, &opts)
    434 	resolveAWSRetryMaxAttempts(cfg, &opts)
    435 	resolveAWSRetryMode(cfg, &opts)
    436 	resolveAWSEndpointResolver(cfg, &opts)
    437 	resolveInterceptors(cfg, &opts)
    438 	resolveUseDualStackEndpoint(cfg, &opts)
    439 	resolveUseFIPSEndpoint(cfg, &opts)
    440 	resolveBaseEndpoint(cfg, &opts)
    441 	return New(opts, func(o *Options) {
    442 		for _, opt := range cfg.ServiceOptions {
    443 			opt(ServiceID, o)
    444 		}
    445 		for _, opt := range optFns {
    446 			opt(o)
    447 		}
    448 	})
    449 }
    450 
    451 func resolveHTTPClient(o *Options) {
    452 	var buildable *awshttp.BuildableClient
    453 
    454 	if o.HTTPClient != nil {
    455 		var ok bool
    456 		buildable, ok = o.HTTPClient.(*awshttp.BuildableClient)
    457 		if !ok {
    458 			return
    459 		}
    460 	} else {
    461 		buildable = awshttp.NewBuildableClient()
    462 	}
    463 
    464 	modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)
    465 	if err == nil {
    466 		buildable = buildable.WithDialerOptions(func(dialer *net.Dialer) {
    467 			if dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok {
    468 				dialer.Timeout = dialerTimeout
    469 			}
    470 		})
    471 
    472 		buildable = buildable.WithTransportOptions(func(transport *http.Transport) {
    473 			if tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok {
    474 				transport.TLSHandshakeTimeout = tlsHandshakeTimeout
    475 			}
    476 		})
    477 	}
    478 
    479 	o.HTTPClient = buildable
    480 }
    481 
    482 func resolveRetryer(o *Options) {
    483 	if o.Retryer != nil {
    484 		return
    485 	}
    486 
    487 	if len(o.RetryMode) == 0 {
    488 		modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)
    489 		if err == nil {
    490 			o.RetryMode = modeConfig.RetryMode
    491 		}
    492 	}
    493 	if len(o.RetryMode) == 0 {
    494 		o.RetryMode = aws.RetryModeStandard
    495 	}
    496 
    497 	var standardOptions []func(*retry.StandardOptions)
    498 	if v := o.RetryMaxAttempts; v != 0 {
    499 		standardOptions = append(standardOptions, func(so *retry.StandardOptions) {
    500 			so.MaxAttempts = v
    501 		})
    502 	}
    503 
    504 	switch o.RetryMode {
    505 	case aws.RetryModeAdaptive:
    506 		var adaptiveOptions []func(*retry.AdaptiveModeOptions)
    507 		if len(standardOptions) != 0 {
    508 			adaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) {
    509 				ao.StandardOptions = append(ao.StandardOptions, standardOptions...)
    510 			})
    511 		}
    512 		o.Retryer = retry.NewAdaptiveMode(adaptiveOptions...)
    513 
    514 	default:
    515 		o.Retryer = retry.NewStandard(standardOptions...)
    516 	}
    517 }
    518 
    519 func resolveAWSRetryerProvider(cfg aws.Config, o *Options) {
    520 	if cfg.Retryer == nil {
    521 		return
    522 	}
    523 	o.Retryer = cfg.Retryer()
    524 }
    525 
    526 func resolveAWSRetryMode(cfg aws.Config, o *Options) {
    527 	if len(cfg.RetryMode) == 0 {
    528 		return
    529 	}
    530 	o.RetryMode = cfg.RetryMode
    531 }
    532 func resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) {
    533 	if cfg.RetryMaxAttempts == 0 {
    534 		return
    535 	}
    536 	o.RetryMaxAttempts = cfg.RetryMaxAttempts
    537 }
    538 
    539 func finalizeRetryMaxAttempts(o *Options) {
    540 	if o.RetryMaxAttempts == 0 {
    541 		return
    542 	}
    543 
    544 	o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)
    545 }
    546 
    547 func finalizeOperationRetryMaxAttempts(o *Options, client Client) {
    548 	if v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts {
    549 		return
    550 	}
    551 
    552 	o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)
    553 }
    554 
    555 func resolveAWSEndpointResolver(cfg aws.Config, o *Options) {
    556 	if cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil {
    557 		return
    558 	}
    559 	o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions)
    560 }
    561 
    562 func resolveInterceptors(cfg aws.Config, o *Options) {
    563 	o.Interceptors = cfg.Interceptors.Copy()
    564 }
    565 
    566 func addClientUserAgent(stack *middleware.Stack, options Options) error {
    567 	ua, err := getOrAddRequestUserAgent(stack)
    568 	if err != nil {
    569 		return err
    570 	}
    571 
    572 	ua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, "sso", goModuleVersion)
    573 	if len(options.AppID) > 0 {
    574 		ua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID)
    575 	}
    576 
    577 	return nil
    578 }
    579 
    580 func getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) {
    581 	id := (*awsmiddleware.RequestUserAgent)(nil).ID()
    582 	mw, ok := stack.Build.Get(id)
    583 	if !ok {
    584 		mw = awsmiddleware.NewRequestUserAgent()
    585 		if err := stack.Build.Add(mw, middleware.After); err != nil {
    586 			return nil, err
    587 		}
    588 	}
    589 
    590 	ua, ok := mw.(*awsmiddleware.RequestUserAgent)
    591 	if !ok {
    592 		return nil, fmt.Errorf("%T for %s middleware did not match expected type", mw, id)
    593 	}
    594 
    595 	return ua, nil
    596 }
    597 
    598 type HTTPSignerV4 interface {
    599 	SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error
    600 }
    601 
    602 func resolveHTTPSignerV4(o *Options) {
    603 	if o.HTTPSignerV4 != nil {
    604 		return
    605 	}
    606 	o.HTTPSignerV4 = newDefaultV4Signer(*o)
    607 }
    608 
    609 func newDefaultV4Signer(o Options) *v4.Signer {
    610 	return v4.NewSigner(func(so *v4.SignerOptions) {
    611 		so.Logger = o.Logger
    612 		so.LogSigning = o.ClientLogMode.IsSigning()
    613 	})
    614 }
    615 
    616 func addClientRequestID(stack *middleware.Stack) error {
    617 	return stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After)
    618 }
    619 
    620 func addComputeContentLength(stack *middleware.Stack) error {
    621 	return stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After)
    622 }
    623 
    624 func addRawResponseToMetadata(stack *middleware.Stack) error {
    625 	return stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before)
    626 }
    627 
    628 func addRecordResponseTiming(stack *middleware.Stack) error {
    629 	return stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After)
    630 }
    631 
    632 func addSpanRetryLoop(stack *middleware.Stack, options Options) error {
    633 	return stack.Finalize.Insert(&spanRetryLoop{options: options}, "Retry", middleware.Before)
    634 }
    635 
    636 type spanRetryLoop struct {
    637 	options Options
    638 }
    639 
    640 func (*spanRetryLoop) ID() string {
    641 	return "spanRetryLoop"
    642 }
    643 
    644 func (m *spanRetryLoop) HandleFinalize(
    645 	ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
    646 ) (
    647 	middleware.FinalizeOutput, middleware.Metadata, error,
    648 ) {
    649 	tracer := operationTracer(m.options.TracerProvider)
    650 	ctx, span := tracer.StartSpan(ctx, "RetryLoop")
    651 	defer span.End()
    652 
    653 	return next.HandleFinalize(ctx, in)
    654 }
    655 func addStreamingEventsPayload(stack *middleware.Stack) error {
    656 	return stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before)
    657 }
    658 
    659 func addUnsignedPayload(stack *middleware.Stack) error {
    660 	return stack.Finalize.Insert(&v4.UnsignedPayload{}, "ResolveEndpointV2", middleware.After)
    661 }
    662 
    663 func addComputePayloadSHA256(stack *middleware.Stack) error {
    664 	return stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, "ResolveEndpointV2", middleware.After)
    665 }
    666 
    667 func addContentSHA256Header(stack *middleware.Stack) error {
    668 	return stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After)
    669 }
    670 
    671 func addIsWaiterUserAgent(o *Options) {
    672 	o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {
    673 		ua, err := getOrAddRequestUserAgent(stack)
    674 		if err != nil {
    675 			return err
    676 		}
    677 
    678 		ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter)
    679 		return nil
    680 	})
    681 }
    682 
    683 func addIsPaginatorUserAgent(o *Options) {
    684 	o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {
    685 		ua, err := getOrAddRequestUserAgent(stack)
    686 		if err != nil {
    687 			return err
    688 		}
    689 
    690 		ua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator)
    691 		return nil
    692 	})
    693 }
    694 
    695 func addRetry(stack *middleware.Stack, o Options) error {
    696 	attempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) {
    697 		m.LogAttempts = o.ClientLogMode.IsRetries()
    698 		m.OperationMeter = o.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/sso")
    699 	})
    700 	if err := stack.Finalize.Insert(attempt, "ResolveAuthScheme", middleware.Before); err != nil {
    701 		return err
    702 	}
    703 	if err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil {
    704 		return err
    705 	}
    706 	return nil
    707 }
    708 
    709 // resolves dual-stack endpoint configuration
    710 func resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error {
    711 	if len(cfg.ConfigSources) == 0 {
    712 		return nil
    713 	}
    714 	value, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources)
    715 	if err != nil {
    716 		return err
    717 	}
    718 	if found {
    719 		o.EndpointOptions.UseDualStackEndpoint = value
    720 	}
    721 	return nil
    722 }
    723 
    724 // resolves FIPS endpoint configuration
    725 func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error {
    726 	if len(cfg.ConfigSources) == 0 {
    727 		return nil
    728 	}
    729 	value, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources)
    730 	if err != nil {
    731 		return err
    732 	}
    733 	if found {
    734 		o.EndpointOptions.UseFIPSEndpoint = value
    735 	}
    736 	return nil
    737 }
    738 
    739 func resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string {
    740 	if mode == aws.AccountIDEndpointModeDisabled {
    741 		return nil
    742 	}
    743 
    744 	if ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != "" {
    745 		return aws.String(ca.Credentials.AccountID)
    746 	}
    747 
    748 	return nil
    749 }
    750 
    751 func addTimeOffsetBuild(stack *middleware.Stack, c *Client) error {
    752 	mw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset}
    753 	if err := stack.Build.Add(&mw, middleware.After); err != nil {
    754 		return err
    755 	}
    756 	return stack.Deserialize.Insert(&mw, "RecordResponseTiming", middleware.Before)
    757 }
    758 func initializeTimeOffsetResolver(c *Client) {
    759 	c.timeOffset = new(atomic.Int64)
    760 }
    761 
    762 func addUserAgentRetryMode(stack *middleware.Stack, options Options) error {
    763 	ua, err := getOrAddRequestUserAgent(stack)
    764 	if err != nil {
    765 		return err
    766 	}
    767 
    768 	switch options.Retryer.(type) {
    769 	case *retry.Standard:
    770 		ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard)
    771 	case *retry.AdaptiveMode:
    772 		ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive)
    773 	}
    774 	return nil
    775 }
    776 
    777 type setCredentialSourceMiddleware struct {
    778 	ua      *awsmiddleware.RequestUserAgent
    779 	options Options
    780 }
    781 
    782 func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" }
    783 
    784 func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
    785 	out middleware.BuildOutput, metadata middleware.Metadata, err error,
    786 ) {
    787 	asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)
    788 	if !ok {
    789 		return next.HandleBuild(ctx, in)
    790 	}
    791 	providerSources := asProviderSource.ProviderSources()
    792 	for _, source := range providerSources {
    793 		m.ua.AddCredentialsSource(source)
    794 	}
    795 	return next.HandleBuild(ctx, in)
    796 }
    797 
    798 func addCredentialSource(stack *middleware.Stack, options Options) error {
    799 	ua, err := getOrAddRequestUserAgent(stack)
    800 	if err != nil {
    801 		return err
    802 	}
    803 
    804 	mw := setCredentialSourceMiddleware{ua: ua, options: options}
    805 	return stack.Build.Insert(&mw, "UserAgent", middleware.Before)
    806 }
    807 
    808 func resolveTracerProvider(options *Options) {
    809 	if options.TracerProvider == nil {
    810 		options.TracerProvider = &tracing.NopTracerProvider{}
    811 	}
    812 }
    813 
    814 func resolveMeterProvider(options *Options) {
    815 	if options.MeterProvider == nil {
    816 		options.MeterProvider = metrics.NopMeterProvider{}
    817 	}
    818 }
    819 
    820 func addRecursionDetection(stack *middleware.Stack) error {
    821 	return stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After)
    822 }
    823 
    824 func addRequestIDRetrieverMiddleware(stack *middleware.Stack) error {
    825 	return stack.Deserialize.Insert(&awsmiddleware.RequestIDRetriever{}, "OperationDeserializer", middleware.Before)
    826 
    827 }
    828 
    829 func addResponseErrorMiddleware(stack *middleware.Stack) error {
    830 	return stack.Deserialize.Insert(&awshttp.ResponseErrorWrapper{}, "RequestIDRetriever", middleware.Before)
    831 
    832 }
    833 
    834 func addRequestResponseLogging(stack *middleware.Stack, o Options) error {
    835 	return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{
    836 		LogRequest:          o.ClientLogMode.IsRequest(),
    837 		LogRequestWithBody:  o.ClientLogMode.IsRequestWithBody(),
    838 		LogResponse:         o.ClientLogMode.IsResponse(),
    839 		LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(),
    840 	}, middleware.After)
    841 }
    842 
    843 type disableHTTPSMiddleware struct {
    844 	DisableHTTPS bool
    845 }
    846 
    847 func (*disableHTTPSMiddleware) ID() string {
    848 	return "disableHTTPS"
    849 }
    850 
    851 func (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
    852 	out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
    853 ) {
    854 	req, ok := in.Request.(*smithyhttp.Request)
    855 	if !ok {
    856 		return out, metadata, fmt.Errorf("unknown transport type %T", in.Request)
    857 	}
    858 
    859 	if m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) {
    860 		req.URL.Scheme = "http"
    861 	}
    862 
    863 	return next.HandleFinalize(ctx, in)
    864 }
    865 
    866 func addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error {
    867 	return stack.Finalize.Insert(&disableHTTPSMiddleware{
    868 		DisableHTTPS: o.EndpointOptions.DisableHTTPS,
    869 	}, "ResolveEndpointV2", middleware.After)
    870 }
    871 
    872 func addInterceptBeforeRetryLoop(stack *middleware.Stack, opts Options) error {
    873 	return stack.Finalize.Insert(&smithyhttp.InterceptBeforeRetryLoop{
    874 		Interceptors: opts.Interceptors.BeforeRetryLoop,
    875 	}, "Retry", middleware.Before)
    876 }
    877 
    878 func addInterceptAttempt(stack *middleware.Stack, opts Options) error {
    879 	return stack.Finalize.Insert(&smithyhttp.InterceptAttempt{
    880 		BeforeAttempt: opts.Interceptors.BeforeAttempt,
    881 		AfterAttempt:  opts.Interceptors.AfterAttempt,
    882 	}, "Retry", middleware.After)
    883 }
    884 
    885 func addInterceptExecution(stack *middleware.Stack, opts Options) error {
    886 	return stack.Initialize.Add(&smithyhttp.InterceptExecution{
    887 		BeforeExecution: opts.Interceptors.BeforeExecution,
    888 		AfterExecution:  opts.Interceptors.AfterExecution,
    889 	}, middleware.Before)
    890 }
    891 
    892 func addInterceptBeforeSerialization(stack *middleware.Stack, opts Options) error {
    893 	return stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{
    894 		Interceptors: opts.Interceptors.BeforeSerialization,
    895 	}, "OperationSerializer", middleware.Before)
    896 }
    897 
    898 func addInterceptAfterSerialization(stack *middleware.Stack, opts Options) error {
    899 	return stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{
    900 		Interceptors: opts.Interceptors.AfterSerialization,
    901 	}, "OperationSerializer", middleware.After)
    902 }
    903 
    904 func addInterceptBeforeSigning(stack *middleware.Stack, opts Options) error {
    905 	return stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{
    906 		Interceptors: opts.Interceptors.BeforeSigning,
    907 	}, "Signing", middleware.Before)
    908 }
    909 
    910 func addInterceptAfterSigning(stack *middleware.Stack, opts Options) error {
    911 	return stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{
    912 		Interceptors: opts.Interceptors.AfterSigning,
    913 	}, "Signing", middleware.After)
    914 }
    915 
    916 func addInterceptTransmit(stack *middleware.Stack, opts Options) error {
    917 	return stack.Deserialize.Add(&smithyhttp.InterceptTransmit{
    918 		BeforeTransmit: opts.Interceptors.BeforeTransmit,
    919 		AfterTransmit:  opts.Interceptors.AfterTransmit,
    920 	}, middleware.After)
    921 }
    922 
    923 func addInterceptBeforeDeserialization(stack *middleware.Stack, opts Options) error {
    924 	return stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{
    925 		Interceptors: opts.Interceptors.BeforeDeserialization,
    926 	}, "OperationDeserializer", middleware.After) // (deserialize stack is called in reverse)
    927 }
    928 
    929 func addInterceptAfterDeserialization(stack *middleware.Stack, opts Options) error {
    930 	return stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{
    931 		Interceptors: opts.Interceptors.AfterDeserialization,
    932 	}, "OperationDeserializer", middleware.Before)
    933 }
    934 
    935 type spanInitializeStart struct {
    936 }
    937 
    938 func (*spanInitializeStart) ID() string {
    939 	return "spanInitializeStart"
    940 }
    941 
    942 func (m *spanInitializeStart) HandleInitialize(
    943 	ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,
    944 ) (
    945 	middleware.InitializeOutput, middleware.Metadata, error,
    946 ) {
    947 	ctx, _ = tracing.StartSpan(ctx, "Initialize")
    948 
    949 	return next.HandleInitialize(ctx, in)
    950 }
    951 
    952 type spanInitializeEnd struct {
    953 }
    954 
    955 func (*spanInitializeEnd) ID() string {
    956 	return "spanInitializeEnd"
    957 }
    958 
    959 func (m *spanInitializeEnd) HandleInitialize(
    960 	ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,
    961 ) (
    962 	middleware.InitializeOutput, middleware.Metadata, error,
    963 ) {
    964 	ctx, span := tracing.PopSpan(ctx)
    965 	span.End()
    966 
    967 	return next.HandleInitialize(ctx, in)
    968 }
    969 
    970 type spanBuildRequestStart struct {
    971 }
    972 
    973 func (*spanBuildRequestStart) ID() string {
    974 	return "spanBuildRequestStart"
    975 }
    976 
    977 func (m *spanBuildRequestStart) HandleSerialize(
    978 	ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,
    979 ) (
    980 	middleware.SerializeOutput, middleware.Metadata, error,
    981 ) {
    982 	ctx, _ = tracing.StartSpan(ctx, "BuildRequest")
    983 
    984 	return next.HandleSerialize(ctx, in)
    985 }
    986 
    987 type spanBuildRequestEnd struct {
    988 }
    989 
    990 func (*spanBuildRequestEnd) ID() string {
    991 	return "spanBuildRequestEnd"
    992 }
    993 
    994 func (m *spanBuildRequestEnd) HandleBuild(
    995 	ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,
    996 ) (
    997 	middleware.BuildOutput, middleware.Metadata, error,
    998 ) {
    999 	ctx, span := tracing.PopSpan(ctx)
   1000 	span.End()
   1001 
   1002 	return next.HandleBuild(ctx, in)
   1003 }
   1004 
   1005 func addSpanInitializeStart(stack *middleware.Stack) error {
   1006 	return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before)
   1007 }
   1008 
   1009 func addSpanInitializeEnd(stack *middleware.Stack) error {
   1010 	return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After)
   1011 }
   1012 
   1013 func addSpanBuildRequestStart(stack *middleware.Stack) error {
   1014 	return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before)
   1015 }
   1016 
   1017 func addSpanBuildRequestEnd(stack *middleware.Stack) error {
   1018 	return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After)
   1019 }