
­­­­­­­­­­­­­­­­­­
<!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rd	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	rt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       @Fd   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 )zThe 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 )zThe 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ri }|| }| 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rt| 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|  qW 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rz| 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  qn |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rt| 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  nt| j| j|< |r@|D ]}||I d H  q(zz~|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 qW 5 d }~X Y nX | r|rz|| W nL tk
r } z,|  | js| j| |}W Y qW 5 d }~X Y nX ||f  S |d k	st|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 nX d |_d |_ zp|j!dkr|j"}|d krt#|j! d }t$|j%|j&|j!||jd|j'dd d}|d krt(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