o
    ~j@c@                     @   s~   d Z ddlZddlZddlmZ ddlmZmZmZ e	e
ZdZdi iZG dd dZG d	d
 d
eZG dd deeZdS )zResolves regions and endpoints.

This module implements endpoint resolution, including resolving endpoints for a
given service and region and resolving the available endpoints for a service
in a specific AWS partition.
    N)Enum)EndpointVariantErrorNoRegionErrorUnknownRegionErrorz{service}.{region}.{dnsSuffix}	endpointsc                   @   s.   e Zd ZdZdddZdd Z	dd	d
ZdS )BaseEndpointResolverz3Resolves regions and endpoints. Must be subclassed.Nc                 C      t )a7  Resolves an endpoint for a service and region combination.

        :type service_name: string
        :param service_name: Name of the service to resolve an endpoint for
            (e.g., s3)

        :type region_name: string
        :param region_name: Region/endpoint name to resolve (e.g., us-east-1)
            if no region is provided, the first found partition-wide endpoint
            will be used if available.

        :rtype: dict
        :return: Returns a dict containing the following keys:
            - partition: (string, required) Resolved partition name
            - endpointName: (string, required) Resolved endpoint name
            - hostname: (string, required) Hostname to use for this endpoint
            - sslCommonName: (string) sslCommonName to use for this endpoint.
            - credentialScope: (dict) Signature version 4 credential scope
              - region: (string) region name override when signing.
              - service: (string) service name override when signing.
            - signatureVersions: (list<string>) A list of possible signature
              versions, including s3, v4, v2, and s3v4
            - protocols: (list<string>) A list of supported protocols
              (e.g., http, https)
            - ...: Other keys may be included as well based on the metadata
        NotImplementedError)selfservice_nameregion_name r   4usr/lib/python3.10/site-packages/botocore/regions.pyconstruct_endpoint%   s   z'BaseEndpointResolver.construct_endpointc                 C   r   )zLists the partitions available to the endpoint resolver.

        :return: Returns a list of partition names (e.g., ["aws", "aws-cn"]).
        r	   )r   r   r   r   get_available_partitionsB   s   z-BaseEndpointResolver.get_available_partitionsawsFc                 C   r   )a  Lists the endpoint names of a particular partition.

        :type service_name: string
        :param service_name: Name of a service to list endpoint for (e.g., s3)

        :type partition_name: string
        :param partition_name: Name of the partition to limit endpoints to.
            (e.g., aws for the public AWS endpoints, aws-cn for AWS China
            endpoints, aws-us-gov for AWS GovCloud (US) Endpoints, etc.

        :type allow_non_regional: bool
        :param allow_non_regional: Set to True to include endpoints that are
             not regional endpoints (e.g., s3-external-1,
             fips-us-gov-west-1, etc).
        :return: Returns a list of endpoint names (e.g., ["us-east-1"]).
        r	   )r   r   partition_nameallow_non_regionalr   r   r   get_available_endpointsI   s   z,BaseEndpointResolver.get_available_endpointsN)r   F)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   "   s    
r   c                   @   s   e Zd ZdZddgZd%ddZd&dd	Zd
d Z			d'ddZ	d(ddZ					d)ddZ
dd Z	d%ddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdS )*EndpointResolverz7Resolves endpoints based on partition endpoint metadatazaws-isoz	aws-iso-bFc                 C   s    d|vrt d|| _|| _dS )a  
        :type endpoint_data: dict
        :param endpoint_data: A dict of partition data.

        :type uses_builtin_data: boolean
        :param uses_builtin_data: Whether the endpoint data originates in the
            package's data directory.
        
partitionsz%Missing "partitions" in endpoint dataN)
ValueError_endpoint_datauses_builtin_data)r   endpoint_datar   r   r   r   __init__d   s   	
zEndpointResolver.__init__r   c                 C   sB   | j d D ]}|d |krq|d }||vrq|| d   S d S )Nr   	partitionservicesr   )r   )r   r   r   r"   r#   r   r   r   get_service_endpoints_datar   s   z+EndpointResolver.get_service_endpoints_datac                 C   s&   g }| j d D ]	}||d  q|S )Nr   r"   )r   append)r   resultr"   r   r   r   r   {   s   z)EndpointResolver.get_available_partitionsNc                 C   s   g }| j d D ]@}|d |krq|d }||vrq|| d }|D ]%}	|	|d v }
|r=|
r=| ||	 |}|r<||	 q!|sA|
rF||	 q!q|S )Nr   r"   r#   r   regions)r   _retrieve_variant_datar%   )r   r   r   r   endpoint_variant_tagsr&   r"   r#   Zservice_endpointsendpoint_nameZis_regional_endpointZvariant_datar   r   r   r      s,   

z(EndpointResolver.get_available_endpointsc                 C   s\   | j d D ]&}|d |kr+|r%| |d|}|r$d|v r$|d   S q|d   S qd S )Nr   r"   defaults	dnsSuffix)r   r(   get)r   r   r)   r"   variantr   r   r   get_partition_dns_suffix   s   
	z)EndpointResolver.get_partition_dns_suffixc           	      C   s   |dkr|r|d u rd}|d ur4d }| j d D ]
}|d |kr!|}q|d ur2| |||||d}|S d S | j d D ]}|rE|d | jv rEq9| |||||}|rT|  S q9d S )NZs3z	us-east-1r   r"   T)r   _endpoint_for_partition!_UNSUPPORTED_DUALSTACK_PARTITIONS)	r   r   r   r   use_dualstack_endpointuse_fips_endpointZvalid_partitionr"   r&   r   r   r   r      sN   	z#EndpointResolver.construct_endpointc                 C   s4   | j d D ]}| ||r|d   S qt|dd)Nr   r"   z,No partition found for provided region_name.)r   	error_msg)r   _region_matchr   )r   r   r"   r   r   r   get_partition_for_region   s   z)EndpointResolver.get_partition_for_regionc                 C   s  |d }|r|| j v rd| }tdg|d|d |t}	|d u r.d|	v r+|	d }nt |||	|||d}
||	d v rE| jdi |
S | ||sM|r|	d}|	d	d
}|rp|sptd||| ||
d< | jdi |
S td|| | jdi |
S d S )Nr"   z@Dualstack endpoints are currently not supported for %s partition	dualstacktagsr4   r#   ZpartitionEndpoint)r"   r   service_datar*   r2   r3   r   ZisRegionalizedTz'Using partition endpoint for %s, %s: %sr*   z*Creating a regex based endpoint for %s, %sr   )	r1   r   r-   DEFAULT_SERVICE_DATAr   _resolver5   LOGdebug)r   r"   r   r   r2   r3   Zforce_partitionr   r4   r:   Zresolve_kwargsZpartition_endpointZis_regionalizedr   r   r   r0      sX   	



z(EndpointResolver._endpoint_for_partitionc                 C   s0   ||d v rdS d|v rt |d |S dS )Nr'   TZregionRegexF)recompilematch)r   r"   r   r   r   r   r5   (  s
   zEndpointResolver._region_matchc                 C   s>   | dg }|D ]}t|d t|kr| }|  S qd S )Nvariantsr9   )r-   setcopy)r   r    r9   rB   r.   r&   r   r   r   r(   /  s   z'EndpointResolver._retrieve_variant_datac                 C   s$   g }|r	| d |r| d |S )Nr7   Zfips)r%   )r   r2   r3   r9   r   r   r   _create_tag_list6  s   

z!EndpointResolver._create_tag_listc                 C   s4   i }|||fD ]}|  ||}|r| || q|S r   )r(   _merge_keys)r   r9   r    service_defaultspartition_defaultsr&   rB   r.   r   r   r   _resolve_variant>  s   z!EndpointResolver._resolve_variantc                 C   s"  | di  |i }| drtd|  | di }| di }	| ||}
|
rK| |
|||	}|i krDd| d| }t|
|d| || n|}d|vrW|d |d< |d	 |d	< ||d
< | || | |	| | ||d |||d |d< d|v r| ||d |||d |d< |S )Nr   Z
deprecatedz5Client is configured with the deprecated endpoint: %sr+   zEndpoint does not exist for z in region r8   r,   r"   ZendpointNamehostnameZsslCommonName)r-   r=   warningrE   rI   r   rF   _expand_template)r   r"   r   r:   r*   r2   r3   r    rG   rH   r9   r&   r4   r   r   r   r<   H  s\   	
zEndpointResolver._resolvec                 C   s"   |D ]}||vr|| ||< qd S r   r   )r   Z	from_datar&   keyr   r   r   rF     s
   zEndpointResolver._merge_keysc                 C   s   |j |||dS )N)ZserviceZregionr,   )format)r   r"   templater   r*   r,   r   r   r   rL     s   z!EndpointResolver._expand_template)F)r   )r   FNr   )NNFF)r   r   r   r   r1   r!   r$   r   r   r/   r   r6   r0   r5   r(   rE   rI   r<   rF   rL   r   r   r   r   r   _   s6    

		


2
A
Br   c                   @   s8   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdS )EndpointResolverBuiltinszAWS::RegionzAWS::UseFIPSzAWS::UseDualStackzAWS::STS::UseGlobalEndpointzAWS::S3::UseGlobalEndpointzAWS::S3::AcceleratezAWS::S3::ForcePathStylezAWS::S3::UseArnRegionzAWS::S3Control::UseArnRegionz'AWS::S3::DisableMultiRegionAccessPointszSDK::EndpointN)r   r   r   Z
AWS_REGIONZAWS_USE_FIPSZAWS_USE_DUALSTACKZAWS_STS_USE_GLOBAL_ENDPOINTZAWS_S3_USE_GLOBAL_ENDPOINTZAWS_S3_ACCELERATEZAWS_S3_FORCE_PATH_STYLEZAWS_S3_USE_ARN_REGIONZAWS_S3CONTROL_USE_ARN_REGIONZAWS_S3_DISABLE_MRAPZSDK_ENDPOINTr   r   r   r   rP     s    rP   )r   loggingr?   enumr   Zbotocore.exceptionsr   r   r   	getLoggerr   r=   ZDEFAULT_URI_TEMPLATEr;   r   r   strrP   r   r   r   r   <module>   s   
=  :