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