src

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

api_client.go (36075B)


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