src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

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, &params, c)
    592 	})
    593 	return resolveResult(ref, &params, 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 }