provider.go (22966B)
1 package config 2 3 import ( 4 "context" 5 "io" 6 "net/http" 7 8 "github.com/aws/aws-sdk-go-v2/aws" 9 "github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds" 10 "github.com/aws/aws-sdk-go-v2/credentials/endpointcreds" 11 "github.com/aws/aws-sdk-go-v2/credentials/processcreds" 12 "github.com/aws/aws-sdk-go-v2/credentials/ssocreds" 13 "github.com/aws/aws-sdk-go-v2/credentials/stscreds" 14 "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" 15 smithybearer "github.com/aws/smithy-go/auth/bearer" 16 "github.com/aws/smithy-go/logging" 17 "github.com/aws/smithy-go/middleware" 18 ) 19 20 // sharedConfigProfileProvider provides access to the shared config profile 21 // name external configuration value. 22 type sharedConfigProfileProvider interface { 23 getSharedConfigProfile(ctx context.Context) (string, bool, error) 24 } 25 26 // getSharedConfigProfile searches the configs for a sharedConfigProfileProvider 27 // and returns the value if found. Returns an error if a provider fails before a 28 // value is found. 29 func getSharedConfigProfile(ctx context.Context, configs configs) (value string, found bool, err error) { 30 for _, cfg := range configs { 31 if p, ok := cfg.(sharedConfigProfileProvider); ok { 32 value, found, err = p.getSharedConfigProfile(ctx) 33 if err != nil || found { 34 break 35 } 36 } 37 } 38 return 39 } 40 41 // sharedConfigFilesProvider provides access to the shared config filesnames 42 // external configuration value. 43 type sharedConfigFilesProvider interface { 44 getSharedConfigFiles(ctx context.Context) ([]string, bool, error) 45 } 46 47 // getSharedConfigFiles searches the configs for a sharedConfigFilesProvider 48 // and returns the value if found. Returns an error if a provider fails before a 49 // value is found. 50 func getSharedConfigFiles(ctx context.Context, configs configs) (value []string, found bool, err error) { 51 for _, cfg := range configs { 52 if p, ok := cfg.(sharedConfigFilesProvider); ok { 53 value, found, err = p.getSharedConfigFiles(ctx) 54 if err != nil || found { 55 break 56 } 57 } 58 } 59 60 return 61 } 62 63 // sharedCredentialsFilesProvider provides access to the shared credentials filesnames 64 // external configuration value. 65 type sharedCredentialsFilesProvider interface { 66 getSharedCredentialsFiles(ctx context.Context) ([]string, bool, error) 67 } 68 69 // getSharedCredentialsFiles searches the configs for a sharedCredentialsFilesProvider 70 // and returns the value if found. Returns an error if a provider fails before a 71 // value is found. 72 func getSharedCredentialsFiles(ctx context.Context, configs configs) (value []string, found bool, err error) { 73 for _, cfg := range configs { 74 if p, ok := cfg.(sharedCredentialsFilesProvider); ok { 75 value, found, err = p.getSharedCredentialsFiles(ctx) 76 if err != nil || found { 77 break 78 } 79 } 80 } 81 82 return 83 } 84 85 // customCABundleProvider provides access to the custom CA bundle PEM bytes. 86 type customCABundleProvider interface { 87 getCustomCABundle(ctx context.Context) (io.Reader, bool, error) 88 } 89 90 // getCustomCABundle searches the configs for a customCABundleProvider 91 // and returns the value if found. Returns an error if a provider fails before a 92 // value is found. 93 func getCustomCABundle(ctx context.Context, configs configs) (value io.Reader, found bool, err error) { 94 for _, cfg := range configs { 95 if p, ok := cfg.(customCABundleProvider); ok { 96 value, found, err = p.getCustomCABundle(ctx) 97 if err != nil || found { 98 break 99 } 100 } 101 } 102 103 return 104 } 105 106 // regionProvider provides access to the region external configuration value. 107 type regionProvider interface { 108 getRegion(ctx context.Context) (string, bool, error) 109 } 110 111 // getRegion searches the configs for a regionProvider and returns the value 112 // if found. Returns an error if a provider fails before a value is found. 113 func getRegion(ctx context.Context, configs configs) (value string, found bool, err error) { 114 for _, cfg := range configs { 115 if p, ok := cfg.(regionProvider); ok { 116 value, found, err = p.getRegion(ctx) 117 if err != nil || found { 118 break 119 } 120 } 121 } 122 return 123 } 124 125 // IgnoreConfiguredEndpointsProvider is needed to search for all providers 126 // that provide a flag to disable configured endpoints. 127 type IgnoreConfiguredEndpointsProvider interface { 128 GetIgnoreConfiguredEndpoints(ctx context.Context) (bool, bool, error) 129 } 130 131 // GetIgnoreConfiguredEndpoints is used in knowing when to disable configured 132 // endpoints feature. 133 func GetIgnoreConfiguredEndpoints(ctx context.Context, configs []interface{}) (value bool, found bool, err error) { 134 for _, cfg := range configs { 135 if p, ok := cfg.(IgnoreConfiguredEndpointsProvider); ok { 136 value, found, err = p.GetIgnoreConfiguredEndpoints(ctx) 137 if err != nil || found { 138 break 139 } 140 } 141 } 142 return 143 } 144 145 type baseEndpointProvider interface { 146 getBaseEndpoint(ctx context.Context) (string, bool, error) 147 } 148 149 func getBaseEndpoint(ctx context.Context, configs configs) (value string, found bool, err error) { 150 for _, cfg := range configs { 151 if p, ok := cfg.(baseEndpointProvider); ok { 152 value, found, err = p.getBaseEndpoint(ctx) 153 if err != nil || found { 154 break 155 } 156 } 157 } 158 return 159 } 160 161 type servicesObjectProvider interface { 162 getServicesObject(ctx context.Context) (map[string]map[string]string, bool, error) 163 } 164 165 func getServicesObject(ctx context.Context, configs configs) (value map[string]map[string]string, found bool, err error) { 166 for _, cfg := range configs { 167 if p, ok := cfg.(servicesObjectProvider); ok { 168 value, found, err = p.getServicesObject(ctx) 169 if err != nil || found { 170 break 171 } 172 } 173 } 174 return 175 } 176 177 // appIDProvider provides access to the sdk app ID value 178 type appIDProvider interface { 179 getAppID(ctx context.Context) (string, bool, error) 180 } 181 182 func getAppID(ctx context.Context, configs configs) (value string, found bool, err error) { 183 for _, cfg := range configs { 184 if p, ok := cfg.(appIDProvider); ok { 185 value, found, err = p.getAppID(ctx) 186 if err != nil || found { 187 break 188 } 189 } 190 } 191 return 192 } 193 194 // disableRequestCompressionProvider provides access to the DisableRequestCompression 195 type disableRequestCompressionProvider interface { 196 getDisableRequestCompression(context.Context) (bool, bool, error) 197 } 198 199 func getDisableRequestCompression(ctx context.Context, configs configs) (value bool, found bool, err error) { 200 for _, cfg := range configs { 201 if p, ok := cfg.(disableRequestCompressionProvider); ok { 202 value, found, err = p.getDisableRequestCompression(ctx) 203 if err != nil || found { 204 break 205 } 206 } 207 } 208 return 209 } 210 211 // requestMinCompressSizeBytesProvider provides access to the MinCompressSizeBytes 212 type requestMinCompressSizeBytesProvider interface { 213 getRequestMinCompressSizeBytes(context.Context) (int64, bool, error) 214 } 215 216 func getRequestMinCompressSizeBytes(ctx context.Context, configs configs) (value int64, found bool, err error) { 217 for _, cfg := range configs { 218 if p, ok := cfg.(requestMinCompressSizeBytesProvider); ok { 219 value, found, err = p.getRequestMinCompressSizeBytes(ctx) 220 if err != nil || found { 221 break 222 } 223 } 224 } 225 return 226 } 227 228 // ec2IMDSRegionProvider provides access to the ec2 imds region 229 // configuration value 230 type ec2IMDSRegionProvider interface { 231 getEC2IMDSRegion(ctx context.Context) (string, bool, error) 232 } 233 234 // getEC2IMDSRegion searches the configs for a ec2IMDSRegionProvider and 235 // returns the value if found. Returns an error if a provider fails before 236 // a value is found. 237 func getEC2IMDSRegion(ctx context.Context, configs configs) (region string, found bool, err error) { 238 for _, cfg := range configs { 239 if provider, ok := cfg.(ec2IMDSRegionProvider); ok { 240 region, found, err = provider.getEC2IMDSRegion(ctx) 241 if err != nil || found { 242 break 243 } 244 } 245 } 246 return 247 } 248 249 // credentialsProviderProvider provides access to the credentials external 250 // configuration value. 251 type credentialsProviderProvider interface { 252 getCredentialsProvider(ctx context.Context) (aws.CredentialsProvider, bool, error) 253 } 254 255 // getCredentialsProvider searches the configs for a credentialsProviderProvider 256 // and returns the value if found. Returns an error if a provider fails before a 257 // value is found. 258 func getCredentialsProvider(ctx context.Context, configs configs) (p aws.CredentialsProvider, found bool, err error) { 259 for _, cfg := range configs { 260 if provider, ok := cfg.(credentialsProviderProvider); ok { 261 p, found, err = provider.getCredentialsProvider(ctx) 262 if err != nil || found { 263 break 264 } 265 } 266 } 267 return 268 } 269 270 // credentialsCacheOptionsProvider is an interface for retrieving a function for setting 271 // the aws.CredentialsCacheOptions. 272 type credentialsCacheOptionsProvider interface { 273 getCredentialsCacheOptions(ctx context.Context) (func(*aws.CredentialsCacheOptions), bool, error) 274 } 275 276 // getCredentialsCacheOptionsProvider is an interface for retrieving a function for setting 277 // the aws.CredentialsCacheOptions. 278 func getCredentialsCacheOptionsProvider(ctx context.Context, configs configs) ( 279 f func(*aws.CredentialsCacheOptions), found bool, err error, 280 ) { 281 for _, config := range configs { 282 if p, ok := config.(credentialsCacheOptionsProvider); ok { 283 f, found, err = p.getCredentialsCacheOptions(ctx) 284 if err != nil || found { 285 break 286 } 287 } 288 } 289 return 290 } 291 292 // bearerAuthTokenProviderProvider provides access to the bearer authentication 293 // token external configuration value. 294 type bearerAuthTokenProviderProvider interface { 295 getBearerAuthTokenProvider(context.Context) (smithybearer.TokenProvider, bool, error) 296 } 297 298 // getBearerAuthTokenProvider searches the config sources for a 299 // bearerAuthTokenProviderProvider and returns the value if found. Returns an 300 // error if a provider fails before a value is found. 301 func getBearerAuthTokenProvider(ctx context.Context, configs configs) (p smithybearer.TokenProvider, found bool, err error) { 302 for _, cfg := range configs { 303 if provider, ok := cfg.(bearerAuthTokenProviderProvider); ok { 304 p, found, err = provider.getBearerAuthTokenProvider(ctx) 305 if err != nil || found { 306 break 307 } 308 } 309 } 310 return 311 } 312 313 // bearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for 314 // setting the smithy-go auth/bearer#TokenCacheOptions. 315 type bearerAuthTokenCacheOptionsProvider interface { 316 getBearerAuthTokenCacheOptions(context.Context) (func(*smithybearer.TokenCacheOptions), bool, error) 317 } 318 319 // getBearerAuthTokenCacheOptionsProvider is an interface for retrieving a function for 320 // setting the smithy-go auth/bearer#TokenCacheOptions. 321 func getBearerAuthTokenCacheOptions(ctx context.Context, configs configs) ( 322 f func(*smithybearer.TokenCacheOptions), found bool, err error, 323 ) { 324 for _, config := range configs { 325 if p, ok := config.(bearerAuthTokenCacheOptionsProvider); ok { 326 f, found, err = p.getBearerAuthTokenCacheOptions(ctx) 327 if err != nil || found { 328 break 329 } 330 } 331 } 332 return 333 } 334 335 // ssoTokenProviderOptionsProvider is an interface for retrieving a function for 336 // setting the SDK's credentials/ssocreds#SSOTokenProviderOptions. 337 type ssoTokenProviderOptionsProvider interface { 338 getSSOTokenProviderOptions(context.Context) (func(*ssocreds.SSOTokenProviderOptions), bool, error) 339 } 340 341 // getSSOTokenProviderOptions is an interface for retrieving a function for 342 // setting the SDK's credentials/ssocreds#SSOTokenProviderOptions. 343 func getSSOTokenProviderOptions(ctx context.Context, configs configs) ( 344 f func(*ssocreds.SSOTokenProviderOptions), found bool, err error, 345 ) { 346 for _, config := range configs { 347 if p, ok := config.(ssoTokenProviderOptionsProvider); ok { 348 f, found, err = p.getSSOTokenProviderOptions(ctx) 349 if err != nil || found { 350 break 351 } 352 } 353 } 354 return 355 } 356 357 // ssoTokenProviderOptionsProvider 358 359 // processCredentialOptions is an interface for retrieving a function for setting 360 // the processcreds.Options. 361 type processCredentialOptions interface { 362 getProcessCredentialOptions(ctx context.Context) (func(*processcreds.Options), bool, error) 363 } 364 365 // getProcessCredentialOptions searches the slice of configs and returns the first function found 366 func getProcessCredentialOptions(ctx context.Context, configs configs) (f func(*processcreds.Options), found bool, err error) { 367 for _, config := range configs { 368 if p, ok := config.(processCredentialOptions); ok { 369 f, found, err = p.getProcessCredentialOptions(ctx) 370 if err != nil || found { 371 break 372 } 373 } 374 } 375 return 376 } 377 378 // ec2RoleCredentialOptionsProvider is an interface for retrieving a function 379 // for setting the ec2rolecreds.Provider options. 380 type ec2RoleCredentialOptionsProvider interface { 381 getEC2RoleCredentialOptions(ctx context.Context) (func(*ec2rolecreds.Options), bool, error) 382 } 383 384 // getEC2RoleCredentialProviderOptions searches the slice of configs and returns the first function found 385 func getEC2RoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*ec2rolecreds.Options), found bool, err error) { 386 for _, config := range configs { 387 if p, ok := config.(ec2RoleCredentialOptionsProvider); ok { 388 f, found, err = p.getEC2RoleCredentialOptions(ctx) 389 if err != nil || found { 390 break 391 } 392 } 393 } 394 return 395 } 396 397 // defaultRegionProvider is an interface for retrieving a default region if a region was not resolved from other sources 398 type defaultRegionProvider interface { 399 getDefaultRegion(ctx context.Context) (string, bool, error) 400 } 401 402 // getDefaultRegion searches the slice of configs and returns the first fallback region found 403 func getDefaultRegion(ctx context.Context, configs configs) (value string, found bool, err error) { 404 for _, config := range configs { 405 if p, ok := config.(defaultRegionProvider); ok { 406 value, found, err = p.getDefaultRegion(ctx) 407 if err != nil || found { 408 break 409 } 410 } 411 } 412 return 413 } 414 415 // endpointCredentialOptionsProvider is an interface for retrieving a function for setting 416 // the endpointcreds.ProviderOptions. 417 type endpointCredentialOptionsProvider interface { 418 getEndpointCredentialOptions(ctx context.Context) (func(*endpointcreds.Options), bool, error) 419 } 420 421 // getEndpointCredentialProviderOptions searches the slice of configs and returns the first function found 422 func getEndpointCredentialProviderOptions(ctx context.Context, configs configs) (f func(*endpointcreds.Options), found bool, err error) { 423 for _, config := range configs { 424 if p, ok := config.(endpointCredentialOptionsProvider); ok { 425 f, found, err = p.getEndpointCredentialOptions(ctx) 426 if err != nil || found { 427 break 428 } 429 } 430 } 431 return 432 } 433 434 // webIdentityRoleCredentialOptionsProvider is an interface for retrieving a function for setting 435 // the stscreds.WebIdentityRoleProvider. 436 type webIdentityRoleCredentialOptionsProvider interface { 437 getWebIdentityRoleCredentialOptions(ctx context.Context) (func(*stscreds.WebIdentityRoleOptions), bool, error) 438 } 439 440 // getWebIdentityCredentialProviderOptions searches the slice of configs and returns the first function found 441 func getWebIdentityCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.WebIdentityRoleOptions), found bool, err error) { 442 for _, config := range configs { 443 if p, ok := config.(webIdentityRoleCredentialOptionsProvider); ok { 444 f, found, err = p.getWebIdentityRoleCredentialOptions(ctx) 445 if err != nil || found { 446 break 447 } 448 } 449 } 450 return 451 } 452 453 // assumeRoleCredentialOptionsProvider is an interface for retrieving a function for setting 454 // the stscreds.AssumeRoleOptions. 455 type assumeRoleCredentialOptionsProvider interface { 456 getAssumeRoleCredentialOptions(ctx context.Context) (func(*stscreds.AssumeRoleOptions), bool, error) 457 } 458 459 // getAssumeRoleCredentialProviderOptions searches the slice of configs and returns the first function found 460 func getAssumeRoleCredentialProviderOptions(ctx context.Context, configs configs) (f func(*stscreds.AssumeRoleOptions), found bool, err error) { 461 for _, config := range configs { 462 if p, ok := config.(assumeRoleCredentialOptionsProvider); ok { 463 f, found, err = p.getAssumeRoleCredentialOptions(ctx) 464 if err != nil || found { 465 break 466 } 467 } 468 } 469 return 470 } 471 472 // HTTPClient is an HTTP client implementation 473 type HTTPClient interface { 474 Do(*http.Request) (*http.Response, error) 475 } 476 477 // httpClientProvider is an interface for retrieving HTTPClient 478 type httpClientProvider interface { 479 getHTTPClient(ctx context.Context) (HTTPClient, bool, error) 480 } 481 482 // getHTTPClient searches the slice of configs and returns the HTTPClient set on configs 483 func getHTTPClient(ctx context.Context, configs configs) (client HTTPClient, found bool, err error) { 484 for _, config := range configs { 485 if p, ok := config.(httpClientProvider); ok { 486 client, found, err = p.getHTTPClient(ctx) 487 if err != nil || found { 488 break 489 } 490 } 491 } 492 return 493 } 494 495 // apiOptionsProvider is an interface for retrieving APIOptions 496 type apiOptionsProvider interface { 497 getAPIOptions(ctx context.Context) ([]func(*middleware.Stack) error, bool, error) 498 } 499 500 // getAPIOptions searches the slice of configs and returns the APIOptions set on configs 501 func getAPIOptions(ctx context.Context, configs configs) (apiOptions []func(*middleware.Stack) error, found bool, err error) { 502 for _, config := range configs { 503 if p, ok := config.(apiOptionsProvider); ok { 504 // retrieve APIOptions from configs and set it on cfg 505 apiOptions, found, err = p.getAPIOptions(ctx) 506 if err != nil || found { 507 break 508 } 509 } 510 } 511 return 512 } 513 514 // endpointResolverProvider is an interface for retrieving an aws.EndpointResolver from a configuration source 515 type endpointResolverProvider interface { 516 getEndpointResolver(ctx context.Context) (aws.EndpointResolver, bool, error) 517 } 518 519 // getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used 520 // to configure the aws.Config.EndpointResolver value. 521 func getEndpointResolver(ctx context.Context, configs configs) (f aws.EndpointResolver, found bool, err error) { 522 for _, c := range configs { 523 if p, ok := c.(endpointResolverProvider); ok { 524 f, found, err = p.getEndpointResolver(ctx) 525 if err != nil || found { 526 break 527 } 528 } 529 } 530 return 531 } 532 533 // endpointResolverWithOptionsProvider is an interface for retrieving an aws.EndpointResolverWithOptions from a configuration source 534 type endpointResolverWithOptionsProvider interface { 535 getEndpointResolverWithOptions(ctx context.Context) (aws.EndpointResolverWithOptions, bool, error) 536 } 537 538 // getEndpointResolver searches the provided config sources for a EndpointResolverFunc that can be used 539 // to configure the aws.Config.EndpointResolver value. 540 func getEndpointResolverWithOptions(ctx context.Context, configs configs) (f aws.EndpointResolverWithOptions, found bool, err error) { 541 for _, c := range configs { 542 if p, ok := c.(endpointResolverWithOptionsProvider); ok { 543 f, found, err = p.getEndpointResolverWithOptions(ctx) 544 if err != nil || found { 545 break 546 } 547 } 548 } 549 return 550 } 551 552 // loggerProvider is an interface for retrieving a logging.Logger from a configuration source. 553 type loggerProvider interface { 554 getLogger(ctx context.Context) (logging.Logger, bool, error) 555 } 556 557 // getLogger searches the provided config sources for a logging.Logger that can be used 558 // to configure the aws.Config.Logger value. 559 func getLogger(ctx context.Context, configs configs) (l logging.Logger, found bool, err error) { 560 for _, c := range configs { 561 if p, ok := c.(loggerProvider); ok { 562 l, found, err = p.getLogger(ctx) 563 if err != nil || found { 564 break 565 } 566 } 567 } 568 return 569 } 570 571 // clientLogModeProvider is an interface for retrieving the aws.ClientLogMode from a configuration source. 572 type clientLogModeProvider interface { 573 getClientLogMode(ctx context.Context) (aws.ClientLogMode, bool, error) 574 } 575 576 func getClientLogMode(ctx context.Context, configs configs) (m aws.ClientLogMode, found bool, err error) { 577 for _, c := range configs { 578 if p, ok := c.(clientLogModeProvider); ok { 579 m, found, err = p.getClientLogMode(ctx) 580 if err != nil || found { 581 break 582 } 583 } 584 } 585 return 586 } 587 588 // retryProvider is an configuration provider for custom Retryer. 589 type retryProvider interface { 590 getRetryer(ctx context.Context) (func() aws.Retryer, bool, error) 591 } 592 593 func getRetryer(ctx context.Context, configs configs) (v func() aws.Retryer, found bool, err error) { 594 for _, c := range configs { 595 if p, ok := c.(retryProvider); ok { 596 v, found, err = p.getRetryer(ctx) 597 if err != nil || found { 598 break 599 } 600 } 601 } 602 return 603 } 604 605 // logConfigurationWarningsProvider is an configuration provider for 606 // retrieving a boolean indicating whether configuration issues should 607 // be logged when loading from config sources 608 type logConfigurationWarningsProvider interface { 609 getLogConfigurationWarnings(ctx context.Context) (bool, bool, error) 610 } 611 612 func getLogConfigurationWarnings(ctx context.Context, configs configs) (v bool, found bool, err error) { 613 for _, c := range configs { 614 if p, ok := c.(logConfigurationWarningsProvider); ok { 615 v, found, err = p.getLogConfigurationWarnings(ctx) 616 if err != nil || found { 617 break 618 } 619 } 620 } 621 return 622 } 623 624 // ssoCredentialOptionsProvider is an interface for retrieving a function for setting 625 // the ssocreds.Options. 626 type ssoCredentialOptionsProvider interface { 627 getSSOProviderOptions(context.Context) (func(*ssocreds.Options), bool, error) 628 } 629 630 func getSSOProviderOptions(ctx context.Context, configs configs) (v func(options *ssocreds.Options), found bool, err error) { 631 for _, c := range configs { 632 if p, ok := c.(ssoCredentialOptionsProvider); ok { 633 v, found, err = p.getSSOProviderOptions(ctx) 634 if err != nil || found { 635 break 636 } 637 } 638 } 639 return v, found, err 640 } 641 642 type defaultsModeIMDSClientProvider interface { 643 getDefaultsModeIMDSClient(context.Context) (*imds.Client, bool, error) 644 } 645 646 func getDefaultsModeIMDSClient(ctx context.Context, configs configs) (v *imds.Client, found bool, err error) { 647 for _, c := range configs { 648 if p, ok := c.(defaultsModeIMDSClientProvider); ok { 649 v, found, err = p.getDefaultsModeIMDSClient(ctx) 650 if err != nil || found { 651 break 652 } 653 } 654 } 655 return v, found, err 656 } 657 658 type defaultsModeProvider interface { 659 getDefaultsMode(context.Context) (aws.DefaultsMode, bool, error) 660 } 661 662 func getDefaultsMode(ctx context.Context, configs configs) (v aws.DefaultsMode, found bool, err error) { 663 for _, c := range configs { 664 if p, ok := c.(defaultsModeProvider); ok { 665 v, found, err = p.getDefaultsMode(ctx) 666 if err != nil || found { 667 break 668 } 669 } 670 } 671 return v, found, err 672 } 673 674 type retryMaxAttemptsProvider interface { 675 GetRetryMaxAttempts(context.Context) (int, bool, error) 676 } 677 678 func getRetryMaxAttempts(ctx context.Context, configs configs) (v int, found bool, err error) { 679 for _, c := range configs { 680 if p, ok := c.(retryMaxAttemptsProvider); ok { 681 v, found, err = p.GetRetryMaxAttempts(ctx) 682 if err != nil || found { 683 break 684 } 685 } 686 } 687 return v, found, err 688 } 689 690 type retryModeProvider interface { 691 GetRetryMode(context.Context) (aws.RetryMode, bool, error) 692 } 693 694 func getRetryMode(ctx context.Context, configs configs) (v aws.RetryMode, found bool, err error) { 695 for _, c := range configs { 696 if p, ok := c.(retryModeProvider); ok { 697 v, found, err = p.GetRetryMode(ctx) 698 if err != nil || found { 699 break 700 } 701 } 702 } 703 return v, found, err 704 }