U
    n/e$                     @   s   d dl Z d dlZd dlZd dlZd dlmZmZ d dlZd dlmZm	Z	m
Z
mZ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mZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z& d dl'Z(d dl)m*Z*m+Z+ G dd	 d	Z,dS )
    N)DictOptional)ClientConnectionErrorClientConnectorErrorClientHttpProxyErrorClientProxyConnectionErrorClientSSLErrorServerDisconnectedErrorServerTimeoutError)URL)MAX_POOL_CONNECTIONSConnectionClosedErrorConnectTimeoutErrorEndpointConnectionErrorHTTPClientErrorInvalidProxiesConfigErrorLocationParseErrorProxyConfigurationProxyConnectionErrorReadTimeoutErrorSSLError_is_ipaddresscreate_urllib3_contextensure_booleanget_cert_pathloggermask_proxy_url	parse_urlurlparse)CIMultiDict)_IOBaseWrapper_textc                   @   sj   e Zd Zdddeddddfeeeef eedddZ	dd Z
dd	 Zd
d Zdd Zdd Zdd ZdS )AIOHTTPSessionTN)verifyproxiestimeoutmax_pool_connectionsc	                    s  d _ _t||d_t|ttfr2|\}	}
n| }	}
tj|	|
d}d _	d _
t|trf|_	nt|tr||\_	_
|_|_jd krtdd_ _|_|d krg _d tr|r܈jj}|n" t}|r|d d   fdd_d _d S )N)r$   proxies_settings)Zsock_connectZ	sock_read   )Zkeepalive_timeoutc                      s   t jf  tdjS )N)limitZ
verify_sslssl)aiohttpZTCPConnectorbool_connector_args r&   selfssl_contextr#   r.   ;/tmp/pip-unpacked-wheel-8mnez3y6/aiobotocore/httpsession.py<lambda>o   s   z)AIOHTTPSession.__init__.<locals>.<lambda>)_sessionZ_verifyr   _proxy_config
isinstancelisttupler+   ZClientTimeout
_cert_file	_key_filestr_timeoutr-   dictZ_max_pool_connectionsZ_socket_optionsr,   settings_setup_proxy_ssl_context_get_ssl_contextr   load_verify_locations_create_connector
_connector)r0   r#   r$   r%   r&   socket_optionsclient_certZproxies_configZconnector_argsZconn_timeoutread_timeoutr'   ca_certsr.   r/   r2   __init__.   sL     
 


zAIOHTTPSession.__init__c                    s8   | j s| jrt|  | _tj| j| jdhdd| _ | S )NzCONTENT-TYPEF)Z	connectorr%   Zskip_auto_headersZauto_decompress)r4   rC   AssertionErrorrB   r+   ZClientSessionr<   r0   r.   r.   r2   
__aenter__w   s    
zAIOHTTPSession.__aenter__c                    s,   | j r(| j |||I d H  d | _ d | _d S N)r4   	__aexit__rC   )r0   exc_typeexc_valexc_tbr.   r.   r2   rM      s    zAIOHTTPSession.__aexit__c                 C   s    t  }| jr|| j| j |S rL   )r   r9   load_cert_chainr:   )r0   r1   r.   r.   r2   r@      s    zAIOHTTPSession._get_ssl_contextc              
   C   s   | j j}|d}|d}|d kr0|d kr0d S |  }zht|}t|jsRd|_|d k	rf|j|d t	|t
r|j|d |d d nt	|tr|| |W S  ttfk
r } zt|dW 5 d }~X Y nX d S )	Nproxy_ca_bundleZproxy_client_certT)cafiler      )keyfileerror)r5   r>   getr@   r   r   hostcheck_hostnamerA   r6   r8   rQ   r;   OSErrorr   r   )r0   	proxy_urlr'   rR   Z
proxy_certcontexturler.   r.   r2   r?      s&    





z'AIOHTTPSession._setup_proxy_ssl_contextc                    s   |  d d d I d H  d S rL   )rM   rJ   r.   r.   r2   close   s    zAIOHTTPSession.closec              
      s  z| j |j}| j |j}|j}|j}|j}ttj	ddrXt
|jj}||d< tdd | D }d|d< d }	|	dd d	kr|dd d
}	t|tjrt|}t|d
d}| jj|j||	||||dI d H }
tjt|
j|
j|
j|
}|js|jI d H  |W S  tk
rH } zt |j|dW 5 d }~X Y nt t!t"fk
r } zt#t$||dW 5 d }~X Y n< t%t&j't&j(j)fk
r } zt*|||jdW 5 d }~X Y n t+k
r } z6t| ,drt-|j|dnt.|j|dW 5 d }~X Y n t/t0t1j2fk
rJ } zt3|j|dW 5 d }~X Y nr t4j5k
r| } zt.|j|dW 5 d }~X Y n@ t6k
r } z d}t7j8|d
d t9|dW 5 d }~X Y nX d S )NZ(BOTO_EXPERIMENTAL__ADD_PROXY_HOST_HEADER rY   c                 s   s&   | ]}|d  t |d ddfV  qdS )r   rT   zutf-8)encodingN)r!   ).0zr.   r.   r2   	<genexpr>   s    z&AIOHTTPSession.send.<locals>.<genexpr>identityzAccept-EncodingzTransfer-EncodingchunkedT)encoded)r^   rg   headersdataproxyproxy_headers)endpoint_urlrW   )r\   rW   )rW   requestrm   connectz4Exception received when sending urllib3 HTTP request)exc_inforV   ):r5   Zproxy_url_forr^   Zproxy_headers_forri   bodyr   osenvironrX   r   hostnamer   itemslowerpopr6   ioIOBaser    r   r4   rn   methodaiobotocoreZ
awsrequestZAioAWSResponser;   statusZstream_outputcontentr   r   r   r   r   r   r	   r+   ZClientPayloadErrorZhttp_exceptionsBadStatusLiner   r
   
startswithr   r   r   r   socketgaierrorr   asyncioTimeoutError	Exceptionr   debugr   )r0   rn   r\   rl   r^   ri   rj   rY   headers_rg   responsehttp_responser_   messager.   r.   r2   send   s    
       zAIOHTTPSession.send)__name__
__module____qualname__r   r,   r   r;   floatintrH   rK   rM   r@   r?   r`   r   r.   r.   r.   r2   r"   -   s(   
Ir"   )-r   rx   rr   r   typingr   r   r+   r   r   r   r   r   r	   r
   Zaiohttp.clientr   Zbotocore.httpsessionr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z	multidictr   Zaiobotocore.awsrequestr{   Zaiobotocore._endpoint_helpersr    r!   r"   r.   r.   r.   r2   <module>   s   $	T