endpoints.go (21324B)
1 // Code generated by smithy-go-codegen DO NOT EDIT. 2 3 package sts 4 5 import ( 6 "context" 7 "errors" 8 "fmt" 9 "net/http" 10 "net/url" 11 "os" 12 "strings" 13 14 "github.com/aws/aws-sdk-go-v2/aws" 15 awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" 16 internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" 17 "github.com/aws/aws-sdk-go-v2/internal/endpoints" 18 "github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn" 19 internalendpoints "github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints" 20 smithy "github.com/aws/smithy-go" 21 smithyauth "github.com/aws/smithy-go/auth" 22 smithyendpoints "github.com/aws/smithy-go/endpoints" 23 "github.com/aws/smithy-go/endpoints/private/bdd" 24 "github.com/aws/smithy-go/endpoints/private/rulesfn" 25 "github.com/aws/smithy-go/middleware" 26 "github.com/aws/smithy-go/ptr" 27 "github.com/aws/smithy-go/tracing" 28 smithyhttp "github.com/aws/smithy-go/transport/http" 29 ) 30 31 // EndpointResolverOptions is the service endpoint resolver options 32 type EndpointResolverOptions = internalendpoints.Options 33 34 // EndpointResolver interface for resolving service endpoints. 35 type EndpointResolver interface { 36 ResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error) 37 } 38 39 var _ EndpointResolver = &internalendpoints.Resolver{} 40 41 // NewDefaultEndpointResolver constructs a new service endpoint resolver 42 func NewDefaultEndpointResolver() *internalendpoints.Resolver { 43 return internalendpoints.New() 44 } 45 46 // EndpointResolverFunc is a helper utility that wraps a function so it satisfies 47 // the EndpointResolver interface. This is useful when you want to add additional 48 // endpoint resolving logic, or stub out specific endpoints with custom values. 49 type EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error) 50 51 func (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { 52 return fn(region, options) 53 } 54 55 // EndpointResolverFromURL returns an EndpointResolver configured using the 56 // provided endpoint url. By default, the resolved endpoint resolver uses the 57 // client region as signing region, and the endpoint source is set to 58 // EndpointSourceCustom.You can provide functional options to configure endpoint 59 // values for the resolved endpoint. 60 func EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver { 61 e := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom} 62 for _, fn := range optFns { 63 fn(&e) 64 } 65 66 return EndpointResolverFunc( 67 func(region string, options EndpointResolverOptions) (aws.Endpoint, error) { 68 if len(e.SigningRegion) == 0 { 69 e.SigningRegion = region 70 } 71 return e, nil 72 }, 73 ) 74 } 75 76 type ResolveEndpoint struct { 77 Resolver EndpointResolver 78 Options EndpointResolverOptions 79 } 80 81 func (*ResolveEndpoint) ID() string { 82 return "ResolveEndpoint" 83 } 84 85 func (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( 86 out middleware.SerializeOutput, metadata middleware.Metadata, err error, 87 ) { 88 if !awsmiddleware.GetRequiresLegacyEndpoints(ctx) { 89 return next.HandleSerialize(ctx, in) 90 } 91 92 req, ok := in.Request.(*smithyhttp.Request) 93 if !ok { 94 return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) 95 } 96 97 if m.Resolver == nil { 98 return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") 99 } 100 101 eo := m.Options 102 eo.Logger = middleware.GetLogger(ctx) 103 104 var endpoint aws.Endpoint 105 endpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo) 106 if err != nil { 107 nf := (&aws.EndpointNotFoundError{}) 108 if errors.As(err, &nf) { 109 ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false) 110 return next.HandleSerialize(ctx, in) 111 } 112 return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) 113 } 114 115 req.URL, err = url.Parse(endpoint.URL) 116 if err != nil { 117 return out, metadata, fmt.Errorf("failed to parse endpoint URL: %w", err) 118 } 119 120 if len(awsmiddleware.GetSigningName(ctx)) == 0 { 121 signingName := endpoint.SigningName 122 if len(signingName) == 0 { 123 signingName = "sts" 124 } 125 ctx = awsmiddleware.SetSigningName(ctx, signingName) 126 } 127 ctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source) 128 ctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable) 129 ctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion) 130 ctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID) 131 return next.HandleSerialize(ctx, in) 132 } 133 func addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error { 134 return stack.Serialize.Insert(&ResolveEndpoint{ 135 Resolver: o.EndpointResolver, 136 Options: o.EndpointOptions, 137 }, "OperationSerializer", middleware.Before) 138 } 139 140 func removeResolveEndpointMiddleware(stack *middleware.Stack) error { 141 _, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID()) 142 return err 143 } 144 145 type wrappedEndpointResolver struct { 146 awsResolver aws.EndpointResolverWithOptions 147 } 148 149 func (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { 150 return w.awsResolver.ResolveEndpoint(ServiceID, region, options) 151 } 152 153 type awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error) 154 155 func (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) { 156 return a(service, region) 157 } 158 159 var _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil) 160 161 // withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver. 162 // If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error, 163 // and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked 164 // via its middleware. 165 // 166 // If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated. 167 func withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver { 168 var resolver aws.EndpointResolverWithOptions 169 170 if awsResolverWithOptions != nil { 171 resolver = awsResolverWithOptions 172 } else if awsResolver != nil { 173 resolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint) 174 } 175 176 return &wrappedEndpointResolver{ 177 awsResolver: resolver, 178 } 179 } 180 181 func finalizeClientEndpointResolverOptions(options *Options) { 182 options.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage() 183 184 if len(options.EndpointOptions.ResolvedRegion) == 0 { 185 const fipsInfix = "-fips-" 186 const fipsPrefix = "fips-" 187 const fipsSuffix = "-fips" 188 189 if strings.Contains(options.Region, fipsInfix) || 190 strings.Contains(options.Region, fipsPrefix) || 191 strings.Contains(options.Region, fipsSuffix) { 192 options.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll( 193 options.Region, fipsInfix, "-"), fipsPrefix, ""), fipsSuffix, "") 194 options.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled 195 } 196 } 197 198 } 199 200 func resolveEndpointResolverV2(options *Options) { 201 if options.EndpointResolverV2 == nil { 202 options.EndpointResolverV2 = NewDefaultEndpointResolverV2() 203 } 204 } 205 206 func resolveBaseEndpoint(cfg aws.Config, o *Options) { 207 if cfg.BaseEndpoint != nil { 208 o.BaseEndpoint = cfg.BaseEndpoint 209 } 210 211 _, g := os.LookupEnv("AWS_ENDPOINT_URL") 212 _, s := os.LookupEnv("AWS_ENDPOINT_URL_STS") 213 214 if g && !s { 215 return 216 } 217 218 value, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), "STS", cfg.ConfigSources) 219 if found && err == nil { 220 o.BaseEndpoint = &value 221 } 222 } 223 224 func bindRegion(region string) (*string, error) { 225 if region == "" { 226 return nil, nil 227 } 228 if !rulesfn.IsValidHostLabel(region, true) { 229 return nil, fmt.Errorf("invalid input region %s", region) 230 } 231 232 return aws.String(endpoints.MapFIPSRegion(region)), nil 233 } 234 235 var _ = rulesfn.StringSlice(nil) 236 237 // EndpointParameters provides the parameters that influence how endpoints are 238 // resolved. 239 type EndpointParameters struct { 240 // The AWS region used to dispatch the request. 241 // 242 // Parameter is 243 // required. 244 // 245 // AWS::Region 246 Region *string 247 248 // When true, use the dual-stack endpoint. If the configured endpoint does not 249 // support dual-stack, dispatching the request MAY return an error. 250 // 251 // Defaults to 252 // false if no value is provided. 253 // 254 // AWS::UseDualStack 255 UseDualStack *bool 256 257 // When true, send this request to the FIPS-compliant regional endpoint. If the 258 // configured endpoint does not have a FIPS compliant endpoint, dispatching the 259 // request will return an error. 260 // 261 // Defaults to false if no value is 262 // provided. 263 // 264 // AWS::UseFIPS 265 UseFIPS *bool 266 267 // Override the endpoint used to send this request 268 // 269 // Parameter is 270 // required. 271 // 272 // SDK::Endpoint 273 Endpoint *string 274 275 // Whether the global endpoint should be used, rather then the regional endpoint 276 // for us-east-1. 277 // 278 // Defaults to false if no value is 279 // provided. 280 // 281 // AWS::STS::UseGlobalEndpoint 282 UseGlobalEndpoint *bool 283 } 284 285 // ValidateRequired validates required parameters are set. 286 func (p EndpointParameters) ValidateRequired() error { 287 if p.UseDualStack == nil { 288 return fmt.Errorf("parameter UseDualStack is required") 289 } 290 291 if p.UseFIPS == nil { 292 return fmt.Errorf("parameter UseFIPS is required") 293 } 294 295 if p.UseGlobalEndpoint == nil { 296 return fmt.Errorf("parameter UseGlobalEndpoint is required") 297 } 298 299 return nil 300 } 301 302 // WithDefaults returns a shallow copy of EndpointParameterswith default values 303 // applied to members where applicable. 304 func (p EndpointParameters) WithDefaults() EndpointParameters { 305 if p.UseDualStack == nil { 306 p.UseDualStack = ptr.Bool(false) 307 } 308 309 if p.UseFIPS == nil { 310 p.UseFIPS = ptr.Bool(false) 311 } 312 313 if p.UseGlobalEndpoint == nil { 314 p.UseGlobalEndpoint = ptr.Bool(false) 315 } 316 return p 317 } 318 319 const bddRoot int32 = 2 320 321 var bddNodes = [93]int32{ 322 -1, 1, -1, 0, 30, 3, 1, 4, 100000014, 2, 5, 100000014, 3, 25, 6, 4, 24, 7, 5, 100000001, 8, 6, 9, 100000013, 7, 100000001, 10, 10, 100000001, 11, 11, 100000001, 12, 12, 100000001, 13, 13, 100000001, 14, 14, 100000001, 15, 15, 100000001, 16, 16, 100000001, 17, 17, 100000001, 18, 18, 100000001, 19, 19, 100000001, 20, 20, 100000001, 21, 21, 100000001, 22, 22, 100000001, 23, 23, 100000001, 100000002, 8, 100000011, 100000012, 4, 28, 26, 9, 27, 100000010, 24, 100000008, 100000009, 8, 29, 100000007, 9, 100000006, 100000007, 3, 100000003, 31, 4, 100000004, 100000005} 323 324 type conditionContext struct { 325 PartitionResult *awsrulesfn.PartitionConfig 326 } 327 328 func evalCondition(idx int, params *EndpointParameters, c *conditionContext) bool { 329 switch idx { 330 case 0: 331 return params.Endpoint != nil 332 case 1: 333 return params.Region != nil 334 case 2: 335 if v := awsrulesfn.GetPartition(*params.Region); v != nil { 336 c.PartitionResult = v 337 return true 338 } 339 return false 340 case 3: 341 return *params.UseFIPS == true 342 case 4: 343 return *params.UseDualStack == true 344 case 5: 345 return *params.Region == "aws-global" 346 case 6: 347 return *params.UseGlobalEndpoint == true 348 case 7: 349 return *params.Region == "eu-central-1" 350 case 8: 351 return c.PartitionResult.SupportsDualStack == true 352 case 9: 353 return c.PartitionResult.SupportsFIPS == true 354 case 10: 355 return *params.Region == "ap-south-1" 356 case 11: 357 return *params.Region == "eu-north-1" 358 case 12: 359 return *params.Region == "eu-west-1" 360 case 13: 361 return *params.Region == "eu-west-2" 362 case 14: 363 return *params.Region == "eu-west-3" 364 case 15: 365 return *params.Region == "sa-east-1" 366 case 16: 367 return *params.Region == "us-east-1" 368 case 17: 369 return *params.Region == "us-east-2" 370 case 18: 371 return *params.Region == "us-west-2" 372 case 19: 373 return *params.Region == "us-west-1" 374 case 20: 375 return *params.Region == "ca-central-1" 376 case 21: 377 return *params.Region == "ap-southeast-1" 378 case 22: 379 return *params.Region == "ap-northeast-1" 380 case 23: 381 return *params.Region == "ap-southeast-2" 382 case 24: 383 return c.PartitionResult.Name == "aws-us-gov" 384 } 385 return false 386 } 387 388 func resolveResult(idx int32, params *EndpointParameters, c *conditionContext) (smithyendpoints.Endpoint, error) { 389 switch idx { 390 case 0: 391 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint resolution failed: no matching rule") 392 case 1: 393 uriString := "https://sts.amazonaws.com" 394 uri, err := url.Parse(uriString) 395 if err != nil { 396 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 397 } 398 return smithyendpoints.Endpoint{ 399 URI: *uri, 400 Headers: http.Header{}, 401 Properties: func() smithy.Properties { 402 var out smithy.Properties 403 smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ 404 { 405 SchemeID: "sigv4", 406 SignerProperties: func() smithy.Properties { 407 var sp smithy.Properties 408 smithyhttp.SetSigV4SigningName(&sp, "sts") 409 smithyhttp.SetSigV4ASigningName(&sp, "sts") 410 411 smithyhttp.SetSigV4SigningRegion(&sp, "us-east-1") 412 return sp 413 }(), 414 }, 415 }) 416 return out 417 }(), 418 }, nil 419 case 2: 420 uriString := func() string { 421 var out strings.Builder 422 out.WriteString("https://sts.") 423 out.WriteString(*params.Region) 424 out.WriteString(".") 425 out.WriteString(c.PartitionResult.DnsSuffix) 426 return out.String() 427 }() 428 uri, err := url.Parse(uriString) 429 if err != nil { 430 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 431 } 432 return smithyendpoints.Endpoint{ 433 URI: *uri, 434 Headers: http.Header{}, 435 Properties: func() smithy.Properties { 436 var out smithy.Properties 437 smithyauth.SetAuthOptions(&out, []*smithyauth.Option{ 438 { 439 SchemeID: "sigv4", 440 SignerProperties: func() smithy.Properties { 441 var sp smithy.Properties 442 smithyhttp.SetSigV4SigningName(&sp, "sts") 443 smithyhttp.SetSigV4ASigningName(&sp, "sts") 444 445 smithyhttp.SetSigV4SigningRegion(&sp, *params.Region) 446 return sp 447 }(), 448 }, 449 }) 450 return out 451 }(), 452 }, nil 453 case 3: 454 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: FIPS and custom endpoint are not supported") 455 case 4: 456 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Dualstack and custom endpoint are not supported") 457 case 5: 458 uriString := *params.Endpoint 459 uri, err := url.Parse(uriString) 460 if err != nil { 461 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 462 } 463 return smithyendpoints.Endpoint{ 464 URI: *uri, 465 Headers: http.Header{}, 466 }, nil 467 case 6: 468 uriString := func() string { 469 var out strings.Builder 470 out.WriteString("https://sts-fips.") 471 out.WriteString(*params.Region) 472 out.WriteString(".") 473 out.WriteString(c.PartitionResult.DualStackDnsSuffix) 474 return out.String() 475 }() 476 uri, err := url.Parse(uriString) 477 if err != nil { 478 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 479 } 480 return smithyendpoints.Endpoint{ 481 URI: *uri, 482 Headers: http.Header{}, 483 }, nil 484 case 7: 485 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "FIPS and DualStack are enabled, but this partition does not support one or both") 486 case 8: 487 uriString := func() string { 488 var out strings.Builder 489 out.WriteString("https://sts.") 490 out.WriteString(*params.Region) 491 out.WriteString(".amazonaws.com") 492 return out.String() 493 }() 494 uri, err := url.Parse(uriString) 495 if err != nil { 496 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 497 } 498 return smithyendpoints.Endpoint{ 499 URI: *uri, 500 Headers: http.Header{}, 501 }, nil 502 case 9: 503 uriString := func() string { 504 var out strings.Builder 505 out.WriteString("https://sts-fips.") 506 out.WriteString(*params.Region) 507 out.WriteString(".") 508 out.WriteString(c.PartitionResult.DnsSuffix) 509 return out.String() 510 }() 511 uri, err := url.Parse(uriString) 512 if err != nil { 513 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 514 } 515 return smithyendpoints.Endpoint{ 516 URI: *uri, 517 Headers: http.Header{}, 518 }, nil 519 case 10: 520 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "FIPS is enabled but this partition does not support FIPS") 521 case 11: 522 uriString := func() string { 523 var out strings.Builder 524 out.WriteString("https://sts.") 525 out.WriteString(*params.Region) 526 out.WriteString(".") 527 out.WriteString(c.PartitionResult.DualStackDnsSuffix) 528 return out.String() 529 }() 530 uri, err := url.Parse(uriString) 531 if err != nil { 532 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 533 } 534 return smithyendpoints.Endpoint{ 535 URI: *uri, 536 Headers: http.Header{}, 537 }, nil 538 case 12: 539 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "DualStack is enabled but this partition does not support DualStack") 540 case 13: 541 uriString := func() string { 542 var out strings.Builder 543 out.WriteString("https://sts.") 544 out.WriteString(*params.Region) 545 out.WriteString(".") 546 out.WriteString(c.PartitionResult.DnsSuffix) 547 return out.String() 548 }() 549 uri, err := url.Parse(uriString) 550 if err != nil { 551 return smithyendpoints.Endpoint{}, fmt.Errorf("Failed to parse uri: %s", uriString) 552 } 553 return smithyendpoints.Endpoint{ 554 URI: *uri, 555 Headers: http.Header{}, 556 }, nil 557 case 14: 558 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Missing Region") 559 } 560 return smithyendpoints.Endpoint{}, fmt.Errorf("endpoint rule error, invalid result index: %d", idx) 561 } 562 563 // EndpointResolverV2 provides the interface for resolving service endpoints. 564 type EndpointResolverV2 interface { 565 ResolveEndpoint(ctx context.Context, params EndpointParameters) ( 566 smithyendpoints.Endpoint, error, 567 ) 568 } 569 570 // resolver provides the implementation for resolving endpoints. 571 type resolver struct{} 572 573 func NewDefaultEndpointResolverV2() EndpointResolverV2 { 574 return &resolver{} 575 } 576 577 // ResolveEndpoint attempts to resolve the endpoint with the provided options, 578 // returning the endpoint if found. Otherwise an error is returned. 579 func (r *resolver) ResolveEndpoint( 580 ctx context.Context, params EndpointParameters, 581 ) ( 582 endpoint smithyendpoints.Endpoint, err error, 583 ) { 584 params = params.WithDefaults() 585 if err = params.ValidateRequired(); err != nil { 586 return endpoint, fmt.Errorf("endpoint parameters are not valid, %w", err) 587 } 588 589 c := &conditionContext{} 590 ref := bdd.Evaluate(bddNodes[:], bddRoot, func(idx int) bool { 591 return evalCondition(idx, ¶ms, c) 592 }) 593 return resolveResult(ref, ¶ms, c) 594 } 595 596 type endpointParamsBinder interface { 597 bindEndpointParams(*EndpointParameters) 598 } 599 600 func bindEndpointParams(ctx context.Context, input interface{}, options Options) (*EndpointParameters, error) { 601 params := &EndpointParameters{} 602 603 region, err := bindRegion(options.Region) 604 if err != nil { 605 return nil, err 606 } 607 params.Region = region 608 609 params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) 610 params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) 611 params.Endpoint = options.BaseEndpoint 612 613 if b, ok := input.(endpointParamsBinder); ok { 614 b.bindEndpointParams(params) 615 } 616 617 return params, nil 618 } 619 620 type resolveEndpointV2Middleware struct { 621 options Options 622 } 623 624 func (*resolveEndpointV2Middleware) ID() string { 625 return "ResolveEndpointV2" 626 } 627 628 func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( 629 out middleware.FinalizeOutput, metadata middleware.Metadata, err error, 630 ) { 631 _, span := tracing.StartSpan(ctx, "ResolveEndpoint") 632 defer span.End() 633 634 if awsmiddleware.GetRequiresLegacyEndpoints(ctx) { 635 return next.HandleFinalize(ctx, in) 636 } 637 638 req, ok := in.Request.(*smithyhttp.Request) 639 if !ok { 640 return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) 641 } 642 643 if m.options.EndpointResolverV2 == nil { 644 return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") 645 } 646 647 params, err := bindEndpointParams(ctx, getOperationInput(ctx), m.options) 648 if err != nil { 649 return out, metadata, fmt.Errorf("failed to bind endpoint params, %w", err) 650 } 651 endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", 652 func() (smithyendpoints.Endpoint, error) { 653 return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) 654 }) 655 if err != nil { 656 return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) 657 } 658 659 span.SetProperty("client.call.resolved_endpoint", endpt.URI.String()) 660 661 if endpt.URI.RawPath == "" && req.URL.RawPath != "" { 662 endpt.URI.RawPath = endpt.URI.Path 663 } 664 req.URL.Scheme = endpt.URI.Scheme 665 req.URL.Host = endpt.URI.Host 666 req.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path) 667 req.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath) 668 for k := range endpt.Headers { 669 req.Header.Set(k, endpt.Headers.Get(k)) 670 } 671 672 rscheme := getResolvedAuthScheme(ctx) 673 if rscheme == nil { 674 return out, metadata, fmt.Errorf("no resolved auth scheme") 675 } 676 677 opts, _ := smithyauth.GetAuthOptions(&endpt.Properties) 678 for _, o := range opts { 679 rscheme.SignerProperties.SetAll(&o.SignerProperties) 680 } 681 682 span.End() 683 return next.HandleFinalize(ctx, in) 684 }