U
    ;g                     @   s  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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 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$m%Z%m&Z& d dl'Z'd dl(Z(d	d
l)m*Z*m+Z+ d	dl,m-Z-m.Z. d	dl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d	dl;m<Z< d	dl=m>Z>m?Z?m@Z@ d	dl+mAZAmBZBmCZCmDZDmEZEmFZF d	dlGmHZH zd dlIZIeIjJZJW n eKk
r   dZIeLZJY nX eMdhZNeMddhZOeMddhZPeOeNB ZQeQePB ZRdejS  kodk n  pejSdk ZTdZUer>d	dlVmWZW d	dl=mXZX d	dlYmZZZ G dd dZ[G dd  d Z\G d!d" d"Z]G d#d$ d$Z^G d%d& d&Z_e`eJd'd(d)Zaead*Zbead+ZcG d,d- d-e^ZdG d.d/ d/e^ZeG d0d1 d1e^ZfdS )2    N)OrderedDictdefaultdict)suppress)
HTTPStatus)chaincycleislice)	monotonic)TracebackType)TYPE_CHECKINGAny	AwaitableCallableDefaultDictDictIteratorListLiteralOptionalSequenceSetTupleTypeUnioncast   )hdrshelpers)AbstractResolverResolveResult)ClientConnectionErrorClientConnectorCertificateErrorClientConnectorDNSErrorClientConnectorErrorClientConnectorSSLErrorClientHttpProxyErrorClientProxyConnectionErrorServerFingerprintMismatchUnixClientConnectorErrorcert_errors
ssl_errors)ResponseHandler)ClientRequestFingerprint_merge_ssl_params)ceil_timeoutis_ip_addressnoopsentinelset_exception
set_result)DefaultResolver httphttpswswss)      r   )r;   r<   r   )r;         )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 NFrG   )selfrJ    rN   Q/opt/bot/vods_filmes/script/venv/lib/python3.8/site-packages/aiohttp/connector.py__init__d   s    z_DeprecationWaiter.__init__rK   c                 C   s   d| _ | j S NT)rI   rH   	__await__rM   rN   rN   rO   rS   h   s    z_DeprecationWaiter.__await__c                 C   s   | j stdt d S )NzDConnector.close() is a coroutine, please use await connector.close())rI   warningswarnDeprecationWarningrT   rN   rN   rO   __del__l   s
    z_DeprecationWaiter.__del__)	__name__
__module____qualname__	__slots__r   r   rP   rS   rX   rN   rN   rN   rO   rF   a   s   rF   c                   @   s   e 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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 )!
ConnectionNr?   rD   )	connectorkeyprotocollooprK   c                 C   s<   || _ || _|| _|| _g | _| r8tt	d| _
d S )Nr   )_key
_connector_loop	_protocol
_callbacks	get_debug	tracebackextract_stacksys	_getframe_source_traceback)rM   r^   r_   r`   ra   rN   rN   rO   rP   y   s    zConnection.__init__rQ   c                 C   s   d| j  dS )NzConnection<>)rb   rT   rN   rN   rO   __repr__   s    zConnection.__repr__	_warningsrK   c                 C   sz   | j d k	rvd| i}|jd| tf| | j r6d S | jj| j| j dd | dd}| jd k	rj| j|d< | j	| d S )NsourcezUnclosed connection Tshould_closezUnclosed connection)Zclient_connectionmessagesource_traceback)
re   rV   ResourceWarningrd   	is_closedrc   _releaserb   rl   call_exception_handler)rM   rp   kwargscontextrN   rN   rO   rX      s    




zConnection.__del__Tc                 C   s   dS )z9Force subclasses to not be falsy, to make checks simpler.TrN   rT   rN   rN   rO   __bool__   s    zConnection.__bool__c                 C   s   t jdtdd | jS )Nz%connector.loop property is deprecated   
stacklevel)rU   rV   rW   rd   rT   rN   rN   rO   ra      s      zConnection.loopc                 C   s   | j d krd S | j jS N)re   	transportrT   rN   rN   rO   r      s    
zConnection.transportc                 C   s   | j S r   )re   rT   rN   rN   rO   r`      s    zConnection.protocol)callbackrK   c                 C   s   |d k	r| j | d S r   )rf   append)rM   r   rN   rN   rO   add_callback   s    zConnection.add_callbackc              
   C   s>   | j d d  g  }| _ |D ]}tt |  W 5 Q R X qd S r   )rf   r   	Exception)rM   	callbackscbrN   rN   rO   _notify_release   s    
zConnection._notify_releasec                 C   s2   |    | jd k	r.| jj| j| jdd d | _d S )NTrr   r   re   rc   rx   rb   rT   rN   rN   rO   close   s    
zConnection.closec                 C   s.   |    | jd k	r*| j| j| j d | _d S r   r   rT   rN   rN   rO   release   s    
zConnection.releasec                 C   s   | j d kp| j   S r   )re   is_connectedrT   rN   rN   rO   closed   s    zConnection.closed)rY   rZ   r[   rl   r+   asyncioAbstractEventLooprP   strrn   rU   r   rX   r   r|   propertyra   r   	Transportr   r`   r   r   r   r   r   boolr   rN   rN   rN   rO   r]   u   s,   r]   c                   @   s"   e Zd ZdZdZddddZdS )_TransportPlaceholderz.placeholder for BaseConnector.connect functionrN   NrQ   c                 C   s   dS )z Close the placeholder transport.NrN   rT   rN   rN   rO   r      s    z_TransportPlaceholder.close)rY   rZ   r[   __doc__r\   r   rN   rN   rN   rO   r      s   r   c                
   @   s  e Zd ZdZdZdZdZeZe	ddddddd	e
edef eeeeeej e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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-d.Z'e(e)d/ d0e*d1d2d3Z+d+e)d/ dd4d5d6Z,d+e)d/ ee* d4d7d8Z-ddd9d:Z.d+e/dd;d<d=Z0dd>d+e/edd?d@dAZ1e(e)d/ d0e/d1dBdCZ2dS )Er?   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.
    timeout_ceil_threshold - Trigger ceiling of timeout values when
                             it's above timeout_ceil_threshold.
    loop - Optional event loop.
    TNg       @Fd   r      keepalive_timeoutforce_closelimitlimit_per_hostenable_cleanup_closedra   timeout_ceil_threshold)r   r   r   r   r   ra   r   rK   c                C   s   |r|d k	r*|t k	r*tdn|t kr*d}|p4t }|| _d| _| r\tt	
d| _i | _|| _|| _t | _tt| _tt|| _|| _tt| _|| _tjt|d| _d | _d | _|rt st!j"dt	j# t$dd d}| | _%g | _&| '  d S )	Nz6keepalive_timeout cannot be set if force_close is Trueg      .@Fr   ra   zoenable_cleanup_closed ignored because https://github.com/python/cpython/pull/118960 is fixed in Python version r}   r~   )(r2   
ValueErrorr   get_running_loop_timeout_ceil_threshold_closedrg   rh   ri   rj   rk   rl   _conns_limit_limit_per_hostset	_acquiredr   _acquired_per_hostr   float_keepalive_timeout_force_closer   _waitersrd   	functoolspartialr+   _factory_cleanup_handle_cleanup_closed_handleNEEDS_CLEANUP_CLOSEDrU   rV   version_inforW   _cleanup_closed_disabled_cleanup_closed_transports_cleanup_closed)rM   r   r   r   r   r   ra   r   rN   rN   rO   rP      sH    
zBaseConnector.__init__ro   c                 C   s~   | j r
d S | jsd S dd | j D }|   d| i}|jd| tf| | |dd}| jd k	rn| j|d< | j| d S )Nc                 S   s   g | ]}t |qS rN   )repr).0crN   rN   rO   
<listcomp>7  s     z)BaseConnector.__del__.<locals>.<listcomp>rq   zUnclosed connector zUnclosed connector)r^   connectionsrt   ru   )	r   r   values_closerV   rv   rl   rd   ry   )rM   rp   connsrz   r{   rN   rN   rO   rX   1  s    

zBaseConnector.__del__rQ   c                 C   s   t dt | S )NzH"with Connector():" is deprecated, use "async with Connector():" instead)rU   rV   rW   rT   rN   rN   rO   	__enter__F  s
    zBaseConnector.__enter__)excrK   c                 G   s   |    d S r   )r   )rM   r   rN   rN   rO   __exit__N  s    zBaseConnector.__exit__c                    s   | S r   rN   rT   rN   rN   rO   
__aenter__Q  s    zBaseConnector.__aenter__)exc_type	exc_valueexc_tracebackrK   c                    s   |   I d H  d S r   )r   )rM   r   r   r   rN   rN   rO   	__aexit__T  s    zBaseConnector.__aexit__c                 C   s   | j S )z1Ultimately close connection on releasing if True.)r   rT   rN   rN   rO   r   \  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   rT   rN   rN   rO   r   a  s    zBaseConnector.limitc                 C   s   | j S )zThe limit for simultaneous connections to the same endpoint.

        Endpoints are the same if they are have equal
        (host, port, is_ssl) triple.
        )r   rT   rN   rN   rO   r   j  s    zBaseConnector.limit_per_hostc                 C   s   | j r| j   d| _ t }| j}| jri }|| }| j D ]p\}}g }|D ]R\}}	| rz|	| dkrz|||	f qN|j}
|	  | j
sN|jrN| j|
 qN|r>|||< q>|| _| jrtj| d|| j| jd| _ dS )zCleanup unused transports.Nr   _cleanupr   )r   cancelr	   r   r   itemsr   r   r   r   r   is_sslr   r   weakref_handlerd   r   )rM   nowtimeoutr   deadliner_   r   aliveprotoZuse_timer   rN   rN   rO   r   s  s:    

zBaseConnector._cleanupc                 C   sX   | j r| j   | jD ]}|dk	r|  qg | _| jsTtj| d| j| j| j	d| _ dS )z~Double confirmation for transport close.

        Some broken ssl servers may leave socket open without proper close.
        Nr   r   )
r   r   r   abortr   r   r   _cleanup_closed_periodrd   r   )rM   r   rN   rN   rO   r     s    


zBaseConnector._cleanup_closedc                 C   s   |    tt S )zClose all opened transports.)r   rF   r1   rT   rN   rN   rO   r     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 ]}|D ]}|  qq| j  d | _| j  d | _	X d S rR   )r   r   clearr   r   r   r   r   r   r   rd   rw   r   r   )rM   keyed_waitersZkeyed_waiterdatar   t0r   rN   rN   rO   r     s6    









zBaseConnector._closec                 C   s   | j S )z;Is connector closed.

        A readonly property.
        )r   rT   rN   rN   rO   r     s    zBaseConnector.closedrD   r_   rK   c                 C   s\   d}| j r&| j t| j  }dkr&|S | j }rX| j| }rL|t|8 }||krX|S |S )z
        Return number of available connections.

        The limit, limit_per_host and the connection key are taken into account.

        If it returns less than 1 means that there are no connections
        available.
        r   r   )r   lenr   r   r   get)rM   r_   Ztotal_remainZhost_remainZacquiredrN   rN   rO   _available_connections  s    
z$BaseConnector._available_connectionsrE   rC   reqtracesr   rK   c           
         s  |j }| ||I dH  }dk	r$|S t|j|j4 I dH  | |dkr| ||I dH  | ||I dH  }dk	r|W  5 Q I dH R  S ttt	 }| j
| | j| | zR|r|D ]}| I dH  q| |||I dH }|r|D ]}| I dH  qW n$ tk
r,   | ||  Y nX | jrF|  tdW 5 Q I dH R X | j| }	| j
| |	| | j
| |	| t| ||| jS )z'Get from pool or create new connection.Nr   zConnector is closed.)connection_key_getr/   connectceil_thresholdr   _wait_for_available_connectionr   r+   r   r   addr   Zsend_connection_create_start_create_connectionZsend_connection_create_endBaseException_release_acquiredr   r   r    remover]   rd   )
rM   r   r   r   r_   connplaceholdertracer   Zacquired_per_hostrN   rN   rO   r     s>    


zBaseConnector.connect)r_   r   rK   c              
      s   d}| j  }| j| }d||< |r2|j|dd zF|rP|D ]}| I dH  q<|I dH  |rv|D ]}| I dH  qbW 5 ||d | j|ds| j|= X | |dkrq|d7 }qdS )z&Wait for an available connection slot.r   NFlastTr   )	rd   create_futurer   move_to_endpopr   Zsend_connection_queued_startZsend_connection_queued_endr   )rM   r_   r   Zattemptsfutr   r   rN   rN   rO   r   2  s(    




z,BaseConnector._wait_for_available_connectionc           	   	      s  z| j | }W n tk
r$   Y dS X t }|r| \}}| r|| | jkr|s^| j |= | j| | j| | |r|D ]:}z|	 I dH  W q t
k
r   | ||  Y qX qt| ||| jS |j}|  | js,|jr,| j| q,| j |= dS )znGet next reusable connection for the key or None.

        The connection will be marked as acquired.
        N)r   KeyErrorr	   r   r   r   r   r   r   Zsend_connection_reuseconnr   r   r]   rd   r   r   r   r   r   r   )	rM   r_   r   r   t1r   r   r   r   rN   rN   rO   r   \  s4    
zBaseConnector._getc                 C   st   | j s
dS t| j }t| |D ]L}| |dk r6q"| j | }|r"|jdd\}}| s@|d  dS q@q"dS )z
        Iterates over all waiters until one to be released is found.

        The one to be released is not finished and
        belongs to a host that has available connections.
        Nr   Fr   )r   listrandomshuffler   popitemdoner4   )rM   Zqueuesr_   waiterswaiter_rN   rN   rO   _release_waiter  s    



zBaseConnector._release_waiter)r_   r   rK   c                 C   sH   | j r
dS | j| | j| }r<|| |s<| j|= |   dS )zRelease acquired connection.N)r   r   discardr   r   r   )rM   r_   r   r   rN   rN   rO   r     s    
zBaseConnector._release_acquiredrr   )r_   r`   rs   rK   c                C   s   | j r
d S | || | jr d}|s*|jrT|j}|  |jrP| jsP| j	| d S | j
|}|d krvg  }| j
|< |	|t f | jd krtj| d| j| j| jd| _d S )NTr   r   )r   r   r   rs   r   r   r   r   r   r   r   r   r	   r   r   r   r   rd   r   )rM   r_   r`   rs   r   r   rN   rN   rO   rx     s.    

zBaseConnector._releasec                    s
   t  d S r   )NotImplementedError)rM   r   r   r   rN   rN   rO   r     s    z BaseConnector._create_connection)NNN)3rY   rZ   r[   r   r   rl   r   HIGH_LEVEL_SCHEMA_SETallowed_protocol_schema_setr2   r   objectr   r   intr   r   r   rP   rU   r   rX   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r,   r   r]   r   r   r   r   r+   r   rx   r   rN   rN   rN   rO   r?      s   D   
'(  4 + +'  r?   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 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 dddZe	e
ef edddZdS )_DNSCacheTableN)ttlrK   c                 C   s   i | _ i | _|| _d S r   )	_addrs_rr_timestamps_ttl)rM   r  rN   rN   rO   rP     s    z_DNSCacheTable.__init__)hostrK   c                 C   s
   || j kS r   )r  )rM   r	  rN   rN   rO   __contains__  s    z_DNSCacheTable.__contains__)r_   addrsrK   c                 C   s0   t |t|f| j|< | jd k	r,t | j|< d S r   )r   r   r  r  r	   r  )rM   r_   r  rN   rN   rO   r     s    
z_DNSCacheTable.addr   c                 C   s*   | j |d  | jd k	r&| j|d  d S r   )r  r   r  r  rM   r_   rN   rN   rO   r     s    
z_DNSCacheTable.removerQ   c                 C   s   | j   | j  d S r   )r  r   r  rT   rN   rN   rO   r     s    
z_DNSCacheTable.clearc                 C   s(   | j | \}}tt||}t| |S r   )r  r   r   next)rM   r_   ra   lengthr  rN   rN   rO   
next_addrs  s    z_DNSCacheTable.next_addrsc                 C   s$   | j d krdS | j| | j  t k S rL   )r  r  r	   r  rN   rN   rO   expired  s    
z_DNSCacheTable.expired)N)rY   rZ   r[   r   r   rP   r  r   r
  r   r   r  r   r   r   r   r   r  r  rN   rN   rN   rO   r    s   r  )verifiedrK   c                 C   sn   t dkrdS | rt  S t t j}| jt jO  _| jt jO  _d|_t j|_	| jt j
O  _|  |S )zCreate SSL context.

    This method is not async-friendly and should be called from a thread
    because it will load certificates from disk and do other blocking I/O.
    NF)sslcreate_default_context
SSLContextPROTOCOL_TLS_CLIENToptionsOP_NO_SSLv2OP_NO_SSLv3check_hostname	CERT_NONEverify_modeOP_NO_COMPRESSIONset_default_verify_paths)r  
sslcontextrN   rN   rO   _make_ssl_context  s    r  TFc                       s  e Zd ZdZeedhB Zddddejj	dddde
dddddd	d
ddeee eee ejee eeeef eeeef  ee edeef eeeeeej eee ee d fddZed d fddZeedddZeedddZdFee ee ddddZdGeeee d  e!e" dddZ#eeef eee$d ee d  e!e" dddZ%e&e!d d e'd!d"d#Z(e&ee d$d%d&Z)e&ed' d$d(d)Z*e+d*e,e!e-j. e&d e/e0 e,eej1e'f d+d,d-Z2e+d*e,e&d e/e0 e,eej1e'f d.d/d0Z3d1dd$d2d3Z4ddd4d5Z5edd6d7Z6ej1e&dd8d9d:Z7e+fej1e&d e/e0 eej8e'f d;d<d=Z9e!e" e!e-j. d>d?d@Z:e+d*e&e!d d e/e0 eej1e'f dAdBdCZ;e&e!d d eej8e'f d!dDdEZ<  Z=S )Hr@   u-  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/HTTP_Public_Key_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.
    happy_eyeballs_delay - This is the “Connection Attempt Delay”
                           as defined in RFC 8305. To disable
                           the happy eyeballs algorithm, set to None.
    interleave - “First Address Family Count” as defined in RFC 8305
    loop - Optional event loop.
    ZtcpTN
   Fr   r   r   g      ?)
verify_sslfingerprintuse_dns_cachettl_dns_cachefamilyssl_contextr  
local_addrresolverr   r   r   r   r   ra   r   happy_eyeballs_delay
interleavec             	      s   t  j|
||||||d t||||| _|	d kr>t| jd}	|	| _|| _t|d| _	i | _
|| _t|| _|| _|| _t | _d S )Nr   r   )r  )superrP   r.   _sslr5   rd   	_resolver_use_dns_cacher  _cached_hosts_throttle_dns_futures_familyaiohappyeyeballsZaddr_to_addr_infos_local_addr_infos_happy_eyeballs_delay_interleaver   _resolve_host_tasks)rM   r!  r"  r#  r$  r%  r&  r  r'  r(  r   r   r   r   r   ra   r   r)  r*  	__class__rN   rO   rP   =  s,    
zTCPConnector.__init__rQ   c                    s<   t | j D ]}|  q| jD ]}|  q$t  S )zClose all ongoing DNS calls.)r   from_iterabler0  r   r   r6  r+  r   )rM   r   tr7  rN   rO   r   m  s
    


zTCPConnector.closec                 C   s   | j S )zSocket family like AF_INET.)r1  rT   rN   rN   rO   r%  w  s    zTCPConnector.familyc                 C   s   | j S )z%True if local DNS caching is enabled.)r.  rT   rN   rN   rO   r#  |  s    zTCPConnector.use_dns_cache)r	  portrK   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   )rM   r	  r;  rN   rN   rO   clear_dns_cache  s
    
zTCPConnector.clear_dns_cacherE   )r	  r;  r   rK   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| }| j }	||	 |r|D ]}|
|I dH  qz|	I dH  W 5 ||	 X | j	|S t  | j|< }| |||||}
t }tjdkrtj|
|dd}n
||
}| s| j| || jj zt|I dH W S  tjk
r   ddd	d
d}||  Y nX dS )z*Resolve host and return list of addresses.r   )hostnamer	  r;  r%  r   flagsNr%  )r;   r=   T)ra   Zeager_startz#asyncio.Future[List[ResolveResult]])r   rK   c              	   S   s$   t ttj |   W 5 Q R X d S r   )r   r   r   CancelledErrorresult)r   rN   rN   rO   drop_exception  s    z2TCPConnector._resolve_host.<locals>.drop_exception)r0   r1  r.  send_dns_resolvehost_startr-  resolvesend_dns_resolvehost_endr/  r  r  Zsend_dns_cache_hitr0  rd   r   r   r   r   _resolve_host_with_throttler   r   rj   r   TaskZcreate_taskr   r6  Zadd_done_callbackshieldr@  )rM   r	  r;  r   r   resr_   rA  futuresfuturecorora   Zresolved_host_taskrB  rN   rN   rO   _resolve_host  sf    	





zTCPConnector._resolve_hostzasyncio.Future[None])r_   r	  r;  rJ  r   rK   c           
   
      s   |r|D ]}| |I dH  qzz||r@|D ]}||I dH  q*| jj||| jdI dH }|rx|D ]}||I dH  qb| j	|| |D ]}t
|d qW n8 tk
r }	 z|D ]}t||	 q W 5 d}	~	X Y nX W 5 | j| X | j|S )zResolve host and set result for all waiters.

        This method must be run in a task and shielded from cancellation
        to avoid cancelling the underlying lookup.
        Nr?  )Zsend_dns_cache_missr0  r   rC  r-  rD  r1  rE  r/  r   r4   r   r3   r  )
rM   r_   r	  r;  rJ  r   r   r  r   erN   rN   rO   rF    s(    z(TCPConnector._resolve_host_with_throttlerC   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)rM   r   r   r   r   r   rN   rN   rO   r     s    zTCPConnector._create_connection)r   rK   c                 C   sd   |  sdS tdkrtd|j}t|tjr2|S |dk	r>tS | j}t|tjrT|S |dk	r`tS t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.T)r   r  RuntimeError
isinstancer  _SSL_CONTEXT_UNVERIFIEDr,  _SSL_CONTEXT_VERIFIED)rM   r   r  rN   rN   rO   _get_ssl_context  s    zTCPConnector._get_ssl_contextr-   c                 C   s,   |j }t|tr|S | j}t|tr(|S d S r   )r  rS  r-   r,  )rM   r   retrN   rN   rO   _get_fingerprint?  s    

zTCPConnector._get_fingerprintclient_error)args
addr_infosr   r   rZ  rz   rK   c          	         s,  z|t |j|jd4 I d H T tj|| j| j| j| jdI d H }| jj	||d|iI d H W  5 Q I d H R  W S Q I d H R X W n t
k
r } zt|j||W 5 d }~X Y n| tk
r } zt|j||W 5 d }~X Y nN tk
r& } z.|jd krt|tjr ||j||W 5 d }~X Y nX d S )Nr   )r\  Zlocal_addr_infosr)  r*  ra   sock)r/   sock_connectr   r2  Zstart_connectionr3  r4  r5  rd   create_connectionr)   r!   r   r*   r$   OSErrorerrnorS  r   TimeoutError)	rM   r\  r   r   rZ  r[  rz   r^  r   rN   rN   rO   _wrap_create_connectionH  s*    	 @z$TCPConnector._wrap_create_connection)r[  r   r   rZ  rz   rK   c                   s   zRt |j|jd4 I d H * | jj||I d H W  5 Q I d H R  W S Q I d H R X W n tk
r } zt|j||W 5 d }~X Y nv tk
r } zt	|j||W 5 d }~X Y nH t
k
r } z*|jd krt|tjr؂ ||j||W 5 d }~X Y nX d S Nr]  )r/   r_  r   rd   r`  r)   r!   r   r*   r$   ra  rb  rS  r   rc  )rM   r   r   rZ  r[  rz   r   rN   rN   rO   _wrap_existing_connectionf  s     8z&TCPConnector._wrap_existing_connectionr,   c                 C   s8   |  sdS |j}|dk	st|jdkr,dS |   dS )zRaise a :py:exc:`RuntimeError` on missing ``start_tls()``.

        It is necessary for TLS-in-TLS so that it is possible to
        send HTTPS queries through HTTPS proxies.

        This doesn't affect regular HTTP requests, though.
        Nr8   )r   rO  AssertionErrorscheme_check_loop_for_start_tls)rM   r   	proxy_urlrN   rN   rO   _fail_on_no_start_tls|  s    
z"TCPConnector._fail_on_no_start_tlsc              
   C   s>   z| j j W n, tk
r8 } ztd|W 5 d }~X Y nX d S )Na  An HTTPS request is being sent through an HTTPS proxy. This needs support for TLS in TLS but it is not implemented in your runtime for the stdlib asyncio.

Please upgrade to Python 3.11 or higher. For more details, please see:
* https://bugs.python.org/issue37179
* https://github.com/python/cpython/pull/28073
* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support
* https://github.com/aio-libs/aiohttp/discussions/6044
)rd   	start_tlsAttributeErrorrR  )rM   Zattr_excrN   rN   rO   ri    s    z&TCPConnector._check_loop_for_start_tlsc                 C   s,   z|    W n tk
r"   Y dS X dS d S )NFT)ri  rR  rT   rN   rN   rO   _loop_supports_start_tls  s
    z%TCPConnector._loop_supports_start_tls)underlying_transportr   rK   c                 C   s<   |j jjdkrdS t|dd}|r&dS tjdt| dd dS )z6Issue a warning if the requested URL has HTTPS scheme.r8   NZ_start_tls_compatibleFa  An HTTPS request is being sent through an HTTPS proxy. This support for TLS in TLS is known to be disabled in the stdlib asyncio (Python <3.11). This is why you'll probably see an error in the log below.

It is possible to enable it via monkeypatching. For more details, see:
* https://bugs.python.org/issue37179
* https://github.com/python/cpython/pull/28073

You can temporarily patch this as follows:
* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support
* https://github.com/aio-libs/aiohttp/discussions/6044
r;   )rq   r   )request_infourlrh  getattrrU   rV   RuntimeWarning)rM   ro  r   Zasyncio_supports_tls_in_tlsrN   rN   rO   _warn_about_tls_in_tls  s    z#TCPConnector._warn_about_tls_in_tls)ro  r   r   rZ  rK   c                    s  |   }| |}tr"|dk	s"tzzt|j|jd4 I dH P z*| jj||||j	pV|j
|jdI dH }W n tk
r   |   Y nX W 5 Q I dH R X W n tk
r } zt|j||W 5 d}~X Y n  tk
r } zt|j||W 5 d}~X Y n tk
rH } z.|jdkr*t|tjr* ||j||W 5 d}~X Y n tk
r }	 z>td|j
d|jdd|jd|jpd	 d
|	d|	W 5 d}	~	X Y n*X |dkrd}
||jt|
|| ||fS )z$Wrap the raw TCP transport with TLS.Nr]  )server_hostnameZssl_handshake_timeoutz2Cannot initialize a TLS-in-TLS connection to host :dz4 through an underlying connection to an HTTPS proxy z ssl:defaultz []z:Failed to start TLS (possibly caused by closing transport))r   rV  r   rg  r/   r_  r   rd   rl  ru  r	  totalr   r   r)   r!   r   r*   r$   ra  rb  rS  r   rc  	TypeErrorr    r;  rO  r  Zconnection_made)rM   ro  r   r   rZ  Z	tls_protor  Ztls_transportr   Ztype_errmsgrN   rN   rO   _start_tls_connection  sR    
 
 2
z"TCPConnector._start_tls_connection)hostsrK   c                 C   s|   g }|D ]n}|d }d|k}|r&t jnt j}| jr>| j|kr>q|rR||d ddfn
||d f}||t jt jd|f q|S )zConverts the list of hosts to a list of addr_infos.

        The list of hosts is the result of a DNS lookup. The list of
        addr_infos is the result of a call to `socket.getaddrinfo()`.
        r	  rv  r;  r   r6   )socketAF_INET6AF_INETr1  r   SOCK_STREAMIPPROTO_TCP)rM   r~  r\  Zhinfor	  is_ipv6r%  addrrN   rN   rO   _convert_hosts_to_addr_infos
  s     z)TCPConnector._convert_hosts_to_addr_infos)r   r   r   rZ  rK   c             
      s  |  |}| |}|jj}|d k	s(t|dr@|dd }|j}|d k	sRtz| j|||dI d H }	W nH t	k
r }
 z*|
j
d krt|
tjr t|j|
|
W 5 d }
~
X Y nX d }| |	}|r|r|jp|dnd }z(| j| j||||||dI d H \}}W nD ttjfk
rN }
 z|
}t|| j W Y qW 5 d }
~
X Y nX | r|rz|| W nj tk
r }
 zJ|  | js| j| |
}|d}|  }t!|| W Y qW 5 d }
~
X Y nX ||fS |d k	st|d S )Nz...)r   )r   r  r\  ru  r   rZ  r  )"rV  rX  rq  Zraw_hostrg  endswithrstripr;  rM  ra  rb  rS  r   rc  r"   r   r  ru  rd  r   r#   r2  Zpop_addr_infos_interleaver5  r   checkr'   r   r   r   r   get_extra_infogetpeernameZremove_addr_infos)rM   r   r   r   rZ  r  r"  r	  r;  r~  r   last_excr\  ru  Ztranspr   r^  Zbad_peerrN   rN   rO   rQ    s`    


 
	
z&TCPConnector._create_direct_connectionc                    s  |  | |  }i }|jd k	r&|j}|jtj |tj< |j}|d k	sJt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|r| || tj|_|j|_tj|jd d d d}t| ||	| j}||I d H }zhz8|j}|d k	s<t|j|| j d |!|I d H }W n* t"k
r   |  |   Y nX d |_zzt|j#dkr|j$}|d krt%|j#j&}t'|j(|j)|j#||jd|s|j*dd d}|d krt+d	|, }W n  t"k
r&   |   Y nX W 5 |s:|  X |sp| -|}| j.| j/||||j0|d
I d H W  S | j1|||dI d H W S W 5 |  X ||	fS )N)headersauthra   r  rY  )rO  
proxy_authZproxy_headers_hash)Zread_until_eofr      )statusrt   r  r  )rx  z)Transport does not expose socket instance)r   r  r^  ru  r   )r   r   )2rk  rn  proxy_headersr  r   ZHOSTrO  rg  r,   ZMETH_GETr  rd   r  rQ  r&   r   r   ZAUTHORIZATIONr   ZPROXY_AUTHORIZATIONrt  ZMETH_CONNECTmethodrq  attrZevolver   r]   sendr   re   Zset_response_paramsr   startr   r  reasonr   phraser%   rp  historyr  rR  duprV  rf  r   r	  r}  )rM   r   r   r   Zruntime_has_start_tlsr  rq  Z	proxy_reqr   r   r  r_   r   Z
proxy_respr`   resprt   Zrawsockr  rN   rN   rO   rP  j  s    


   
   




	
z%TCPConnector._create_proxy_connection)NN)N)>rY   rZ   r[   r   r   	frozensetr  r  AddressFamily	AF_UNSPECr2   r   r   bytesr  r  r   r-   r   r   r   r   r  r   r   rP   r   r   r   r%  r#  r<  r   r   r   rM  r   rF  r,   r+   r   rV  rX  r#   r   r2  ZAddrInfoTyper   r   r   rd  rf  rk  ri  rn  rt  ZBaseTransportr}  r  rQ  rP  __classcell__rN   rN   r7  rO   r@     s   0
       
]

*  !#
*?L  r@   c                	       s   e Zd ZdZeedhB 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eed dedddZ  ZS )rA   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.
    unixFr   r   Npathr   r   r   r   ra   rK   c                    s    t  j|||||d || _d S )Nr   r   r   r   ra   )r+  rP   _pathrM   r  r   r   r   r   ra   r7  rN   rO   rP     s    	zUnixConnector.__init__rQ   c                 C   s   | j S )zPath to unix socket.r  rT   rN   rN   rO   r    s    zUnixConnector.pathrE   rC   r   c              
      s   zJt |j|jd4 I d H " | j| j| jI d H \}}W 5 Q I d H R X W nL tk
r } z.|jd krtt	|t
jrt t| j|j||W 5 d }~X Y nX |S re  )r/   r_  r   rd   Zcreate_unix_connectionr   r  ra  rb  rS  r   rc  r(   r  r   rM   r   r   r   r   r   r   rN   rN   rO   r     s      "$z UnixConnector._create_connectionrY   rZ   r[   r   r   r  r  r2   r   r   r   r  r   r  r   r   r   rP   r   r  r,   r   r+   r   r  rN   rN   r7  rO   rA     s.     rA   c                	       s   e Zd ZdZeedhB 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eed dedddZ  ZS )rB   a  Named pipe connector.

    Only supported by the proactor event loop.
    See also: https://docs.python.org/3/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.
    ZnpipeFr   r   Nr  c                    s6   t  j|||||d t| jtjs,td|| _d S )Nr  z9Named Pipes only available in proactor loop under windows)r+  rP   rS  rd   r   ZProactorEventLooprR  r  r  r7  rN   rO   rP   6  s    	 zNamedPipeConnector.__init__rQ   c                 C   s   | j S )zPath to the named pipe.r  rT   rN   rN   rO   r  N  s    zNamedPipeConnector.pathrE   rC   r   c              
      s   zZt |j|jd4 I d H 2 | j| j| jI d H \}}tdI d H  W 5 Q I d H R X W nH t	k
r } z*|j
d krt|tjr t|j||W 5 d }~X Y nX tt|S )Nr]  r   )r/   r_  r   rd   Zcreate_pipe_connectionr   r  r   sleepra  rb  rS  rc  r#   r   r   r+   r  rN   rN   rO   r   S  s      $ z%NamedPipeConnector._create_connectionr  rN   rN   r7  rO   rB   %  s.     rB   )gr   r   r   r  rj   rh   rU   collectionsr   r   
contextlibr   r7   r   	itertoolsr   r   r   timer	   typesr
   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2  r  r6   r   r   abcr   r   Zclient_exceptionsr    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   Zclient_protor+   Zclient_reqrepr,   r-   r.   r/   r0   r1   r2   r3   r4   r(  r5   r  r  ImportErrorr  r  ZEMPTY_SCHEMA_SETZHTTP_SCHEMA_SETZWS_SCHEMA_SETZHTTP_AND_EMPTY_SCHEMA_SETr   r   r   __all__clientrC   rD   tracingrE   rF   r]   r   r?   r  r   r  rU  rT  r@   rA   rB   rN   rN   rN   rO   <module>   sz   H4 


	X	    '     U7