
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    'â7`Ø§  ã                   @   sN  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mZ d dl	m
Z
 d dlmZ d dlmZmZ d dl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" d dl#Z#d	d
l$m%Z%m&Z& d	dl'm(Z( d	dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 d	dl3m4Z4 d	dl5m6Z6m7Z7m8Z8 d	dl&m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> d	dl?m@Z@ d	dlAmBZB d	dlCmDZD zd dlEZEeEjFZFW n eGk
�r¤   dZEeHZFY nX dZIe�rÔd	dlJmKZK d	dl5mLZL d	dlMmNZN G dd„ dƒZOG dd„ dƒZPG dd„ dƒZQG dd„ dƒZRG dd „ d ƒZSG d!d"„ d"eRƒZTG d#d$„ d$eRƒZUG d%d&„ d&eRƒZVdS )'é    N)ÚdefaultdictÚdeque)Úsuppress)ÚSimpleCookie)ÚcycleÚislice)Ú	monotonic)ÚTracebackType)ÚTYPE_CHECKINGÚAnyÚ	AwaitableÚCallableÚDefaultDictÚDictÚIteratorÚListÚOptionalÚSetÚTupleÚTypeÚUnionÚcasté   )ÚhdrsÚhelpers)ÚAbstractResolver)	ÚClientConnectionErrorÚClientConnectorCertificateErrorÚClientConnectorErrorÚClientConnectorSSLErrorÚClientHttpProxyErrorÚClientProxyConnectionErrorÚServerFingerprintMismatchÚcert_errorsÚ
ssl_errors)ÚResponseHandler)ÚClientRequestÚFingerprintÚ_merge_ssl_params)ÚPY_36ÚCeilTimeoutÚget_running_loopÚis_ip_addressÚnoopÚsentinel)Ú	RESPONSES)ÚEventResultOrError)ÚDefaultResolver)ÚBaseConnectorÚTCPConnectorÚUnixConnectorÚNamedPipeConnector)ÚClientTimeout)ÚConnectionKey)ÚTracec                   @   s@   e Zd ZdZee ddœdd„Zedœdd„Zddœd	d
„ZdS )Ú_DeprecationWaiter©Ú
_awaitableÚ_awaitedN)Ú	awaitableÚreturnc                 C   s   || _ d| _d S ©NFr:   )Úselfr=   © rA   úD/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/connector.pyÚ__init__I   s    z_DeprecationWaiter.__init__©r>   c                 C   s   d| _ | j ¡ S ©NT)r<   r;   Ú	__await__©r@   rA   rA   rB   rF   M   s    z_DeprecationWaiter.__await__c                 C   s   | j st dt¡ d S )NzDConnector.close() is a coroutine, please use await connector.close())r<   ÚwarningsÚwarnÚDeprecationWarningrG   rA   rA   rB   Ú__del__Q   s
    ýz_DeprecationWaiter.__del__)	Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   rC   rF   rK   rA   rA   rA   rB   r9   F   s   r9   c                   @   sä   e Zd ZdZdZddeejddœdd„Ze	dœdd	„Z
efedd
œdd„Zeejdœdd„ƒZeeej dœdd„ƒZeee dœdd„ƒZeg df ddœdd„Zddœdd„Zddœdd„Zddœdd„Zeedœdd„ƒZdS )Ú
ConnectionNr2   r7   )Ú	connectorÚkeyÚprotocolÚloopr>   c                 C   s<   || _ || _|| _|| _g | _| ¡ r8t t 	d¡¡| _
d S )Nr   )Ú_keyÚ
_connectorÚ_loopÚ	_protocolÚ
_callbacksÚ	get_debugÚ	tracebackÚextract_stackÚsysÚ	_getframeÚ_source_traceback)r@   rQ   rR   rS   rT   rA   rA   rB   rC   _   s    zConnection.__init__rD   c                 C   s   d| j › d�S )NzConnection<ú>)rU   rG   rA   rA   rB   Ú__repr__o   s    zConnection.__repr__©Ú	_warningsr>   c                 C   s„   | j d k	r€trd| i}ni }|jd| ›�tf|Ž | j ¡ r@d S | jj| j| j dd� | ddœ}| j	d k	rt| j	|d< | j 
|¡ d S )NÚsourcezUnclosed connection T©Úshould_closezUnclosed connection)Zclient_connectionÚmessageÚsource_traceback)rX   r)   rI   ÚResourceWarningrW   Ú	is_closedrV   Ú_releaserU   r_   Úcall_exception_handler)r@   rc   ÚkwargsÚcontextrA   rA   rB   rK   r   s    





zConnection.__del__c                 C   s   t jdtdd� | jS )Nz%connector.loop property is deprecatedé   )Ú
stacklevel)rH   rI   rJ   rW   rG   rA   rA   rB   rT   ƒ   s      ÿzConnection.loopc                 C   s   | j d krd S | j jS ©N)rX   Ú	transportrG   rA   rA   rB   rr   Š   s    
zConnection.transportc                 C   s   | j S rq   )rX   rG   rA   rA   rB   rS   �   s    zConnection.protocol)Úcallbackr>   c                 C   s   |d k	r| j  |¡ d S rq   )rY   Úappend)r@   rs   rA   rA   rB   Úadd_callback”   s    zConnection.add_callbackc              
   C   s>   | j d d … g  }| _ |D ]}ttƒ� |ƒ  W 5 Q R X qd S rq   )rY   r   Ú	Exception)r@   Ú	callbacksÚcbrA   rA   rB   Ú_notify_release˜   s    
zConnection._notify_releasec                 C   s2   |   ¡  | jd k	r.| jj| j| jdd� d | _d S )NTre   )ry   rX   rV   rk   rU   rG   rA   rA   rB   ÚcloseŸ   s    
zConnection.closec                 C   s6   |   ¡  | jd k	r2| jj| j| j| jjd� d | _d S )Nre   )ry   rX   rV   rk   rU   rf   rG   rA   rA   rB   Úrelease¦   s    
  ÿzConnection.releasec                 C   s   | j d kp| j  ¡  S rq   )rX   Úis_connectedrG   rA   rA   rB   Úclosed¯   s    zConnection.closed)rL   rM   rN   r_   Ú
_transportr%   ÚasyncioÚAbstractEventLooprC   Ústrra   rH   r   rK   ÚpropertyrT   r   Ú	Transportrr   rS   r   ru   ry   rz   r{   Úboolr}   rA   rA   rA   rB   rP   Z   s,   ú	rP   c                   @   s   e Zd ZdZddœdd„ZdS )Ú_TransportPlaceholderz0 placeholder for BaseConnector.connect function NrD   c                 C   s   d S rq   rA   rG   rA   rA   rB   rz   ·   s    z_TransportPlaceholder.close)rL   rM   rN   Ú__doc__rz   rA   rA   rA   rB   r…   ´   s   r…   c                	   @   sà  e Zd ZdZdZdZdZeddddddœee	de
f eeeeeej dd	œd
d„Zefeddœdd„Zd dœdd„Zeddœdd„Zd dœdd„ZdDeee  ee ee ddœdd„Zeedœdd„ƒZeedœdd„ƒZeedœdd„ƒZddœd d!„Zd"e dd#œd$d%„Z!ddœd&d'„Z"e#d dœd(d)„Z$ddœd*d+„Z%eedœd,d-„ƒZ&d"ed.œd/d0„Z'd1e(d2 d3e)d4œd5d6„Z*d"ee  d.œd7d8„Z+ddœd9d:„Z,d"e dd;œd<d=„Z-dd>œd"e edd?œd@dA„Z.d1e(d2 d3e d4œdBdC„Z/dS )Er2   aØ  Base connector class.

    keepalive_timeout - (optional) Keep-alive timeout.
    force_close - Set to True to force close and do reconnect
        after each request (and between redirects).
    limit - The total number of simultaneous connections.
    limit_per_host - Number of simultaneous connections to one host.
    enable_cleanup_closed - Enables clean-up closed ssl transports.
                            Disabled by default.
    loop - Optional event loop.
    TNg       @Féd   r   ©Úkeepalive_timeoutÚforce_closeÚlimitÚlimit_per_hostÚenable_cleanup_closedrT   )r‰   rŠ   r‹   rŒ   r�   rT   r>   c                C   sÖ   |r|d k	r*|t k	r*tdƒ‚n|t kr*d}t|ƒ}d| _| ¡ rRt t d¡¡| _	i | _
|| _|| _tƒ | _ttƒ| _tt|ƒ| _|| _ttƒ| _|| _tjt|d�| _tƒ | _d | _d | _| | _ g | _!|  "¡  d S )Nz6keepalive_timeout cannot be set if force_close is Trueg      .@Fr   ©rT   )#r.   Ú
ValueErrorr+   Ú_closedrZ   r[   r\   r]   r^   r_   Ú_connsÚ_limitÚ_limit_per_hostÚsetÚ	_acquiredr   Ú_acquired_per_hostr   ÚfloatÚ_keepalive_timeoutÚ_force_closer   Ú_waitersrW   Ú	functoolsÚpartialr%   Ú_factoryr   ZcookiesÚ_cleanup_handleÚ_cleanup_closed_handleÚ_cleanup_closed_disabledÚ_cleanup_closed_transportsÚ_cleanup_closed)r@   r‰   rŠ   r‹   rŒ   r�   rT   rA   rA   rB   rC   Î   s<    ÿÿÿ
zBaseConnector.__init__rb   c                 C   sˆ   | j r
d S | jsd S dd„ | j ¡ D ƒ}|  ¡  tr>d| i}ni }|jd| ›�tf|Ž | |ddœ}| jd k	rx| j|d< | j 	|¡ d S )Nc                 S   s   g | ]}t |ƒ‘qS rA   )Úrepr)Ú.0ÚcrA   rA   rB   Ú
<listcomp>  s     z)BaseConnector.__del__.<locals>.<listcomp>rd   zUnclosed connector zUnclosed connector)rQ   Úconnectionsrg   rh   )
r�   r‘   ÚvaluesÚ_closer)   rI   ri   r_   rW   rl   )r@   rc   Úconnsrm   rn   rA   rA   rB   rK     s"    
ý

zBaseConnector.__del__rD   c                 C   s   t  dt¡ | S )NzH"witn Connector():" is deprecated, use "async with Connector():" instead)rH   rI   rJ   rG   rA   rA   rB   Ú	__enter__  s
    ýzBaseConnector.__enter__)Úexcr>   c                 G   s   |   ¡  d S rq   ©rz   )r@   r¬   rA   rA   rB   Ú__exit__%  s    zBaseConnector.__exit__c                 Ã   s   | S rq   rA   rG   rA   rA   rB   Ú
__aenter__(  s    zBaseConnector.__aenter__)Úexc_typeÚ	exc_valueÚexc_tracebackr>   c                 Ã   s   |   ¡ I d H  d S rq   r­   )r@   r°   r±   r²   rA   rA   rB   Ú	__aexit__+  s    zBaseConnector.__aexit__c                 C   s   | j S )z1Ultimately close connection on releasing if True.)r™   rG   rA   rA   rB   rŠ   3  s    zBaseConnector.force_closec                 C   s   | j S )z‘The total number for simultaneous connections.

        If limit is 0 the connector has no limit.
        The default limit size is 100.
        )r’   rG   rA   rA   rB   r‹   8  s    zBaseConnector.limitc                 C   s   | j S )z³The limit_per_host for simultaneous connections
        to the same endpoint.

        Endpoints are the same if they are have equal
        (host, port, is_ssl) triple.

        )r“   rG   rA   rA   rB   rŒ   A  s    	zBaseConnector.limit_per_hostc                 C   s   | j r| j  ¡  d| _ | j ¡ }| j}| jrâi }|| }| j ¡ D ]˜\}}g }|D ]z\}}	| ¡ r¦|	| dk r–|j}
| 	¡  |j
r¤| js¤| j |
¡ qÌ| ||	f¡ qR|j}
| 	¡  |j
rR| jsR| j |
¡ qR|rB|||< qB|| _| jrüt | d|| j¡| _ dS )zCleanup unused transports.Nr   Ú_cleanup)rž   ÚcancelrW   Útimer˜   r‘   Úitemsr|   rr   rz   Úis_sslr    r¡   rt   r   Úweakref_handle)r@   ÚnowÚtimeoutr§   ZdeadlinerR   rª   ÚaliveÚprotoZuse_timerr   rA   rA   rB   r´   L  s@    


   ÿzBaseConnector._cleanupr7   )rR   Úvalr>   c                 C   s4   | j }||krd S || }| |¡ |s0| j |= d S rq   )r–   Úremove)r@   rR   r¾   Zacquired_per_hostrª   rA   rA   rB   Ú_drop_acquired_per_hostu  s    
z%BaseConnector._drop_acquired_per_hostc                 C   sR   | j r| j  ¡  | jD ]}|dk	r| ¡  qg | _| jsNt | d| j| j¡| _ dS )z}Double confirmation for transport close.
        Some broken ssl servers may leave socket open without proper close.
        Nr¢   )	rŸ   rµ   r¡   Úabortr    r   r¹   Ú_cleanup_closed_periodrW   )r@   rr   rA   rA   rB   r¢   €  s    


   ÿzBaseConnector._cleanup_closedc                 C   s   |   ¡  ttƒ ƒS )zClose all opened transports.)r©   r9   r-   rG   rA   rA   rB   rz   ’  s    zBaseConnector.closec                 C   sØ   | j r
d S d| _ zŒ| j 	¡ r$W ¢~d S | jr4| j 
¡  | jrD| j 
¡  | j ¡ D ]}|D ]\}}| ¡  qVqN| jD ]}| ¡  qp| jD ]}|d k	r„| ¡  q„W 5 | j ¡  | j ¡  | j ¡  d | _| j ¡  d | _X d S rE   )r�   r‘   Úclearr•   rš   rž   r¡   rŸ   rW   rj   rµ   r¨   rz   rÁ   )r@   Údatar½   Út0rr   rA   rA   rB   r©   —  s0    









zBaseConnector._closec                 C   s   | j S )z;Is connector closed.

        A readonly property.
        )r�   rG   rA   rA   rB   r}   ¼  s    zBaseConnector.closed©rR   r>   c                 C   s–   | j rV| j t| jƒ }| jr’|dkr’|| jkr’| j |¡}|dk	sFt‚| jt|ƒ }n<| jrŽ|| jkrŽ| j |¡}|dk	s~t‚| jt|ƒ }nd}|S )zà
        Return number of available connections taking into account
        the limit, limit_per_host and the connection key.

        If it returns less than 1 means that there is no connections
        availables.
        r   Nr   )r’   Úlenr•   r“   r–   ÚgetÚAssertionError)r@   rR   Ú	availableZacquiredrA   rA   rB   Ú_available_connectionsÄ  s"    	ÿþýz$BaseConnector._available_connectionsr&   r8   r6   ©ÚreqÚtracesr»   r>   c                 Ã   sb  |j }|  |¡}|dks$|| jk�r| j ¡ }| j|  |¡ |rZ|D ]}| ¡ I dH  qFznz|I dH  W nZ tk
rÄ } z<|| jkr°z| j|  |¡ W n t	k
r®   Y nX |‚W 5 d}~X Y nX W 5 || jkræ| j| sæ| j|= X |�r|D ]}| 
¡ I dH  qò|  |¡}	|	dk�rtttƒ ƒ}
| j |
¡ | j|  |
¡ |�rb|D ]}| ¡ I dH  �qLz0|  |||¡I dH }	| j�r�|	 ¡  tdƒ‚W n@ tk
�rÒ   | j�sÌ| j |
¡ |  ||
¡ |  ¡  ‚ Y n"X | j�sô| j |
¡ |  ||
¡ |�r6|D ]}| ¡ I dH  �qþn |�r6|D ]}| ¡ I dH  �q | j |	¡ | j|  |	¡ t| ||	| jƒS )z'Get from pool or create new connection.r   NzConnector is closed.)Úconnection_keyrË   rš   rW   Zcreate_futurert   Zsend_connection_queued_startÚBaseExceptionr¿   r�   Zsend_connection_queued_endÚ_getr   r%   r…   r•   Úaddr–   Zsend_connection_create_startÚ_create_connectionr�   rz   r   rÀ   Ú_release_waiterZsend_connection_create_endZsend_connection_reuseconnrP   )r@   rÍ   rÎ   r»   rR   rÊ   ÚfutÚtraceÚer½   ÚplaceholderrA   rA   rB   Úconnectå  sj    





zBaseConnector.connectc                 C   sÄ   z| j | }W n tk
r$   Y d S X | j ¡ }|r¸| ¡ \}}| ¡ r�|| | jkr~|j}| ¡  |j	rŽ| j
sŽ| j |¡ q¶|sŠ| j |= |S q0|j}| ¡  |j	r0| j
s0| j |¡ q0| j |= d S rq   )r‘   ÚKeyErrorrW   r¶   Úpopr|   r˜   rr   rz   r¸   r    r¡   rt   )r@   rR   rª   Út1r½   rÅ   rr   rA   rA   rB   rÑ   2  s,    
zBaseConnector._getc                 C   sp   | j s
dS t| j  ¡ ƒ}t |¡ |D ]D}|  |¡dk r:q&| j | }|r&| ¡ }| ¡ sD| d¡  dS qDq&dS )z�
        Iterates over all waiters till found one that is not finsihed and
        belongs to a host that has available connections.
        Nr   )	rš   ÚlistÚkeysÚrandomÚshufflerË   ÚpopleftÚdoneÚ
set_result)r@   ZqueuesrR   ÚwaitersÚwaiterrA   rA   rB   rÔ   Q  s    


zBaseConnector._release_waiter)rR   r½   r>   c                 C   sH   | j r
d S z| j |¡ |  ||¡ W n tk
r:   Y n
X |  ¡  d S rq   )r�   r•   r¿   rÀ   rÚ   rÔ   )r@   rR   r½   rA   rA   rB   Ú_release_acquiredi  s    zBaseConnector._release_acquiredre   )rR   rS   rf   r>   c                C   s¬   | j r
d S |  ||¡ | jr d}|s*|jrR|j}| ¡  |jr¨| js¨| j 	|¡ nV| j
 |¡}|d krtg  }| j
|< | 	|| j ¡ f¡ | jd kr¨t | d| j| j¡| _d S )NTr´   )r�   ræ   r™   rf   rr   rz   r¸   r    r¡   rt   r‘   rÈ   rW   r¶   rž   r   r¹   r˜   )r@   rR   rS   rf   rr   rª   rA   rA   rB   rk   x  s*    

   ÿzBaseConnector._releasec                 Ã   s
   t ƒ ‚d S rq   )ÚNotImplementedError)r@   rÍ   rÎ   r»   rA   rA   rB   rÓ   ™  s    z BaseConnector._create_connection)NNN)0rL   rM   rN   r†   r�   r_   rÂ   r.   r   Úobjectr—   r„   Úintr   r   r€   rC   rH   r   rK   r«   r®   r¯   r   rÐ   r	   r³   r‚   rŠ   r‹   rŒ   r´   r%   rÀ   r¢   r   rz   r©   r}   rË   r   rP   rÙ   rÑ   rÔ   ræ   rk   rÓ   rA   rA   rA   rB   r2   »   sŠ   ø÷7   ü
û
* þ%"  þMûú"  þr2   c                   @   sº   e Zd Zdee ddœdd„Zeedœdd„Ze	e
ef eee
ef  ddœd	d
„Ze	e
ef ddœdd„Zddœdd„Ze	e
ef eee
ef  dœdd„Ze	e
ef edœdd„ZdS )Ú_DNSCacheTableN)Úttlr>   c                 C   s   i | _ i | _|| _d S rq   )Ú	_addrs_rrÚ_timestampsÚ_ttl)r@   rë   rA   rA   rB   rC      s    ÿz_DNSCacheTable.__init__)Úhostr>   c                 C   s
   || j kS rq   )rì   )r@   rï   rA   rA   rB   Ú__contains__§  s    z_DNSCacheTable.__contains__)rR   Úaddrsr>   c                 C   s,   t |ƒt|ƒf| j|< | jr(tƒ | j|< d S rq   )r   rÇ   rì   rî   r   rí   )r@   rR   rñ   rA   rA   rB   rÒ   ª  s    z_DNSCacheTable.addrÆ   c                 C   s&   | j  |d ¡ | jr"| j |d ¡ d S rq   )rì   rÛ   rî   rí   ©r@   rR   rA   rA   rB   r¿   °  s    z_DNSCacheTable.removerD   c                 C   s   | j  ¡  | j ¡  d S rq   )rì   rÃ   rí   rG   rA   rA   rB   rÃ   ¶  s    
z_DNSCacheTable.clearc                 C   s(   | j | \}}tt||ƒƒ}t|ƒ |S rq   )rì   rÝ   r   Únext)r@   rR   rT   Úlengthrñ   rA   rA   rB   Ú
next_addrsº  s    z_DNSCacheTable.next_addrsc                 C   s$   | j d krdS | j| | j  tƒ k S r?   )rî   rí   r   rò   rA   rA   rB   ÚexpiredÁ  s    
z_DNSCacheTable.expired)N)rL   rM   rN   r   r—   rC   rè   r„   rð   r   r�   ré   r   r   r   rÒ   r¿   rÃ   rõ   rö   rA   rA   rA   rB   rê   Ÿ  s   &$rê   c                       sö  e Zd ZdZdddddddddeddddddœeee eee eee	 e
deee	f eeeef  ee e
deef eeeeeej dœ‡ fd	d
„Zed dœ‡ fdd„Zeedœdd„ƒZeedœdd„ƒZd0ee ee ddœdd„Zd1eeeed  eeeef  dœdd„Zded dedœdd„Ze e! "d¡ee	dœdd „ƒƒZ#dee	 d!œd"d#„Z$ded$ d!œd%d&„Z%e&d'œedde'e( eeej)ef d(œd)d*„Z*e&d'œded de'e( eej)ef d+œd,d-„Z+ded deej)ef dœd.d/„Z,‡  Z-S )2r3   a/  TCP connector.

    verify_ssl - Set to True to check ssl certifications.
    fingerprint - Pass the binary sha256
        digest of the expected certificate in DER format to verify
        that the certificate the server presents matches. See also
        https://en.wikipedia.org/wiki/Transport_Layer_Security#Certificate_pinning
    resolver - Enable DNS lookups and use this
        resolver
    use_dns_cache - Use memory cache for DNS lookups.
    ttl_dns_cache - Max seconds having cached a DNS entry, None forever.
    family - socket address family
    local_addr - local tuple of (host, port) to bind socket to

    keepalive_timeout - (optional) Keep-alive timeout.
    force_close - Set to True to force close and do reconnect
        after each request (and between redirects).
    limit - The total number of simultaneous connections.
    limit_per_host - Number of simultaneous connections to one host.
    enable_cleanup_closed - Enables clean-up closed ssl transports.
                            Disabled by default.
    loop - Optional event loop.
    TNé
   r   Fr‡   )Ú
verify_sslÚfingerprintÚuse_dns_cacheÚttl_dns_cacheÚfamilyÚssl_contextÚsslÚ
local_addrÚresolverr‰   rŠ   r‹   rŒ   r�   rT   c                   sj   t ƒ j|
|||||d� t||||ƒ| _|	d kr<t| jd�}	|	| _|| _t|d�| _	i | _
|| _|| _d S )Nrˆ   rŽ   )rë   )ÚsuperrC   r(   Ú_sslr1   rW   Ú	_resolverÚ_use_dns_cacherê   Ú_cached_hostsÚ_throttle_dns_eventsÚ_familyÚ_local_addr)r@   rø   rù   rú   rû   rü   rý   rþ   rÿ   r   r‰   rŠ   r‹   rŒ   r�   rT   ©Ú	__class__rA   rB   rC   á  s$    ú	ÿzTCPConnector.__init__rD   c                    s"   | j  ¡ D ]}| ¡  q
tƒ  ¡ S )zClose all ongoing DNS calls.)r  r¨   rµ   r  rz   )r@   Zevr	  rA   rB   rz   
  s    
zTCPConnector.closec                 C   s   | j S )zSocket family like AF_INET.)r  rG   rA   rA   rB   rü     s    zTCPConnector.familyc                 C   s   | j S )z%True if local DNS caching is enabled.)r  rG   rA   rA   rB   rú     s    zTCPConnector.use_dns_cache)rï   Úportr>   c                 C   sJ   |dk	r"|dk	r"| j  ||f¡ n$|dk	s2|dk	r<tdƒ‚n
| j  ¡  dS )z8Remove specified host/port or clear all dns local cache.Nz5either both host and port or none of them are allowed)r  r¿   r�   rÃ   )r@   rï   r  rA   rA   rB   Úclear_dns_cache  s
    
zTCPConnector.clear_dns_cacher8   )rï   r  rÎ   r>   c              
   Ã   s  t |ƒr|||| jdddœgS | js~|rB|D ]}| |¡I d H  q,| jj||| jd�I d H }|rz|D ]}| |¡I d H  qd|S ||f}|| jkrÊ| j |¡sÊ| j 	|¡}|rÆ|D ]}| 
|¡I d H  q°|S || jk�r| j| }|rþ|D ]}| 
|¡I d H  qè| ¡ I d H  nþt| jƒ| j|< |�r@|D ]}| |¡I d H  �q(z¼z~|�rf|D ]}| |¡I d H  �qN| jj||| jd�I d H }	|�r¢|D ]}| |¡I d H  �qŠ| j ||	¡ | j|  ¡  W n8 tk
�rø }
 z| j| j|
d� ‚ W 5 d }
~
X Y nX W 5 | j |¡ X | j 	|¡S )Nr   )Úhostnamerï   r  rü   r½   Úflags)rü   )r¬   )r,   r  r  Zsend_dns_resolvehost_startr  ÚresolveZsend_dns_resolvehost_endr  rö   rõ   Zsend_dns_cache_hitr  Úwaitr0   rW   Zsend_dns_cache_missrÛ   rÒ   r”   rÐ   )r@   rï   r  rÎ   rÖ   ÚresrR   ÚresultÚeventrñ   r×   rA   rA   rB   Ú_resolve_host&  sd    úÿ
zTCPConnector._resolve_hostr&   r6   rÌ   c                 Ã   s<   |j r |  |||¡I dH \}}n|  |||¡I dH \}}|S )zcCreate connection.

        Has same keyword arguments as BaseEventLoop.create_connection.
        N)ÚproxyÚ_create_proxy_connectionÚ_create_direct_connection)r@   rÍ   rÎ   r»   Ú_r½   rA   rA   rB   rÓ   r  s    zTCPConnector._create_connection)Úverifiedr>   c              
   C   s�   | rt  ¡ S t  t j¡}| jt jO  _| jt jO  _z| jt jO  _W n2 tk
r~ } zt	 
d |¡¡ W 5 d }~X Y nX | ¡  |S d S )Nz‡{!s}: The Python interpreter is compiled against OpenSSL < 1.0.0. Ref: https://docs.python.org/3/library/ssl.html#ssl.OP_NO_COMPRESSION)rþ   Zcreate_default_contextÚ
SSLContextZPROTOCOL_SSLv23ÚoptionsZOP_NO_SSLv2ZOP_NO_SSLv3ZOP_NO_COMPRESSIONÚAttributeErrorrH   rI   ÚformatZset_default_verify_paths)r  Ú
sslcontextZattr_errrA   rA   rB   Ú_make_ssl_context€  s    ýÿzTCPConnector._make_ssl_context)rÍ   r>   c                 C   sz   |  ¡ rrtdkrtdƒ‚|j}t|tjƒr.|S |dk	r@|  d¡S | j}t|tjƒrV|S |dk	rh|  d¡S |  d¡S dS dS )a*  Logic to get the correct SSL context

        0. if req.ssl is false, return None

        1. if ssl_context is specified in req, use it
        2. if _ssl_context is specified in self, use it
        3. otherwise:
            1. if verify_ssl is not specified in req, use self.ssl_context
               (will generate a default context according to self.verify_ssl)
            2. if verify_ssl is True in req, generate a default SSL context
            3. if verify_ssl is False in req, generate a SSL context that
               won't verify
        NzSSL is not supported.FT)r¸   rþ   ÚRuntimeErrorÚ
isinstancer  r  r  )r@   rÍ   r  rA   rA   rB   Ú_get_ssl_context•  s    


zTCPConnector._get_ssl_contextr'   c                 C   s,   |j }t|tƒr|S | j}t|tƒr(|S d S rq   )rþ   r!  r'   r  )r@   rÍ   ÚretrA   rA   rB   Ú_get_fingerprint¶  s    

zTCPConnector._get_fingerprint©Úclient_error)ÚargsrÍ   r»   r&  rm   r>   c             
   Ï   sÊ   z8t |jƒ�$ | jj||ŽI d H W  5 Q R £ W S Q R X W nŒ tk
rh } zt|j|ƒ|‚W 5 d }~X Y n^ tk
r– } zt|j|ƒ|‚W 5 d }~X Y n0 t	k
rÄ } z||j|ƒ|‚W 5 d }~X Y nX d S rq   )
r*   Úsock_connectrW   Úcreate_connectionr#   r   rÏ   r$   r   ÚOSError)r@   rÍ   r»   r&  r'  rm   r¬   rA   rA   rB   Ú_wrap_create_connection¿  s    ,z$TCPConnector._wrap_create_connection)rÍ   rÎ   r»   r&  r>   c                Ã   sø  |   |¡}|  |¡}|jj}|d k	s(t‚|j}|d k	s:t‚tj| j|||d�| j	d�}	zt 
|	¡I d H }
W n` tjk
rœ   dd dœdd„}|	 |¡ ‚ Y n0 tk
rÊ } zt|j|ƒ|‚W 5 d }~X Y nX d }|
D �]
}|d }|d }zN| j| j|||||d	 |d
 |d |�r|d nd | j||d�I d H \}}W n0 tk
�rh } z|}W Y ¢qÔW 5 d }~X Y nX | ¡ �rÖ|�rÖz| |¡ W nL tk
�rÔ } z,| ¡  | j�s¸| j |¡ |}W Y ¢qÔW 5 d }~X Y nX ||f  S |d k	�sðt‚|‚d S )N)rÎ   rŽ   z$asyncio.Future[List[Dict[str, Any]]])rÕ   r>   c              	   S   s$   t ttjƒ� |  ¡  W 5 Q R X d S rq   )r   rv   r   ÚCancelledErrorr  )rÕ   rA   rA   rB   Údrop_exceptionê  s    z>TCPConnector._create_direct_connection.<locals>.drop_exceptionrï   r  rü   r½   r  r  )	r»   rþ   rü   r½   r  Úserver_hostnamerÿ   rÍ   r&  )r"  r$  ÚurlZraw_hostrÉ   r  r   Zensure_futurer  rW   Zshieldr,  Úadd_done_callbackr*  r   rÏ   r+  r�   r  r¸   Úcheckr"   rz   r    r¡   rt   )r@   rÍ   rÎ   r»   r&  r  rù   rï   r  Zhost_resolvedZhostsr-  r¬   Úlast_excZhinfoZtranspr½   rA   rA   rB   r  Ñ  sh    

 ÿ
 
ôz&TCPConnector._create_direct_connectionc                 Ã   s*  i }|j d k	r|j }|jtj |tj< |j}|d k	s8t‚ttj|||j| j	|j
d�}| j|g |td�I d H \}}| ¡  |j tjd ¡}	|	d k	r²| ¡ s¦|	|jtj< n|	|jtj< | ¡ �r"|  |¡}
tj|_|j|_tj|jd d d d�}t| ||| j	ƒ}| |¡I d H }�z
z0|j}|d k	�s$t‚| ¡  | |¡I d H }W n( tk
�rf   | ¡  | ¡  ‚ Y n®X d |_d |_ zp|j!dk�rº|j"}|d k�r t#|j! d }t$|j%|j&|j!||jd�‚|j'dd d�}|d k�rÚt(d	ƒ‚| )¡ }W 5 | ¡  X | j*| j+||
||j,|d
�I d H \}}W 5 | ¡  X ||fS )N)ÚheadersÚauthrT   rþ   r%  )r  Ú
proxy_authZproxy_headers_hashéÈ   r   )Ústatusrg   r3  Úsocket)Údefaultz)Transport does not expose socket instance)r»   rþ   Úsockr.  rÍ   )-Zproxy_headersr3  r   ZHOSTr  rÉ   r&   ZMETH_GETr5  rW   rþ   r  r!   rŠ   rÛ   ZAUTHORIZATIONr¸   ZPROXY_AUTHORIZATIONr"  ZMETH_CONNECTÚmethodr/  ÚattrZevolverÏ   rP   Úsendrz   rX   Zset_response_paramsÚstartrÐ   r~   r7  Úreasonr/   r    Zrequest_infoÚhistoryZget_extra_infor   Údupr+  r�   rï   )r@   rÍ   rÎ   r»   r3  r/  Z	proxy_reqrr   r½   r4  r  rR   ZconnZ
proxy_resprS   Zresprg   ZrawsockrA   rA   rB   r    s˜    
ú
   ÿ


   ÿ
û

ú	
z%TCPConnector._create_proxy_connection)NN)N).rL   rM   rN   r†   r.   r„   r   Úbytesré   r  r   r'   r   r�   r   r—   rè   r   r€   rC   r   rz   r‚   rü   rú   r  r   r   r   r  r%   rÓ   Ústaticmethodr›   Ú	lru_cacher  r"  r$  r   r   rv   rƒ   r+  r  r  Ú__classcell__rA   rA   r	  rB   r3   È  s¨   ïï)   ÿ þ ÿ  
þM  þ!ûùúùM  þr3   c                	       sx   e Zd ZdZdedddfeeeee	df e
e
eej ddœ‡ fdd„Zeed	œd
d„ƒZded dedœdd„Z‡  ZS )r4   a�  Unix socket connector.

    path - Unix socket path.
    keepalive_timeout - (optional) Keep-alive timeout.
    force_close - Set to True to force close and do reconnect
        after each request (and between redirects).
    limit - The total number of simultaneous connections.
    limit_per_host - Number of simultaneous connections to one host.
    loop - Optional event loop.
    Fr‡   r   N©ÚpathrŠ   r‰   r‹   rŒ   rT   r>   c                    s    t ƒ j|||||d� || _d S )N©rŠ   r‰   r‹   rŒ   rT   )r  rC   Ú_path©r@   rG  rŠ   r‰   r‹   rŒ   rT   r	  rA   rB   rC   �  s    	ûzUnixConnector.__init__rD   c                 C   s   | j S )zPath to unix socket.©rI  rG   rA   rA   rB   rG  Ÿ  s    zUnixConnector.pathr&   r8   r6   rÌ   c              
   Ã   sr   z6t |jƒ�" | j | j| j¡I d H \}}W 5 Q R X W n0 tk
rf } zt|j|ƒ|‚W 5 d }~X Y nX t	t
|ƒS rq   )r*   r(  rW   Zcreate_unix_connectionr�   rI  r*  r   rÏ   r   r%   ©r@   rÍ   rÎ   r»   r  r½   r¬   rA   rA   rB   rÓ   ¤  s     ÿ z UnixConnector._create_connection©rL   rM   rN   r†   r.   r�   r„   r   rè   r—   ré   r   r   r€   rC   r‚   rG  r   r%   rÓ   rE  rA   rA   r	  rB   r4   �  s,   ùø  þr4   c                	       sx   e Zd ZdZdedddfeeeee	df e
e
eej ddœ‡ fdd„Zeed	œd
d„ƒZded dedœdd„Z‡  ZS )r5   a   Named pipe connector.

    Only supported by the proactor event loop.
    See also: https://docs.python.org/3.7/library/asyncio-eventloop.html

    path - Windows named pipe path.
    keepalive_timeout - (optional) Keep-alive timeout.
    force_close - Set to True to force close and do reconnect
        after each request (and between redirects).
    limit - The total number of simultaneous connections.
    limit_per_host - Number of simultaneous connections to one host.
    loop - Optional event loop.
    Fr‡   r   NrF  c                    s6   t ƒ j|||||d� t| jtjƒs,tdƒ‚|| _d S )NrH  z9Named Pipes only available in proactor loop under windows)r  rC   r!  rW   r   ZProactorEventLoopr   rI  rJ  r	  rA   rB   rC   Á  s    	ûÿzNamedPipeConnector.__init__rD   c                 C   s   | j S )zPath to the named pipe.rK  rG   rA   rA   rB   rG  ×  s    zNamedPipeConnector.pathr&   r8   r6   rÌ   c              
   Ã   s‚   zFt |jƒ�2 | j | j| j¡I d H \}}t d¡I d H  W 5 Q R X W n0 tk
rv } zt	|j
|ƒ|‚W 5 d }~X Y nX tt|ƒS )Nr   )r*   r(  rW   Zcreate_pipe_connectionr�   rI  r   Úsleepr*  r   rÏ   r   r%   rL  rA   rA   rB   rÓ   Ü  s     ÿ z%NamedPipeConnector._create_connectionrM  rA   rA   r	  rB   r5   ²  s,   ùø  þr5   )Wr   r›   rß   r]   r[   rH   Úcollectionsr   r   Ú
contextlibr   Zhttp.cookiesr   Ú	itertoolsr   r   r¶   r   Útypesr	   Útypingr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r<  Ú r   r   Úabcr   Zclient_exceptionsr   r   r   r   r    r!   r"   r#   r$   Zclient_protor%   Zclient_reqrepr&   r'   r(   r)   r*   r+   r,   r-   r.   Úhttpr/   Úlocksr0   r   r1   rþ   r  ÚImportErrorrè   Ú__all__Zclientr6   r7   Útracingr8   r9   rP   r…   r2   rê   r3   r4   r5   rA   rA   rA   rB   Ú<module>   s^   @, 

Z   g)   <1