o
    YZßa@A  ã                   @   sü  d dl Zd dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ z
d d
lmZmZ W n e yq   d d
lmZmZ Y nw zd dl!m"Z# W n e y‰   d dlm#Z# Y nw d dl$Z%d dl&m'Z' d dl(m)Z)m*Z* d dl+m,Z,m-Z-m.Z.mZm/Z/mZmZm0Z0 e)ƒ  e 1e2¡Z3dZ4dZ5ej6 7ej6 8e9¡d¡Z:zd dl;m<Z< W n e yÜ   dd„ Z<Y nw dd„ Z=		d dd„Z>dd„ Z?G dd„ de@ƒZAG dd„ de@ƒZBdS )!é    N)Ú	b64encode)ÚPoolManagerÚproxy_from_urlÚTimeout)ÚRetry)ÚsslÚOP_NO_SSLv2ÚOP_NO_SSLv3ÚOP_NO_COMPRESSIONÚPROTOCOL_TLSÚDEFAULT_CIPHERS)ÚSSLError)ÚReadTimeoutError)ÚConnectTimeoutError)ÚNewConnectionErrorÚProtocolErrorÚ
ProxyError)ÚPROTOCOL_TLS_CLIENTÚOP_NO_TICKET)Úorig_util_SSLContext)Ú
SSLContext)Úunquote)Úfilter_ssl_warningsÚurlparse)ÚConnectionClosedErrorÚEndpointConnectionErrorÚHTTPClientErrorr   ÚProxyConnectionErrorr   r   ÚInvalidProxiesConfigErroré<   é
   z
cacert.pem)Úwherec                   C   s   t S ©N)ÚDEFAULT_CA_BUNDLE© r$   r$   ú6/usr/lib/python3/dist-packages/botocore/httpsession.pyr!   2   s   r!   c                 C   s&   | dur| S t ƒ }t d |¡¡ |S )NTzCertificate path: {0})r!   ÚloggerÚdebugÚformat)ÚverifyÚ	cert_pathr$   r$   r%   Úget_cert_path6   s
   r+   c                    sø   | r| t krt} t| ƒ‰ ˆ  |pt¡ |du rtjn|}|du r2d}|tO }|tO }|t	O }|t
O }ˆ  j|O  _|tjksCtjdkrNtˆ ddƒdurNdˆ _‡ fdd„}|tjkr`|ˆ _|ƒ  n|ƒ  |ˆ _tˆ dƒrztj d	¡}|rztjjsz|ˆ _ˆ S )
z× This function is a vendored version of the same function in urllib3

        We vendor this function to ensure that the SSL contexts we construct
        always use the std lib SSLContext instead of pyopenssl.
    Nr   )é   é   é   Úpost_handshake_authTc                      s   t ˆ dd ƒd urdˆ _d S d S )NÚcheck_hostnameF)Úgetattrr0   r$   ©Úcontextr$   r%   Údisable_check_hostnamen   s   
üz6create_urllib3_context.<locals>.disable_check_hostnameÚkeylog_filenameÚSSLKEYLOGFILE)r   r   r   Úset_ciphersr   r   ÚCERT_REQUIREDr   r	   r
   r   ÚoptionsÚsysÚversion_infor1   r/   Úverify_modeÚhasattrÚosÚenvironÚgetÚflagsÚignore_environmentr5   )Ússl_versionÚ	cert_reqsr9   Úciphersr4   Ússlkeylogfiler$   r2   r%   Úcreate_urllib3_context@   s:   ÿþ

rG   c                 C   s   t | tƒr| S |  ¡ dkS )z~Ensures a boolean value if a string or boolean is provided

    For strings, the value for True/False is case insensitive
    Útrue)Ú
isinstanceÚboolÚlower)Úvalr$   r$   r%   Úensure_booleanŒ   s   
rM   c                   @   sN   e Zd ZdZddd„Zdd„ Zdd„ Zed	d
„ ƒZdd„ Z	dd„ Z
dd„ ZdS )ÚProxyConfigurationa  Represents a proxy configuration dictionary and additional settings.

    This class represents a proxy configuration dictionary and provides utility
    functions to retreive well structured proxy urls and proxy headers from the
    proxy configuration dictionary.
    Nc                 C   s(   |d u ri }|d u ri }|| _ || _d S r"   )Ú_proxiesÚ_proxies_settings)ÚselfÚproxiesÚproxies_settingsr$   r$   r%   Ú__init__ž   s   
zProxyConfiguration.__init__c                 C   s(   t |ƒ}| j |j¡}|r|  |¡}|S )z7Retrieves the corresponding proxy url for a given url. )r   rO   r@   ÚschemeÚ_fix_proxy_url)rQ   ÚurlÚ
parsed_urlÚproxyr$   r$   r%   Úproxy_url_for§   s
   
z ProxyConfiguration.proxy_url_forc                 C   s2   i }|   |¡\}}|r|r|  ||¡}||d< |S )zARetrieves the corresponding proxy headers for a given proxy url. zProxy-Authorization)Ú_get_auth_from_urlÚ_construct_basic_auth)rQ   Ú	proxy_urlÚheadersÚusernameÚpasswordÚ
basic_authr$   r$   r%   Úproxy_headers_for¯   s   z$ProxyConfiguration.proxy_headers_forc                 C   s   | j S r"   )rP   ©rQ   r$   r$   r%   Úsettings¸   s   zProxyConfiguration.settingsc                 C   s2   |  d¡s
|  d¡r|S |  d¡rd| S d| S )Núhttp:zhttps:z//zhttp://)Ú
startswith)rQ   r]   r$   r$   r%   rV   ¼   s
   
z!ProxyConfiguration._fix_proxy_urlc                 C   s,   d  ||¡}t| d¡ƒ ¡  ¡ }d  |¡S )Nz{0}:{1}Úasciiz	Basic {0})r(   r   ÚencodeÚstripÚdecode)rQ   r_   r`   Úauth_strÚencoded_strr$   r$   r%   r\   Ä   s   
z(ProxyConfiguration._construct_basic_authc              	   C   s8   t |ƒ}zt|jƒt|jƒfW S  ttfy   Y dS w )N©NN)r   r   r_   r`   ÚAttributeErrorÚ	TypeError)rQ   rW   rX   r$   r$   r%   r[   É   s   ÿz%ProxyConfiguration._get_auth_from_urlrm   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__rT   rZ   rb   Úpropertyrd   rV   r\   r[   r$   r$   r$   r%   rN   —   s    
		
rN   c                   @   s†   e Zd ZdZdddedddfdd„Ze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S )ÚURLLib3Sessiona_  A basic HTTP client that supports connection pooling and proxies.

    This class is inspired by requests.adapters.HTTPAdapter, but has been
    boiled down to meet the use cases needed by botocore. For the most part
    this classes matches the functionality of HTTPAdapter in requests v2.7.0
    (the same as our vendored version). The only major difference of note is
    that we currently do not support sending chunked requests. While requests
    v2.7.0 implemented this themselves, later version urllib3 support this
    directly via a flag to urlopen so enabling it if needed should be trivial.
    TNc                 C   sÒ   || _ t||d�| _tjjtjjdœ| _|d u rt}t	|t
tfƒs+t|d |d d�}d | _d | _t	|tƒr:|| _nt	|tƒrE|\| _| _|| _|| _|| _|d u rUg | _i | _tdi |  ¡ ¤Ž| _| j| j_d S )N)rR   rS   )ÚhttpÚhttpsr   é   )ÚconnectÚreadr$   )Ú_verifyrN   Ú_proxy_configÚbotocoreÚ
awsrequestÚAWSHTTPConnectionPoolÚAWSHTTPSConnectionPoolÚ_pool_classes_by_schemeÚDEFAULT_TIMEOUTrI   ÚintÚfloatr   Ú
_cert_fileÚ	_key_fileÚstrÚtupleÚ_timeoutÚ_max_pool_connectionsÚ_socket_optionsÚ_proxy_managersr   Ú_get_pool_manager_kwargsÚ_managerÚpool_classes_by_scheme)rQ   r)   rR   ÚtimeoutÚmax_pool_connectionsÚsocket_optionsÚclient_certÚproxies_configr$   r$   r%   rT   Ü   s2   
ÿþ

zURLLib3Session.__init__c                 C   s4   | j j}|  |¡}|| d¡dœ}dd„ | ¡ D ƒS )NÚproxy_use_forwarding_for_https)Úproxy_ssl_contextÚuse_forwarding_for_httpsc                 S   s   i | ]\}}|d ur||“qS r"   r$   )Ú.0ÚkÚvr$   r$   r%   Ú
<dictcomp>  s    z2URLLib3Session._proxies_kwargs.<locals>.<dictcomp>)r|   rd   Ú_setup_proxy_ssl_contextr@   Úitems)rQ   rS   r–   Úproxies_kwargsr$   r$   r%   Ú_proxies_kwargs  s   
ÿþzURLLib3Session._proxies_kwargsc                 K   s6   d| j | j|  ¡ | j| j| jdœ}|jdi |¤Ž |S )NT)Ústrictr�   ÚmaxsizeÚssl_contextr’   Ú	cert_fileÚkey_filer$   )r‰   rŠ   Ú_get_ssl_contextr‹   r…   r†   Úupdate)rQ   Úextra_kwargsÚpool_manager_kwargsr$   r$   r%   r�     s   ù	z'URLLib3Session._get_pool_manager_kwargsc                 C   s   t ƒ S r"   )rG   rc   r$   r$   r%   r¥     s   zURLLib3Session._get_ssl_contextc                 C   s`   || j vr+| j |¡}| j|d�}|jdi | j¤Ž t|fi |¤Ž}| j|_|| j |< | j | S )N)Úproxy_headersr$   )	rŒ   r|   rb   r�   r¦   rŸ   r   r�   r�   )rQ   r]   r©   Úproxy_manager_kwargsÚproxy_managerr$   r$   r%   Ú_get_proxy_manager  s   
ÿ

z!URLLib3Session._get_proxy_managerc                 C   s.   t |ƒ}|j}|sd}|jr|d |j }|S )Nú/ú?)r   ÚpathÚquery)rQ   rW   rX   r¯   r$   r$   r%   Ú	_path_url*  s   zURLLib3Session._path_urlc                 C   s6   |  ¡  d¡r|rd|_t|ƒ|_d S d|_d |_d S )Nrw   r8   Ú	CERT_NONE)rK   rf   rD   r+   Úca_certs)rQ   ÚconnrW   r)   r$   r$   r%   Ú_setup_ssl_cert3  s
   
zURLLib3Session._setup_ssl_certc              
   C   s²   |  d¡}|  d¡}|d u r|d u rd S |  ¡ }z-d|_|d ur&|j|d� t|tƒr9|j|d |d d� |W S t|tƒrC| |¡ |W S  tt	fyX } zt
|d�‚d }~ww )	NÚproxy_ca_bundleÚproxy_client_certT)Úcafiler   rx   )Úkeyfile©Úerror)r@   r¥   r0   Úload_verify_locationsrI   rˆ   Úload_cert_chainr‡   ÚIOErrorÚURLLib3SSLErrorr   )rQ   rS   r¶   Ú
proxy_certr3   Úer$   r$   r%   rœ   ;  s&   



ý

€ÿz'URLLib3Session._setup_proxy_ssl_contextc                 C   s   |r	|   |¡}|S | j}|S r"   )r¬   rŽ   )rQ   rW   r]   Úmanagerr$   r$   r%   Ú_get_connection_managerR  s
   
ÿz&URLLib3Session._get_connection_managerc                 C   sR   |d u}|s|   |¡S t|ƒj}|dko| j dd¡}|s"| d¡r$|S |   |¡S )Nrw   r—   Fre   )r±   r   rU   rŸ   r@   rf   )rQ   rW   r]   Ú	has_proxyÚproxy_schemeÚusing_https_forwarding_proxyr$   r$   r%   Ú_get_request_targetY  s   

þ
z"URLLib3Session._get_request_targetc                 C   s   |  dd¡dkS )NzTransfer-EncodingÚ Úchunked)r@   )rQ   r^   r$   r$   r%   Ú_chunkedm  s   zURLLib3Session._chunkedc                 C   sÜ  zd| j  |j¡}|  |j|¡}| |j¡}|  ||j| j¡ ttj	 
dd¡ƒr2t|jƒj}||jd< |  |j|¡}|j|j||j|jtdƒddd|  |j¡d�	}tj |j|j|j|¡}|jsb|j |W S  tyw }	 zt|j|	d�‚d }	~	w ttjfyŒ }	 zt |j|	d�‚d }	~	w t!y� }	 zt"||	d�‚d }	~	w t#y¯ }	 zt$|j|	d�‚d }	~	w t%yÁ }	 zt&|j|	d�‚d }	~	w t'yÔ }	 zt(|	||jd�‚d }	~	w t)yí }	 zd	}
t*j+|
d
d� t,|	d�‚d }	~	ww )NÚ(BOTO_EXPERIMENTAL__ADD_PROXY_HOST_HEADERrÈ   ÚhostF)	ÚmethodrW   Úbodyr^   ÚretriesÚassert_same_hostÚpreload_contentÚdecode_contentrÉ   )Úendpoint_urlr»   )r]   r»   )r»   ÚrequestrÓ   z4Exception received when sending urllib3 HTTP requestT)Úexc_inforº   )-r|   rZ   rW   rÃ   Úconnection_from_urlrµ   r{   rM   r>   r?   r@   r   Úhostnamer©   rÇ   ÚurlopenrÍ   rÎ   r^   r   rÊ   r}   r~   ÚAWSResponseÚstatusÚstream_outputÚcontentr¿   r   r   ÚsocketÚgaierrorr   r   r   ÚURLLib3ConnectTimeoutErrorr   ÚURLLib3ReadTimeoutErrorr   r   r   Ú	Exceptionr&   r'   r   )rQ   rÔ   r]   rÂ   r´   rÌ   Úrequest_targetÚurllib_responseÚhttp_responserÁ   Úmessager$   r$   r%   Úsendp  sv   ÿ

÷ü€€€€€ý€
€ýzURLLib3Session.sendr"   )rp   rq   rr   rs   ÚMAX_POOL_CONNECTIONSrT   rt   rŸ   r�   r¥   r¬   r±   rµ   rœ   rÃ   rÇ   rÊ   ræ   r$   r$   r$   r%   ru   Ñ   s,    
ø'

	
ru   )NNNN)CÚos.pathr>   ÚloggingrÝ   Úbase64r   r:   Úurllib3r   r   r   Úurllib3.util.retryr   Úurllib3.util.ssl_r   r   r	   r
   r   r   Úurllib3.exceptionsr   r¿   r   rà   r   rß   r   r   r   r   r   ÚImportErrorÚurllib3.contrib.pyopensslr   r   Úbotocore.awsrequestr}   Úsix.moves.urllib_parser   Úbotocore.compatr   r   Úbotocore.exceptionsr   r   r   r   r   Ú	getLoggerrp   r&   r‚   rç   r¯   ÚjoinÚdirnameÚ__file__r#   Úcertifir!   r+   rG   rM   ÚobjectrN   ru   r$   r$   r$   r%   Ú<module>   sX     ýÿ(
ÿ

ÿL: