U '7`ا@sNddlZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z ddl mZmZddlmZddlmZddlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"ddl#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/m0Z0m1Z1m2Z2d d l3m4Z4d dl5m6Z6m7Z7m8Z8d dl&m9Z9m:Z:m;Z;mZ>d dl?m@Z@d dlAmBZBd dlCmDZDzddlEZEeEjFZFWneGk rdZEeHZFYnXdZIerd dlJmKZKd dl5mLZLd dlMmNZNGdddZOGdddZPGdddZQGdddZRGdd d ZSGd!d"d"eRZTGd#d$d$eRZUGd%d&d&eRZVdS)'N) defaultdictdeque)suppress) SimpleCookie)cycleislice) monotonic) TracebackType) TYPE_CHECKINGAny AwaitableCallable DefaultDictDictIteratorListOptionalSetTupleTypeUnioncast)hdrshelpers)AbstractResolver) ClientConnectionErrorClientConnectorCertificateErrorClientConnectorErrorClientConnectorSSLErrorClientHttpProxyErrorClientProxyConnectionErrorServerFingerprintMismatch cert_errors ssl_errors)ResponseHandler) ClientRequest Fingerprint_merge_ssl_params)PY_36 CeilTimeoutget_running_loop is_ip_addressnoopsentinel) RESPONSES)EventResultOrError)DefaultResolver) BaseConnector TCPConnector UnixConnectorNamedPipeConnector) ClientTimeout) ConnectionKey)Tracec@s@eZdZdZeeddddZedddZddd d ZdS) _DeprecationWaiter _awaitable_awaitedN) awaitablereturncCs||_d|_dSNFr:)selfr=rAD/opt/alt/python38/lib64/python3.8/site-packages/aiohttp/connector.py__init__Isz_DeprecationWaiter.__init__r>cCsd|_|jSNT)r<r; __await__r@rArArBrFMsz_DeprecationWaiter.__await__cCs|jstdtdS)NzDConnector.close() is a coroutine, please use await connector.close())r<warningswarnDeprecationWarningrGrArArB__del__Qs z_DeprecationWaiter.__del__) __name__ __module__ __qualname__ __slots__r r rCrFrKrArArArBr9Fsr9c@seZdZdZdZddeejddddZe ddd Z e fe dd d d Z eejdd dZeeejdddZeeedddZegdfddddZddddZddddZddddZeedddZdS) ConnectionNr2r7) connectorkeyprotocolloopr>cCs<||_||_||_||_g|_|r8tt d|_ dS)Nr) _key _connector_loop _protocol _callbacks get_debug traceback extract_stacksys _getframe_source_traceback)r@rQrRrSrTrArArBrC_szConnection.__init__rDcCsd|jdS)Nz Connection<>)rUrGrArArB__repr__oszConnection.__repr__ _warningsr>cCs|jdk rtrd|i}ni}|jd|tf||jr@dS|jj|j|jdd|dd}|j dk rt|j |d<|j |dS)NsourcezUnclosed connection T should_closezUnclosed connection)Zclient_connectionmessagesource_traceback) rXr)rIResourceWarningrW is_closedrV_releaserUr_call_exception_handler)r@rckwargscontextrArArBrKrs      zConnection.__del__cCstjdtdd|jS)Nz%connector.loop property is deprecated) stacklevel)rHrIrJrWrGrArArBrTs zConnection.loopcCs|jdkrdS|jjSN)rX transportrGrArArBrrs zConnection.transportcCs|jSrq)rXrGrArArBrSszConnection.protocol)callbackr>cCs|dk r|j|dSrq)rYappend)r@rsrArArB add_callbackszConnection.add_callbackc Cs>|jddg}|_|D]}tt |W5QRXqdSrq)rYr Exception)r@Z callbackscbrArArB_notify_releases zConnection._notify_releasecCs2||jdk r.|jj|j|jddd|_dS)NTre)rxrXrVrkrUrGrArArBcloses zConnection.closecCs6||jdk r2|jj|j|j|jjdd|_dS)Nre)rxrXrVrkrUrfrGrArArBreleases zConnection.releasecCs|jdkp|j Srq)rX is_connectedrGrArArBclosedszConnection.closed)rLrMrNr_ _transportr%asyncioAbstractEventLooprCstrrarHr rKpropertyrTr TransportrrrSr rurxryrzboolr|rArArArBrPZs,  rPc@seZdZdZddddZdS)_TransportPlaceholderz0 placeholder for BaseConnector.connect function NrDcCsdSrqrArGrArArBrysz_TransportPlaceholder.close)rLrMrN__doc__ryrArArArBrsrc @seZdZdZdZdZdZeddddddee de fe e e e e ejdd d d Zefedd d dZddddZeddddZddddZdDe eee ee eddddZee dddZee dddZee dddZddd d!Zd"e dd#d$d%Z!ddd&d'Z"e#ddd(d)Z$ddd*d+Z%ee dd,d-Z&d"e d.d/d0Z'd1e(d2d3e)d4d5d6Z*d"e e d.d7d8Z+ddd9d:Z,d"e dd;dd"e e dd?d@dAZ.d1e(d2d3e d4dBdCZ/dS)Er2aBase 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@Fdrkeepalive_timeout force_closelimitlimit_per_hostenable_cleanup_closedrT)rrrrrrTr>cCs|r|dk r*|tk r*tdn |tkr*d}t|}d|_|rRttd|_ i|_ ||_ ||_ t |_tt |_tt||_||_tt|_||_tjt|d|_t|_d|_d|_| |_ g|_!|"dS)Nz6keepalive_timeout cannot be set if force_close is Trueg.@FrrT)#r. ValueErrorr+_closedrZr[r\r]r^r__conns_limit_limit_per_hostset _acquiredr_acquired_per_hostrfloat_keepalive_timeout _force_closer_waitersrW functoolspartialr%_factoryrZcookies_cleanup_handle_cleanup_closed_handle_cleanup_closed_disabled_cleanup_closed_transports_cleanup_closed)r@rrrrrrTrArArBrCs<   zBaseConnector.__init__rbcCs|jr dS|jsdSdd|jD}|tr>d|i}ni}|jd|tf|||dd}|jdk rx|j|d<|j |dS)NcSsg|] }t|qSrA)repr).0crArArB sz)BaseConnector.__del__..rdzUnclosed connector zUnclosed connector)rQ connectionsrgrh) rrvalues_closer)rIrir_rWrl)r@rcconnsrmrnrArArBrKs"   zBaseConnector.__del__rDcCstdt|S)NzH"witn Connector():" is deprecated, use "async with Connector():" instead)rHrIrJrGrArArB __enter__s zBaseConnector.__enter__)excr>cGs |dSrqry)r@rrArArB__exit__%szBaseConnector.__exit__cs|SrqrArGrArArB __aenter__(szBaseConnector.__aenter__)exc_type exc_value exc_tracebackr>cs|IdHdSrqr)r@rrrrArArB __aexit__+szBaseConnector.__aexit__cCs|jS)z1Ultimately close connection on releasing if True.)rrGrArArBr3szBaseConnector.force_closecCs|jS)zThe total number for simultaneous connections. If limit is 0 the connector has no limit. The default limit size is 100. )rrGrArArBr8szBaseConnector.limitcCs|jS)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. )rrGrArArBrAs zBaseConnector.limit_per_hostc Cs|jr|jd|_|j}|j}|jri}||}|jD]\}}g}|D]z\}} |r| |dkr|j} | |j r|j s|j | q| || fqR|j} | |j rR|j sR|j | qR|rB|||<qB||_|jrt|d||j|_dS)zCleanup unused transports.Nr_cleanup)rcancelrWtimerritemsr{rrryis_sslrrrtrweakref_handle) r@ZnowtimeoutrZdeadlinerRrZaliveprotoZuse_timerrrArArBrLs@       zBaseConnector._cleanupr7)rRvalr>cCs4|j}||krdS||}|||s0|j|=dSrq)rremove)r@rRrZacquired_per_hostrrArArB_drop_acquired_per_hostus z%BaseConnector._drop_acquired_per_hostcCsR|jr|j|jD]}|dk r|qg|_|jsNt|d|j|j|_dS)z}Double confirmation for transport close. Some broken ssl servers may leave socket open without proper close. Nr) rrrabortrrr_cleanup_closed_periodrW)r@rrrArArBrs   zBaseConnector._cleanup_closedcCs|ttS)zClose all opened transports.)rr9r-rGrArArBryszBaseConnector.closecCs|jr dSd|_z|j r$W~dS|jr4|j |jrD|j |j D]}|D]\}}| qVqN|jD] }| qp|jD]}|dk r| qW5|j|j|jd|_|jd|_XdSrE)rrclearrrrrrrWrjrrryr)r@datart0rrrArArBrs0            zBaseConnector._closecCs|jS)z;Is connector closed. A readonly property. )rrGrArArBr|szBaseConnector.closedrRr>cCs|jrV|jt|j}|jr|dkr||jkr|j|}|dk sFt|jt|}n<|jr||jkr|j|}|dk s~t|jt|}nd}|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. rNr)rlenrrrgetAssertionError)r@rR availableZacquiredrArArB_available_connectionss"     z$BaseConnector._available_connectionsr&r8r6reqtracesrr>c sb|j}||}|dks$||jkr|j}|j|||rZ|D]}|IdHqFznz|IdHWnZtk r}z<||jkrz|j||Wnt k rYnX|W5d}~XYnXW5||jkr|j|s|j|=X|r|D]}| IdHq| |} | dkrt t t} |j| |j|| |rb|D]}|IdHqLz0||||IdH} |jr| tdWn@tk r|js|j| ||| |Yn"X|js|j| ||| |r6|D]}|IdHqn |r6|D]}|IdHq |j| |j|| t||| |jS)z'Get from pool or create new connection.rNzConnector is closed.)connection_keyrrrWZ create_futurertZsend_connection_queued_start BaseExceptionrrZsend_connection_queued_end_getrr%rraddrZsend_connection_create_start_create_connectionrryrr_release_waiterZsend_connection_create_endZsend_connection_reuseconnrP) r@rrrrRrfuttraceerZ placeholderrArArBconnectsj              zBaseConnector.connectcCsz|j|}Wntk r$YdSX|j}|r|\}}|r|||jkr~|j}||j r|j s|j |q|s|j|=|Sq0|j}||j r0|j s0|j |q0|j|=dSrq) rKeyErrorrWrpopr{rrrryrrrrt)r@rRrt1rrrrrArArBr2s,    zBaseConnector._getcCsp|js dSt|j}t||D]D}||dkr:q&|j|}|r&|}|sD|ddSqDq&dS)z Iterates over all waiters till found one that is not finsihed and belongs to a host that has available connections. Nr) rlistkeysrandomZshufflerpopleftZdoneZ set_result)r@ZqueuesrRwaitersZwaiterrArArBrQs   zBaseConnector._release_waiter)rRrr>cCsH|jr dSz|j||||Wntk r:Yn X|dSrq)rrrrrr)r@rRrrArArB_release_acquiredis zBaseConnector._release_acquiredre)rRrSrfr>cCs|jr dS||||jr d}|s*|jrR|j}||jr|js|j |nV|j |}|dkrtg}|j |<| ||j f|jdkrt|d|j|j |_dS)NTr)rrrrfrrryrrrrtrrrWrrrrr)r@rRrSrfrrrrArArBrkxs*     zBaseConnector._releasecs tdSrq)NotImplementedError)r@rrrrArArBrsz BaseConnector._create_connection)NNN)0rLrMrNrrr_rr.robjectrrintrr~rrCrHr rKrrrrrr rrrrrrr%rrr ryrr|rrrPrrrrrkrrArArArBr2s   7   * %" M "r2c@seZdZdeeddddZeedddZe e e fe e e efddd d Ze e e fdd d d ZddddZe e e fe e e efd ddZe e e fed ddZdS)_DNSCacheTableN)ttlr>cCsi|_i|_||_dSrq) _addrs_rr _timestamps_ttl)r@rrArArBrCsz_DNSCacheTable.__init__)hostr>cCs ||jkSrq)r)r@rrArArB __contains__sz_DNSCacheTable.__contains__)rRaddrsr>cCs,t|t|f|j|<|jr(t|j|<dSrq)rrrrrr)r@rRrrArArBrsz_DNSCacheTable.addrcCs&|j|d|jr"|j|ddSrq)rrrrr@rRrArArBrsz_DNSCacheTable.removerDcCs|j|jdSrq)rrrrGrArArBrs z_DNSCacheTable.clearcCs(|j|\}}tt||}t||Srq)rrrnext)r@rRrTZlengthrrArArB next_addrssz_DNSCacheTable.next_addrscCs$|jdkrdS|j||jtkSr?)rrrrrArArBexpireds z_DNSCacheTable.expired)N)rLrMrNrrrCrrrrrrrrr rrrrrrArArArBrs&$rcseZdZdZdddddddddeddddddeeeeeeeee e dee e fee e efeee deefeeeeeejdfd d Zedd fd d Zeed ddZeed ddZd0ee eeddddZd1e eeedeee efdddZdeddedddZe e!"dee ddd Z#dee d!d"d#Z$ded$d!d%d&Z%e&d'edde'e(ee ej)efd(d)d*Z*e&d'dedde'e(e ej)efd+d,d-Z+dedde ej)efdd.d/Z,Z-S)2r3a/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 rFr) verify_ssl fingerprint use_dns_cache ttl_dns_cachefamily ssl_contextssl local_addrresolverrrrrrrTcsjtj| | | | ||dt|||||_| dkrcCsJ|dk r"|dk r"|j||fn$|dk s2|dk rc st|r||||jdddgS|js~|rB|D]}||IdHq,|jj|||jdIdH}|rz|D]}||IdHqd|S||f}||jkr|j|s|j |}|r|D]}| |IdHq|S||j kr|j |}|r|D]}| |IdHq| IdHnt |j|j |<|r@|D]}||IdHq(zz~|rf|D]}||IdHqN|jj|||jdIdH} |r|D]}||IdHq|j|| |j |Wn8tk r} z|j |j| dW5d} ~ XYnXW5|j |X|j |S)Nr)hostnamerrrrflags)r)r)r,rrZsend_dns_resolvehost_startrZresolveZsend_dns_resolvehost_endrrrZsend_dns_cache_hitrwaitr0rWZsend_dns_cache_missrrrr) r@rrrrresrRresultZeventrrrArArB _resolve_host&sd    zTCPConnector._resolve_hostr&r6rcs<|jr ||||IdH\}}n||||IdH\}}|S)zcCreate connection. Has same keyword arguments as BaseEventLoop.create_connection. N)proxy_create_proxy_connection_create_direct_connection)r@rrr_rrArArBrrszTCPConnector._create_connection)verifiedr>c Cs|r tSttj}|jtjO_|jtjO_z|jtjO_Wn2tk r~}zt d |W5d}~XYnX| |SdS)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) rZcreate_default_context SSLContextZPROTOCOL_SSLv23ZoptionsZ OP_NO_SSLv2Z OP_NO_SSLv3ZOP_NO_COMPRESSIONAttributeErrorrHrIformatZset_default_verify_paths)r sslcontextZattr_errrArArB_make_ssl_contexts zTCPConnector._make_ssl_context)rr>cCsz|rrtdkrtd|j}t|tjr.|S|dk r@|dS|j}t|tjrV|S|dk rh|dS|dSdSdS)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 NzSSL is not supported.FT)rr RuntimeError isinstancerrr)r@rrrArArB_get_ssl_contexts     zTCPConnector._get_ssl_contextr'cCs,|j}t|tr|S|j}t|tr(|SdSrq)rrr'r)r@rZretrArArB_get_fingerprints  zTCPConnector._get_fingerprint client_error)argsrrrrmr>c sz8t|j$|jj||IdHW5QRWSQRXWntk rh}zt|j||W5d}~XYn^tk r}zt|j||W5d}~XYn0t k r}z||j||W5d}~XYnXdSrq) r* sock_connectrWZcreate_connectionr#rrr$rOSError)r@rrrrrmrrArArB_wrap_create_connections ,z$TCPConnector._wrap_create_connection)rrrrr>cs||}||}|jj}|dk s(t|j}|dk s:ttj|j|||d|j d} zt | IdH} Wn`tj k rddddd} | | Yn0t k r} zt|j| | W5d} ~ XYnXd} | D] }|d}|d}zN|j|j|||||d |d |d |r|d nd|j||d IdH\}}Wn0tk rh} z| } WYqW5d} ~ XYnX|r|rz||WnLtk r} z,||js|j|| } WYqW5d} ~ XYnX||fS| dk st| dS)N)rrz$asyncio.Future[List[Dict[str, Any]]])rr>c Ss$tttj|W5QRXdSrq)rrvr~CancelledErrorr)rrArArBdrop_exceptionsz>TCPConnector._create_direct_connection..drop_exceptionrrrrrr) rrrrrserver_hostnamerrr)rrurlZraw_hostrrr~Z ensure_futurer rWZshieldrZadd_done_callbackrrrrrrrZcheckr"ryrrrt)r@rrrrrrrrZ host_resolvedZhostsrrlast_excZhinfoZtransprrArArBr sh         z&TCPConnector._create_direct_connectioncs*i}|jdk r|j}|jtj|tj<|j}|dk s8tttj|||j|j |j d}|j |g|t dIdH\}}| |jtjd} | dk r|s| |jtj<n | |jtj<|r"||} tj|_|j|_tj|jdddd} t|| ||j } || IdH} z z0| j}|dk s$t|| | IdH}Wn(tk rf| | YnXd| _d| _ zp|j!dkr|j"}|dkrt#|j!d}t$| j%|j&|j!||jd|j'ddd}|dkrt(d |)}W5|X|j*|j+|| ||j,|d IdH\}}W5| X||fS) N)headersauthrTrr)r  proxy_authZproxy_headers_hashr)statusrgr#Zsocket)defaultz)Transport does not expose socket instance)rrZsockr r)-Z proxy_headersr#rZHOSTr rr&ZMETH_GETr%rWrr r!rrZ AUTHORIZATIONrZPROXY_AUTHORIZATIONrZ METH_CONNECTmethodr!attrZevolverrPsendryrXZset_response_paramsstartrr}r'reasonr/r Z request_infohistoryZget_extra_inforduprrr)r@rrrr#r!Z proxy_reqrrrr$rrRZconnZ proxy_resprSZresprgZrawsockrArArBr s            z%TCPConnector._create_proxy_connection)NN)N).rLrMrNrr.rrbytesrrrr'rrrrrr~rrCr ryrrrrrrr r r%r staticmethodr lru_cacherrrrrrvrrr r  __classcell__rArArrBr3s )   M !  M r3c sxeZdZdZdedddfeeeee dfe e e e j ddfdd Zeed d d Zd ed dedddZZS)r4aUnix 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. FrrNpathrrrrrTr>cs tj|||||d||_dS)NrrrrrT)rrC_pathr@r5rrrrrTrrArBrCs zUnixConnector.__init__rDcCs|jS)zPath to unix socket.r7rGrArArBr5szUnixConnector.pathr&r8r6rc srz6t|j"|j|j|jIdH\}}W5QRXWn0tk rf}zt|j||W5d}~XYnXt t |Srq) r*rrWZcreate_unix_connectionrr7rrrrr%r@rrrr rrrArArBrs  z UnixConnector._create_connectionrLrMrNrr.rrrrrrrr~rrCrr5rr%rr3rArArrBr4s, r4c sxeZdZdZdedddfeeeee dfe e e e j ddfdd Zeed d d Zd ed dedddZZS)r5aNamed 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. FrrNr4cs6tj|||||dt|jtjs,td||_dS)Nr6z9Named Pipes only available in proactor loop under windows)rrCrrWr~ZProactorEventLooprr7r8rrArBrCs zNamedPipeConnector.__init__rDcCs|jS)zPath to the named pipe.r9rGrArArBr5szNamedPipeConnector.pathr&r8r6rc szFt|j2|j|j|jIdH\}}tdIdHW5QRXWn0tk rv}zt |j ||W5d}~XYnXt t |S)Nr) r*rrWZcreate_pipe_connectionrr7r~sleeprrrrr%r:rArArBrs  z%NamedPipeConnector._create_connectionr;rArArrBr5s, r5)Wr~rrr]r[rH collectionsrr contextlibrZ http.cookiesr itertoolsrrrrtypesr typingr r r r rrrrrrrrrrr*rrabcrZclient_exceptionsrrrrr r!r"r#r$Z client_protor%Z client_reqrepr&r'r(r)r*r+r,r-r.Zhttpr/Zlocksr0rr1rr ImportErrorr__all__Zclientr6r7tracingr8r9rPrr2rr3r4r5rArArArBs^    @ ,          Zg)<1