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