12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // Package endpoints validates regional endpoints for services.
- package endpoints
- //go:generate go run -tags codegen ../model/cli/gen-endpoints/main.go endpoints.json endpoints_map.go
- //go:generate gofmt -s -w endpoints_map.go
- import (
- "fmt"
- "regexp"
- "strings"
- )
- // NormalizeEndpoint takes and endpoint and service API information to return a
- // normalized endpoint and signing region. If the endpoint is not an empty string
- // the service name and region will be used to look up the service's API endpoint.
- // If the endpoint is provided the scheme will be added if it is not present.
- func NormalizeEndpoint(endpoint, serviceName, region string, disableSSL, useDualStack bool) (normEndpoint, signingRegion string) {
- if endpoint == "" {
- return EndpointForRegion(serviceName, region, disableSSL, useDualStack)
- }
- return AddScheme(endpoint, disableSSL), ""
- }
- // EndpointForRegion returns an endpoint and its signing region for a service and region.
- // if the service and region pair are not found endpoint and signingRegion will be empty.
- func EndpointForRegion(svcName, region string, disableSSL, useDualStack bool) (endpoint, signingRegion string) {
- dualStackField := ""
- if useDualStack {
- dualStackField = "/dualstack"
- }
- derivedKeys := []string{
- region + "/" + svcName + dualStackField,
- region + "/*" + dualStackField,
- "*/" + svcName + dualStackField,
- "*/*" + dualStackField,
- }
- for _, key := range derivedKeys {
- if val, ok := endpointsMap.Endpoints[key]; ok {
- ep := val.Endpoint
- ep = strings.Replace(ep, "{region}", region, -1)
- ep = strings.Replace(ep, "{service}", svcName, -1)
- endpoint = ep
- signingRegion = val.SigningRegion
- break
- }
- }
- return AddScheme(endpoint, disableSSL), signingRegion
- }
- // Regular expression to determine if the endpoint string is prefixed with a scheme.
- var schemeRE = regexp.MustCompile("^([^:]+)://")
- // AddScheme adds the HTTP or HTTPS schemes to a endpoint URL if there is no
- // scheme. If disableSSL is true HTTP will be added instead of the default HTTPS.
- func AddScheme(endpoint string, disableSSL bool) string {
- if endpoint != "" && !schemeRE.MatchString(endpoint) {
- scheme := "https"
- if disableSSL {
- scheme = "http"
- }
- endpoint = fmt.Sprintf("%s://%s", scheme, endpoint)
- }
- return endpoint
- }
|