U
    m/e/w                     @   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 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d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)UserAgentString)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-22   c                   @   s   e Zd Zd: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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$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 ZdS )=ClientArgsCreatorNc                 C   s<   || _ || _|| _|| _|| _|d kr2t | _n|| _d S N)_event_emitter_response_parser_factory_loader_exceptions_factory_config_storer   Zfrom_environment_session_ua_creator)selfevent_emitter
user_agentresponse_parser_factoryloaderexceptions_factoryZconfig_storeuser_agent_creator r   1/tmp/pip-unpacked-wheel-3gylhwtm/botocore/args.py__init__A   s    
zClientArgsCreator.__init__c           #      C   sl  |  |||	||||}|d }|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|}!|r@|jnd }"|"|_||||||| j||| j| |!dS )Nservice_nameparameter_validationendpoint_configprotocolconfig_kwargs	s3_configmetadata	partitionsocket_optionsconfigured_endpoint_url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_resolverr   )compute_client_argsgetcopyr   r   Z
service_idr   r   Zcreate_endpointr   r0   r1   connect_timeoutread_timeoutr3   r4   botocore	serializeZcreate_serializerparserscreate_parser_build_endpoint_resolverr   with_client_configr   Z_supplied_user_agentr   r   )#r   r8   r+   	is_securer.   r/   credentialsscoped_configr9   endpoint_bridgeZ
auth_tokenendpoints_ruleset_datapartition_dataZ
final_argsr    r!   r"   r#   r$   r%   r'   r(   r)   r*   endpoint_region_namer   ZsignerZ
new_configZendpoint_creatorr6   r5   r7   Zruleset_resolverZclient_ua_creatorZsupplied_uar   r   r   get_client_argsU   s    



 z!ClientArgsCreator.get_client_argsc                 C   s  |j }|jd }	d}
|r$|js$d}
n|rB|d}|d k	rBt|}
| |}| j||d}| j||||||d}|d dg }| j	|
 }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|j|j|j|jd | | | | | | | | | |}| |}|rxd|krx|d krpi }d|d< ||
|||	||| ||dS )Nr#   TFr!   )r9   r.   )r    r+   r.   rE   rH   r%   r&   tagsr+   r,   )r+   r,   r   Z	dualstack)use_dualstack_endpointZfips)use_fips_endpoint)r=   r>   r0   r1   r4   retriesr3   inject_host_prefixtcp_keepaliveuser_agent_extrauser_agent_appid"request_min_compression_size_bytesdisable_request_compressionrN   )r    r!   r)   r"   r#   r$   r%   r(   ) endpoint_prefixr&   r!   r;   r   compute_s3_config _compute_configured_endpoint_url_compute_endpoint_configr   rD   Z	to_stringdictupdater=   r>   r0   r1   r4   rP   r3   rQ   rR   rS   rT   rU   rV   _compute_retry_config_compute_connect_timeout _compute_user_agent_appid_config#_compute_request_compression_config_is_s3_service_compute_socket_options)r   r8   r9   rH   r+   r.   rE   rG   r    r#   r!   Z	raw_valuer%   r)   r"   Zendpoint_variant_tagsZpreliminary_ua_stringr$   Zis_s3_servicer   r   r   r:      s    












 z%ClientArgsCreator.compute_client_argsc                 C   s0   |d k	r|S |  |r$td |S | jdS )Nz"Ignoring configured endpoint URLs.r.   ) _ignore_configured_endpoint_urlsloggerdebugr   get_config_variable)r   r9   r.   r   r   r   rY   (  s    

z2ClientArgsCreator._compute_configured_endpoint_urlc                 C   s    |r|j d k	r|j S | jdS )Nignore_configured_endpoint_urls)rg   r   rf   )r   r9   r   r   r   rc   2  s    z2ClientArgsCreator._ignore_configured_endpoint_urlsc                 C   sF   | j d}|d k	rB|jd k	rB|d kr.|j}n| }||j |S )Nr-   )r   rf   r-   r<   r\   )r   r9   Zs3_configurationr   r   r   rX   =  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   ra   P  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.   rE   rH   r-   r%   sts)_compute_s3_endpoint_config_compute_sts_endpoint_config_resolve_endpoint)r   r    r+   r.   rE   rH   r%   resolve_endpoint_kwargsr   r   r   rZ   Z  s    
z*ClientArgsCreator._compute_endpoint_configc                 K   sT   |  |d |}|rd |d< | jf |}| ||d  |rP|d dkrPd|d< |S )Nr+   rH   r   r   )_should_force_s3_globalrk   !_set_region_if_custom_s3_endpoint)r   r%   rl   Zforce_s3_globalr"   r   r   r   ri   r  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   rm     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   ro     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"   rH   r6   r   r   r   rn     s    


z3ClientArgsCreator._set_region_if_custom_s3_endpointc                 K   s6   | j f |}| |d |d |r2| ||d  |S )Nr+   r.   rE   )rk   _should_set_global_sts_endpoint_set_global_sts_endpoint)r   rl   r"   r   r   r   rj     s     z.ClientArgsCreator._compute_sts_endpoint_configc                 C   s6   |o| di  d}|s|r"dS |  dko4|tkS )Nr&   rM   Fr
   )r;   "_get_sts_regional_endpoints_configLEGACY_GLOBAL_STS_REGIONS)r   r+   r.   r"   Zhas_variant_tagsr   r   r   rt     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   rf   rp   r?   rq   Z&InvalidSTSRegionalEndpointsConfigError)r   rx   r   r   r   rv     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"   rE   schemer   r   r   ru     s    z*ClientArgsCreator._set_global_sts_endpointc                 C   s   | ||||S r   rr   )r   r    r+   r.   rE   rH   r   r   r   rk     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   rR   F)	socketIPPROTO_TCPTCP_NODELAYrR   _ensure_booleanr;   append
SOL_SOCKETSO_KEEPALIVE)r   rG   r9   r(   Zclient_keepaliveZscoped_keepaliver   r   r   rb     s    

z)ClientArgsCreator._compute_socket_optionsc                 C   s   |  | | | d S r   )_compute_retry_max_attempts_compute_retry_mode)r   r$   r   r   r   r]     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 )NrP   Ztotal_max_attemptsmax_attemptsr|   )r;   popr   rf   )r   r$   rP   valuer   r   r   r   r     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 )NrP   mode
retry_moder
   r;   r   rf   )r   r$   rP   r   r   r   r   r     s    

z%ClientArgsCreator._compute_retry_modec                 C   s2   | d}|d k	rd S | jd}|r.||d< d S )Nr=   r   )r   r$   r=   r   r   r   r^     s    
z*ClientArgsCreator._compute_connect_timeoutc                 C   sd   | d}| d}|d kr(| jd}| |}||d< |d krP| jd}nt|}||d< d S )NrU   rV   )r;   r   rf   _validate_min_compression_sizer   )r   r$   min_sizedisabledr   r   r   r`   )  s    


z5ClientArgsCreator._compute_request_compression_configc              	   C   s   d}d}|d k	rd| d}zt |}W n: ttfk
rb   | dt| d}tjj|dY nX ||  krx|ksn | d| d	| d
}tjj|d|S )Nr|   i   zInvalid value "z)" for request_min_compression_size_bytes.z$ Value must be an integer. Received z	 instead.)	error_msgz Value must be between z and .)int
ValueError	TypeErrortyper?   rq   ZInvalidConfigError)r   r   Zmin_allowed_min_sizeZmax_allowed_min_sizeZerror_msg_basemsgr   r   r   r   ?  s     
z0ClientArgsCreator._validate_min_compression_sizec                 C   s   t |tr|S | dkS d S )Ntrue)
isinstanceboollower)r   valr   r   r   r   X  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-   rh   )r+   r    r%   rH   client_endpoint_urllegacy_endpoint_url)Zendpoint_ruleset_datarJ   r8   builtinsclient_contextr   Zuse_sslZrequested_auth_scheme)rX   rW   *compute_endpoint_resolver_builtin_defaultshostra   r,   r   )r   rI   rJ   r9   r8   rK   r+   r.   r6   rE   rH   r   Zs3_config_rawZservice_name_rawZeprv2_region_nameZresolver_builtinsr   Zsig_versionr   r   r   rC   ^  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pathrO   )r+   r.   r"   Zuse_arn_regionTZ$s3_disable_multiregion_access_points)Zresolver_uses_builtin_datar;   r	   EPRBuiltinsZ
AWS_REGIONZAWS_USE_FIPSZ$_resolve_endpoint_variant_config_varZAWS_USE_DUALSTACKZ_resolve_use_dualstack_endpointZAWS_STS_USE_GLOBAL_ENDPOINTrt   ZAWS_S3_USE_GLOBAL_ENDPOINTrm   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%   rH   r   r   Zgiven_endpointZforce_path_styler   r   r   r     sz    
 
          z<ClientArgsCreator.compute_endpoint_resolver_builtin_defaultsc                 C   sP   | d}|d kr| jd}|d k	rDt|tkrDtdt d ||d< d S )NrT   zHThe configured value for user_agent_appid exceeds the maximum length of z characters.)r;   r   rf   lenUSERAGENT_APPID_MAXLENrd   warning)r   r$   rT   r   r   r   r_     s    


z2ClientArgsCreator._compute_user_agent_appid_config)N)NNN)N)__name__
__module____qualname__r   rL   r:   rY   rc   rX   ra   rZ   ri   rm   ro   rn   rj   rt   rv   ru   rk   rb   r]   r   r   r^   r`   r   r   rC   r   r_   r   r   r   r   r   @   s@   	 
   
kh

	
 >Tr   )__doc__r<   loggingr}   Zbotocore.exceptionsr?   Zbotocore.parsersZbotocore.serializeZbotocore.configr   Zbotocore.endpointr   Zbotocore.regionsr   r   r   Zbotocore.signersr   Zbotocore.useragentr   Zbotocore.utilsr   r	   	getLoggerr   rd   rp   rw   r   r   r   r   r   r   <module>   sH   
