U
    M8cb                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZmZ eeZd	d
gZddddddddddddddddgZG dd dZdS )zInternal module to help with normalizing botocore client args.

This module (and all function/classes within this module) should be
considered internal, and *not* a public API.

    N)Config)EndpointCreator)EndpointResolverBuiltins)EndpointRulesetResolver)RequestSigner)ensure_booleanis_s3_accelerate_urllegacyZregionalzap-northeast-1z
ap-south-1zap-southeast-1zap-southeast-2
aws-globalzca-central-1zeu-central-1z
eu-north-1z	eu-west-1z	eu-west-2z	eu-west-3z	sa-east-1	us-east-1z	us-east-2z	us-west-1z	us-west-2c                   @   s   e Zd Zdd Zd0ddZ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d Zdd Zdd Zdd Zdd Zd1d 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 )2ClientArgsCreatorc                 C   s(   || _ || _|| _|| _|| _|| _d S N)_event_emitter_user_agent_response_parser_factory_loader_exceptions_factory_config_store)selfevent_emitter
user_agentresponse_parser_factoryloaderexceptions_factoryZconfig_store r   1/tmp/pip-unpacked-wheel-ozje0y8b/botocore/args.py__init__=   s    	zClientArgsCreator.__init__Nc                  C   s@  |  |||	||||}|d }|d }|d }|d }|d }|d }|d dd }|d	 }|d
 }|d }t| j}t|j||d |d |||
}||d< tf |}t|}|j|||d || j	|j
|j|j|jf||j|jd}tj||}tj|}| ||||||||||	|}||||||| j||| j|dS )Nservice_nameparameter_validationendpoint_configprotocolconfig_kwargs	s3_configmetadata	partitionsocket_optionssigning_regionregion_nameZsigning_namesignature_versions3endpoint_url)
r'   r*   verifyr   max_pool_connectionsproxiestimeoutr%   client_certproxies_config)
serializerendpointresponse_parserr   Zrequest_signerservice_modelr   client_configr$   r   Zendpoint_ruleset_resolver)compute_client_argsgetcopyr   r   Z
service_idr   r   Zcreate_endpointr   r,   r-   connect_timeoutread_timeoutr/   r0   botocore	serializeZcreate_serializerparserscreate_parser_build_endpoint_resolverr   r   ) r   r4   r'   	is_securer*   r+   credentialsscoped_configr5   endpoint_bridgeZ
auth_tokenendpoints_ruleset_datapartition_dataZ
final_argsr   r   r   r    r!   r"   r$   r%   r&   endpoint_region_namer   ZsignerZ
new_configZendpoint_creatorr2   r1   r3   Zruleset_resolverr   r   r   get_client_argsM   s    



 z!ClientArgsCreator.get_client_argsc                 C   s  |j }|jd }	d}
|r$|js$d}
n|rB|d}|d k	rBt|}
| j}|d k	rx|jd k	r`|j}|jd k	rx|d|j 7 }| |}| j	||||||d}|d dg }t
|d	 |d
 |d}d|kr|jdd d|kr|jdd |d k	r|j|j|j|j|j|j|j|j|j|jd	 | | | | | |}| |}|rld|krl|d krdi }d|d< ||
|||	||| ||dS )Nr    TFr   z %s)r   r'   r*   r@   rC   r"   r#   tagsr'   r(   )r'   r(   r   Z	dualstack)use_dualstack_endpointZfips)use_fips_endpoint)	r9   r:   r,   r-   r0   retriesr/   inject_host_prefixtcp_keepaliverI   )r   r   r   r   r    r!   r"   r%   )endpoint_prefixr#   r   r7   r   r   r   Zuser_agent_extracompute_s3_config_compute_endpoint_configdictupdater9   r:   r,   r-   r0   rK   r/   rL   rM   _compute_retry_config_compute_connect_timeout_is_s3_service_compute_socket_options)r   r4   r5   rC   r'   r*   r@   rB   r   r    r   Z	raw_valuer   r"   r   Zendpoint_variant_tagsr!   Zis_s3_servicer   r   r   r6      s    












 z%ClientArgsCreator.compute_client_argsc                 C   sF   | j d}|d k	rB|jd k	rB|d kr.|j}n| }||j |S )Nr)   )r   get_config_variabler)   r8   rR   )r   r5   Zs3_configurationr   r   r   rO     s    
z#ClientArgsCreator.compute_s3_configc                 C   s   |dkS )a,  Whether the service is S3 or S3 Control.

        Note that throughout this class, service_name refers to the endpoint
        prefix, not the folder name of the service in botocore/data. For
        S3 Control, the folder name is 's3control' but the endpoint prefix is
        's3-control'.
        )r)   z
s3-controlr   )r   r   r   r   r   rU     s    z ClientArgsCreator._is_s3_servicec                 C   sL   |||||d}|dkr,| j f d|i|S |dkr@| jf |S | jf |S )N)r   r'   r*   r@   rC   r)   r"   sts)_compute_s3_endpoint_config_compute_sts_endpoint_config_resolve_endpoint)r   r   r'   r*   r@   rC   r"   resolve_endpoint_kwargsr   r   r   rP   #  s    
z*ClientArgsCreator._compute_endpoint_configc                 K   sT   |  |d |}|rd |d< | jf |}| ||d  |rP|d dkrPd|d< |S )Nr'   rC   r
   r   )_should_force_s3_globalr[   !_set_region_if_custom_s3_endpoint)r   r"   r\   Zforce_s3_globalr   r   r   r   rY   ;  s      z-ClientArgsCreator._compute_s3_endpoint_configc                 C   s6   d}|r"d|kr"|d }|  | |dk}|dko4|S )Nr	   Zus_east_1_regional_endpoint)r   N)_validate_s3_regional_config)r   r'   r"   Zs3_regional_configZis_global_regionr   r   r   r]   P  s    
z)ClientArgsCreator._should_force_s3_globalc                 C   s   |t krtjj|dd S )N)Z%s3_us_east_1_regional_endpoint_config)VALID_REGIONAL_ENDPOINTS_CONFIGr;   
exceptionsZ+InvalidS3UsEast1RegionalEndpointConfigError)r   Z
config_valr   r   r   r_   Y  s    z.ClientArgsCreator._validate_s3_regional_configc                 C   s>   |d d kr:|d d kr:| d}|d |d< |d |d< d S )Nr&   r'   r)   resolve)r   r   rC   r2   r   r   r   r^   _  s    


z3ClientArgsCreator._set_region_if_custom_s3_endpointc                 K   s6   | j f |}| |d |d |r2| ||d  |S )Nr'   r*   r@   )r[   _should_set_global_sts_endpoint_set_global_sts_endpoint)r   r\   r   r   r   r   rZ   m  s     z.ClientArgsCreator._compute_sts_endpoint_configc                 C   s6   |o| di  d}|s|r"dS |  dko4|tkS )Nr#   rH   Fr	   )r7   "_get_sts_regional_endpoints_configLEGACY_GLOBAL_STS_REGIONS)r   r'   r*   r   Zhas_variant_tagsr   r   r   rd   y  s     z1ClientArgsCreator._should_set_global_sts_endpointc                 C   s.   | j d}|sd}|tkr*tjj|d|S )NZsts_regional_endpointsr	   )sts_regional_endpoints_config)r   rW   r`   r;   ra   Z&InvalidSTSRegionalEndpointsConfigError)r   rh   r   r   r   rf     s    z4ClientArgsCreator._get_sts_regional_endpoints_configc                 C   s$   |rdnd}d| |d< d|d< d S )Nhttpshttpz%s://sts.amazonaws.comr*   r   r&   r   )r   r   r@   schemer   r   r   re     s    z*ClientArgsCreator._set_global_sts_endpointc                 C   s   | ||||S r   rb   )r   r   r'   r*   r@   rC   r   r   r   r[     s       z#ClientArgsCreator._resolve_endpointc                 C   sP   t jt jdfg}|o|j}|o.| |dd}|s8|rL|t jt jdf |S )N   rM   F)	socketIPPROTO_TCPTCP_NODELAYrM   _ensure_booleanr7   append
SOL_SOCKETSO_KEEPALIVE)r   rB   r5   r%   Zclient_keepaliveZscoped_keepaliver   r   r   rV     s    

z)ClientArgsCreator._compute_socket_optionsc                 C   s   |  | | | d S r   )_compute_retry_max_attempts_compute_retry_mode)r   r!   r   r   r   rS     s    
z'ClientArgsCreator._compute_retry_configc                 C   s   | d}|d k	rLd|kr*|dd  d S d|krL|d}|d |d< d S | jd}|d k	r||d krti }||d< ||d< d S )NrK   Ztotal_max_attemptsmax_attemptsrl   )r7   popr   rW   )r   r!   rK   valuerv   r   r   r   rt     s    


z-ClientArgsCreator._compute_retry_max_attemptsc                 C   sP   | d}|d kr i }||d< nd|kr,d S | jd}|d krDd}||d< d S )NrK   mode
retry_moder	   r7   r   rW   )r   r!   rK   rz   r   r   r   ru     s    

z%ClientArgsCreator._compute_retry_modec                 C   s2   | d}|d k	rd S | jd}|r.||d< d S )Nr9   r{   )r   r!   r9   r   r   r   rT     s    
z*ClientArgsCreator._compute_connect_timeoutc                 C   s   t |tr|S | dkS d S )Ntrue)
isinstanceboollower)r   valr   r   r   rp     s    
z!ClientArgsCreator._ensure_booleanc              
   C   s   |d krd S |  |pi }|j}|dks0|d kr6|}n|}| j||||
||jd}| |r`|ni }|d k	rr|jnd }t|||||||	|dS )N)r)   rX   )r'   r   r"   rC   client_endpoint_urllegacy_endpoint_url)Zendpoint_ruleset_datarE   r4   builtinsclient_contextr   Zuse_sslZrequested_auth_scheme)rO   rN   *compute_endpoint_resolver_builtin_defaultshostrU   r(   r   )r   rD   rE   r5   r4   rF   r'   r*   r2   r@   rC   r   Zs3_config_rawZservice_name_rawZeprv2_region_nameZresolver_builtinsr   Zsig_versionr   r   r   r?     s>    z*ClientArgsCreator._build_endpoint_resolverc           	      C   s   |r
|}n|  s|}nd }|ddr.d}n.|d k	rNt|sN|ddk}n|ddk}tj|tj|d krx|dpzdtj|d kr||pdtj	| j
|d d dtj| ||tj|ddtj|tj|dd	tj|ddtj|d
dtj|iS )NZuse_accelerate_endpointFZaddressing_styleZvirtualpathrJ   )r'   r*   r   Zuse_arn_regionTZ$s3_disable_multiregion_access_points)Zresolver_uses_builtin_datar7   r   EPRBuiltinsZ
AWS_REGIONZAWS_USE_FIPSZ$_resolve_endpoint_variant_config_varZAWS_USE_DUALSTACKZ_resolve_use_dualstack_endpointZAWS_STS_USE_GLOBAL_ENDPOINTrd   ZAWS_S3_USE_GLOBAL_ENDPOINTr]   ZAWS_S3_ACCELERATEZAWS_S3_FORCE_PATH_STYLEZAWS_S3_USE_ARN_REGIONZAWS_S3CONTROL_USE_ARN_REGIONZAWS_S3_DISABLE_MRAPZSDK_ENDPOINT)	r   r'   r   r"   rC   r   r   Zgiven_endpointZforce_path_styler   r   r   r   6  sz    
 
          z<ClientArgsCreator.compute_endpoint_resolver_builtin_defaults)NNN)N)__name__
__module____qualname__r   rG   r6   rO   rU   rP   rY   r]   r_   r^   rZ   rd   rf   re   r[   rV   rS   rt   ru   rT   rp   r?   r   r   r   r   r   r   <   s4      
cV
	
 >r   )__doc__r8   loggingrm   Zbotocore.exceptionsr;   Zbotocore.parsersZbotocore.serializeZbotocore.configr   Zbotocore.endpointr   Zbotocore.regionsr   r   r   Zbotocore.signersr   Zbotocore.utilsr   r   	getLoggerr   loggerr`   rg   r   r   r   r   r   <module>   sD   
