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 }