;i1ddlmZddlZddlZddlZddlZddlZddlZddl Zddl Zddl m Z ddl mZddlmZmZddlmZddlmZeZejd ZejeZejd Zejd ZddZddZ Gddej!eZ"GddeZ#GddeZ$dS)) annotationsN) _TYPE_BODY)HTTPHeaderDict)HTTPSConnection_get_default_user_agent)ConnectionError)BaseHTTPResponseTs^[!#$%&'*+\-.^_`|~0-9a-z]+$s*[\0\x00\x0a\x0d\r\n]|^[ \r\n\t]|[ \r\n\t]$namebytesreturnboolcPtt|S)a5 "An implementation that validates fields according to the definitions in Sections 5.1 and 5.5 of [HTTP] only needs an additional check that field names do not include uppercase characters." (https://httpwg.org/specs/rfc9113.html#n-field-validity) `http.client._is_legal_header_name` does not validate the field name according to the HTTP 1.1 spec, so we do that here, in addition to checking for uppercase characters. This does not allow for the `:` character in the header name, so should not be used to validate pseudo-headers. )rRE_IS_LEGAL_HEADER_NAMEmatch)r s LC:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\urllib3/http2/connection.py_is_legal_header_namers! '--d33 4 44valuecPtt|S)aK "A field value MUST NOT contain the zero value (ASCII NUL, 0x00), line feed (ASCII LF, 0x0a), or carriage return (ASCII CR, 0x0d) at any position. A field value MUST NOT start or end with an ASCII whitespace character (ASCII SP or HTAB, 0x20 or 0x09)." (https://httpwg.org/specs/rfc9113.html#n-field-validity) )rRE_IS_ILLEGAL_HEADER_VALUEsearch)rs r_is_illegal_header_valuer,s! *11%88 9 99rc.eZdZdZdZddZddZddZdS) _LockedObjectaX A wrapper class that hides a specific object behind a lock. The goal here is to provide a simple way to protect access to an object that cannot safely be simultaneously accessed from multiple threads. The intended use of this class is simple: take hold of it with a context manager, which returns the protected object. )lock_objobjr cDtj|_||_dSN) threadingRLockrr)selfrs r__init__z_LockedObject.__init__DsO%%  rrcB|j|jSr!)racquirerr$s r __enter__z_LockedObject.__enter__Hs yrexc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbtypes.TracebackType | NoneNonec8|jdSr!)rrelease)r$r*r,r.s r__exit__z_LockedObject.__exit__Ls rN)rr )rr )r*r+r,r-r.r/rr0)__name__ __module__ __qualname____doc__ __slots__r%r)r3rrrr6saI rrceZdZ d*d+fd Zd,d Zd-fd Zd.dZd/dZd*d0dZd1dZ d2d3dZ d4dZ d5d d d d!d6d(Z d-fd) Z xZS)7HTTP2ConnectionNhoststrport int | Nonekwargs typing.Anyrr0c ||_d|_g|_d|vsd|vrt dt j||fi||jt ddS)Nproxy proxy_configz$Proxies aren't supported with HTTP/2z%Tunneling isn't supported with HTTP/2) _new_h2_conn_h2_conn _h2_stream_headersNotImplementedErrorsuperr% _tunnel_host)r$r<r>r@ __class__s rr%zHTTP2Connection.__init__Vs))++ &*35 f  & 8 8%&LMM Mt..v...   (%&MNN N ) (r)_LockedObject[h2.connection.H2Connection]ctjd}ttj|S)NT) client_side)config)h2rPH2Configurationr connection H2Connection)r$rPs rrEzHTTP2Connection._new_h2_connes;**t*<<R]77v7FFGGGrct|j5}||x}r|j|ddddS#1swxYwYdSr!)rJconnectrFinitiate_connection data_to_sendsocksendall)r$connrXrLs rrVzHTTP2Connection.connectis  ] 0d  $ $ & & &#00222| 0 !!,/// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0sAA;;A?A?methodurlc d|vrtdd|vrtd|pd|_||d|jvrd|jd|jpd }n|jd|jpd }|jd |jd |f|jd |f|jd |f|j5}| |_ ddddS#1swxYwYdS)zputrequest This deviates from the HTTPConnection method signature since we never need to override sending accept-encoding headers or the host header. skip_hostz`skip_host` isn't supportedskip_accept_encodingz&`skip_accept_encoding` isn't supported/:[z]:i)s:schemeshttpss:methods :authoritys:pathN) rI _request_url_validate_pathr<r>rHappendencoderFget_next_available_stream_idrG)r$r\r]r@ authorityr[s r putrequestzHTTP2Connection.putrequestps & %&CDD D !V + +%&NOO OJ3 C   $)  ;DI;;)9c;;II999ty'7C99I 3444 j&--//:;;; mY-=-=-?-?@AAA h 5666 ] Bd"??AADO B B B B B B B B B B B B B B B B B Bs!EE E header str | bytesvaluesct|tr|n|}|}t |st dt||D]w}t|tr|n|}t |rt dt||j||fxdS)NzIllegal header name zIllegal header value ) isinstancer=rglowerr ValueErrorrrHrf)r$rkrmrs r putheaderzHTTP2Connection.putheaders$.vs$;$;G$V,, CACKKAABB B 2 2E&0&<&<GELLNNN%E'.. G !EU!E!EFFF M &% 1 1 1 1  2 2r message_bodyc&|jtd|j5}||j|j|du|x}r|j|dddn #1swxYwYg|_dS)NMust call `putrequest` first.) stream_idheaders end_stream)rGr rF send_headersrHrXrYrZ)r$rsr[rXs r endheaderszHTTP2Connection.endheaderss ? "!"ABB B ] 0d   / (D0     $00222| 0 !!,/// 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 sAA??BBdatac|jtd|j5}|x}r|j|t |dr ||j}|snwt|tr| }| |j|d|x}r|j|| |j ddddSt|tr| } t|trN| |j|d|x}r|j|nl|D]O}| |j|d|x}r|j|P| |jn-#t$r tdt!|zwxYwddddS#1swxYwYdS)zSend data to the server. `data` can be: `str`, `bytes`, an iterable, or file-like objects that support a .read() method. NrureadTF)rxz6`data` should be str, bytes, iterable, or file. got %r)rGr rFrXrYrZhasattrr} blocksizeror=rg send_datarxr TypeErrortype)r$r{r[rXchunks rsendzHTTP2Connection.sends ? "!"ABB B ]# d#00222| 0 !!,///tV$$ 8 IIdn55E !%--/ % NN4?EeNLLL'+'8'8':'::|8 )),7778000# # # # # # # # "$$$ %{{}} dE** 5NN4?DTNJJJ'+'8'8':'::|8 )),777!%<<t%PPP+/+<+<+>+>><< I--l;;;OODO444   L4jj! ?# # # # # # # # # # # # # # # # # # s1C1I)ICHI*IIIIhttprwtyping.Mapping[str, str] | Noneschemec td)Nz;HTTP/2 does not support setting up a tunnel through a proxy)rI)r$r<r>rwrs r set_tunnelzHTTP2Connection.set_tunnels" I   r HTTP2Responsec d}t}|j5}d}|sv|jdx}r&||}|D] }t |t jjrt}|j D]i\} } | dkr"t| }-| | d| djt |t jjr+||jz }||j|jt |t jjrd}|x} r|j| |vdddn #1swxYwY|Jt-|||jt1|S)NFis:statusasciiT)statusrw request_urlr{) bytearrayrFrYrecv receive_datarorQeventsResponseReceivedrrwintdecodeadd DataReceivedr{acknowledge_received_dataflow_controlled_lengthrv StreamEndedrXrZrrdr ) r$rr{r[rx received_datareventrwrkrrXs r getresponsezHTTP2Connection.getresponses*{{ ] 4dJ  4$(INN5$9$99=.!..}==F!'..%eRY-GHH.&4&6&6G16&& #)Z#7#7-0-@-@FF$+KK(. g(>(> W@U@U%&%&%&%& &(ry/EFF. EJ.D :: % r?r@rArr0)rrMrr0)r\r=r]r=r@rArr0)rkrlrmrlrr0)rsrArr0)r{rArr0)NNr) r<r=r>r?rwrrr=rr0)rr)NN)r\r=r]r=rrrwrrrrrrrr@rArr0)r4r5r6r%rErVrjrrrzrrrrr __classcell__rLs@rr;r;Usj,0 O O O O O O OHHHH000000BBBB> 2 2 2 2     ++++` 37      ( ( ( ( \#'37 %!%#'+%%%%%%Nrr;cLeZdZ ddfd ZeddZddZddZxZS)rFrrrwrrr=r{r rrrr0c tt||ddd||||_d|_dS)NzHTTP/2)rrwversionversion_stringreasonrrr)rJr%_datalength_remaining)r$rrwrr{rrLs rr%zHTTP2Response.__init__FsR #)#   !rc|jSr!)rr(s rr{zHTTP2Response.data\s zrcdSr!r9r(s rget_redirect_locationz#HTTP2Response.get_redirect_location`strcdSr!r9r(s rrzHTTP2Response.closecs r)F) rrrwrrr=r{r rrrr0)rr r) r4r5r6r%propertyr{rrrrs@rrrDs % """"""",X        rr)r r rr)rr rr)% __future__rloggingrer"typestyping h2.configrQ h2.connection h2.events_base_connectionr _collectionsrrSrr exceptionsr responser orig_HTTPSConnectionTypeVarr getLoggerr4logcompilerrrrGenericrr;rr9rrrs""""""  ))))))))))))AAAAAAAA((((((''''''&FN3g!!$"*%DEE'RZ(VWW 5 5 5 5::::FN1%>lllllolll^      $      r