
    Mh1                       d dl m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	Zd dl
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 eZ ej        d	          Z ej        e          Z ej        d
          Z ej        d          ZddZddZ  G d dej!        e                   Z" G d de          Z# G d de          Z$dS )    )annotationsN   )
_TYPE_BODY)HTTPHeaderDict)HTTPSConnection_get_default_user_agent)ConnectionError)BaseHTTPResponseTs   ^[!#$%&'*+\-.^_`|~0-9a-z]+$s*   [\0\x00\x0a\x0d\r\n]|^[ \r\n\t]|[ \r\n\t]$namebytesreturnboolc                P    t          t                              |                     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.
    )r   RE_IS_LEGAL_HEADER_NAMEmatch)r   s    X/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/urllib3/http2/connection.py_is_legal_header_namer      s!     '--d33444    valuec                P    t          t                              |                     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)
    )r   RE_IS_ILLEGAL_HEADER_VALUEsearch)r   s    r   _is_illegal_header_valuer   ,   s!     *11%88999r   c                  .    e Zd ZdZdZddZddZddZdS )_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_objobjr   c                D    t          j                    | _        || _        d S N)	threadingRLockr   r   )selfr   s     r   __init__z_LockedObject.__init__D   s    O%%				r   r   c                B    | j                                          | j        S r!   )r   acquirer   r$   s    r   	__enter__z_LockedObject.__enter__H   s    	yr   exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbtypes.TracebackType | NoneNonec                8    | j                                          d S r!   )r   release)r$   r*   r,   r.   s       r   __exit__z_LockedObject.__exit__L   s     		r   N)r   r   )r   r   )r*   r+   r,   r-   r.   r/   r   r0   )__name__
__module____qualname____doc__	__slots__r%   r)   r3    r   r   r   r   6   sa         I
           r   r   c                       e Zd Z	 d*d+ fd
Zd,dZd- fdZd.dZd/dZd*d0dZd1dZ		 	 	 d2d3dZ
d4dZ	 	 d5d d d d!d6d(Zd- fd)Z xZS )7HTTP2ConnectionNhoststrport
int | Nonekwargs
typing.Anyr   r0   c                    |                                  | _        d | _        g | _        d|v sd|v rt	          d           t                      j        ||fi | | j        t	          d          d S )Nproxyproxy_configz$Proxies aren't supported with HTTP/2z%Tunneling isn't supported with HTTP/2)_new_h2_conn_h2_conn
_h2_stream_headersNotImplementedErrorsuperr%   _tunnel_host)r$   r<   r>   r@   	__class__s       r   r%   zHTTP2Connection.__init__V   s     ))++&*35f& 8 8%&LMMMt..v...(%&MNNN )(r   )_LockedObject[h2.connection.H2Connection]c                    t           j                            d          }t          t           j                            |                    S )NT)client_side)config)h2rP   H2Configurationr   
connectionH2Connection)r$   rP   s     r   rE   zHTTP2Connection._new_h2_conne   s;    **t*<<R]77v7FFGGGr   c                   t                                                       | j        5 }|                                 |                                x}r| j                            |           d d d            d S # 1 swxY w Y   d S r!   )rJ   connectrF   initiate_connectiondata_to_sendsocksendall)r$   connrX   rL   s      r   rV   zHTTP2Connection.connecti   s    ] 	0d$$&&&#00222| 0	!!,///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0s   AA;;A?A?methodurlc                   d|v rt          d          d|v rt          d          |pd| _        |                     |           d| j        v rd| j         d| j        pd	 }n| j         d| j        pd	 }| j                            d
           | j                            d|                                f           | j                            d|                                f           | j                            d|                                f           | j        5 }|	                                | _
        ddd           dS # 1 swxY w Y   dS )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 supportedskip_accept_encodingz&`skip_accept_encoding` isn't supported/:[z]:i  )s   :schemes   httpss   :methods
   :authoritys   :pathN)rI   _request_url_validate_pathr<   r>   rH   appendencoderF   get_next_available_stream_idrG   )r$   r\   r]   r@   	authorityr[   s         r   
putrequestzHTTP2Connection.putrequestp   s    &  %&CDDD!V++%&NOOOJ3C   $);DI;;)9c;;II999ty'7C99I3444j&--//:;;;mY-=-=-?-?@AAAh

5666] 	Bd"??AADO	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs   !EEEheaderstr | bytesvaluesc                   t          |t                    r|                                n|}|                                }t	          |          st          dt          |                     |D ]w}t          |t                    r|                                n|}t          |          rt          dt          |                     | j                            ||f           xd S )NzIllegal header name zIllegal header value )	
isinstancer=   rg   lowerr   
ValueErrorr   rH   rf   )r$   rk   rm   r   s       r   	putheaderzHTTP2Connection.putheader   s    $.vs$;$;G$V,, 	CACKKAABBB 	2 	2E&0&<&<GELLNNN%E'.. G !EU!E!EFFFM  &%1111		2 	2r   message_bodyc                &   | j         t          d          | j        5 }|                    | j         | j        |d u            |                                x}r| j                            |           d d d            n# 1 swxY w Y   g | _        d S )NMust call `putrequest` first.)	stream_idheaders
end_stream)rG   r	   rF   send_headersrH   rX   rY   rZ   )r$   rs   r[   rX   s       r   
endheaderszHTTP2Connection.endheaders   s    ?"!"ABBB] 	0d/(D0    
  $00222| 0	!!,///	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 s   AA??BBdatac                   | j         t          d          | j        5 }|                                x}r| j                            |           t          |d          r	 |                    | j                  }|snwt          |t                    r|                                }|                    | j         |d           |                                x}r| j                            |           |                    | j                    	 ddd           dS t          |t                    r|                                }	 t          |t                    rN|                    | j         |d           |                                x}r| j                            |           nl|D ]O}|                    | j         |d           |                                x}r| j                            |           P|                    | j                    n-# t          $ r  t          dt!          |          z            w xY wddd           dS # 1 swxY w Y   dS )zSend data to the server.
        `data` can be: `str`, `bytes`, an iterable, or file-like objects
        that support a .read() method.
        Nru   readTF)rx   z6`data` should be str, bytes, iterable, or file. got %r)rG   r	   rF   rX   rY   rZ   hasattrr}   	blocksizero   r=   rg   	send_datarx   r   	TypeErrortype)r$   r{   r[   rX   chunks        r   sendzHTTP2Connection.send   s   
 ?"!"ABBB] #	d#00222| 0	!!,///tV$$ 8 IIdn55E  !%-- / %NN4?EeNLLL'+'8'8':'::| 8	)),7778 000#	 #	 #	 #	 #	 #	 #	 #	" $$$ %{{}}dE** 	5NN4?DTNJJJ'+'8'8':'::| 8	)),777!% < <t%PPP+/+<+<+>+>>< < I--l;;;OODO444   L4jj!  ?#	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	 #	s1   C1I)ICHI*I  IIIhttprw   typing.Mapping[str, str] | Noneschemec                     t          d          )Nz;HTTP/2 does not support setting up a tunnel through a proxy)rI   )r$   r<   r>   rw   r   s        r   
set_tunnelzHTTP2Connection.set_tunnel   s     "I
 
 	
r   HTTP2Responsec           	        d }t                      }| j        5 }d}|sv| j                            d          x}r&|                    |          }|D ]}t          |t          j        j                  rt                      }|j
        D ]i\  }	}
|	dk    r"t          |
                                          }-|                    |	                    d          |
                    d                     jt          |t          j        j                  r+||j        z  }|                    |j        |j                   t          |t          j        j                  rd}|                                x}r| j                            |           |vd d d            n# 1 swxY w Y   |J t-          ||| j        t1          |                    S )NFi  s   :statusasciiT)statusrw   request_urlr{   )	bytearrayrF   rY   recvreceive_dataro   rQ   eventsResponseReceivedr   rw   intdecodeaddDataReceivedr{   acknowledge_received_dataflow_controlled_lengthrv   StreamEndedrX   rZ   r   rd   r   )r$   r   r{   r[   rx   received_datar   eventrw   rk   r   rX   s               r   getresponsezHTTP2Connection.getresponse   s*    {{] 	4dJ  4$(INN5$9$99= .!..}==F!' . .%eRY-GHH .&4&6&6G16 & &#)Z#7#7-0-@-@FF$+KK(.g(>(>W@U@U%& %& %& %&	& (ry/EFF . EJ.D :: % <eo    (ry/DEE .)-J#'#4#4#6#66< 4I%%l3333 ! 4	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4: !!!)t	
 
 
 	
s   E<F  F$'F$T)preload_contentdecode_contentenforce_content_lengthbody_TYPE_BODY | Noner   r   r   r   c               $   d|v r	 | j         | j                             | j                   |                     ||           |pi }|                                D ]:\  }	}
|	                                dk    r|
dk    r$|                     |	|
           ;dt          | j                  vr"|                     dt                                 |r-| 
                    |           |                     |           dS | 
                                 dS )zSend an HTTP/2 requestchunkedNztransfer-encodings
   user-agent)rs   )rY   
settimeouttimeoutrj   itemsrp   rr   dictrH   r   rz   r   )r$   r\   r]   r   rw   r   r   r   r@   kvs              r   requestzHTTP2Connection.request  s     9 I  ...$$$-RMMOO 	% 	%DAqwwyy///ANNq!$$$$T] 3 333NN=*A*C*CDDD 	OOO...IIdOOOOOOOr   c                   | j         5 }	 |                                 |                                x}r| j                            |           n# t
          $ r Y nw xY wd d d            n# 1 swxY w Y   |                                 | _         d | _        g | _        t                      
                                 d S r!   )rF   close_connectionrX   rY   rZ   	ExceptionrE   rG   rH   rJ   close)r$   r[   r{   rL   s      r   r   zHTTP2Connection.close3  s    ] 	d%%''',,...4 ,I%%d+++   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ))++s5   A,AAA,
AA,AA,,A03A0r!   )r<   r=   r>   r?   r@   rA   r   r0   )r   rM   r   r0   )r\   r=   r]   r=   r@   rA   r   r0   )rk   rl   rm   rl   r   r0   )rs   rA   r   r0   )r{   rA   r   r0   )NNr   )
r<   r=   r>   r?   rw   r   r   r=   r   r0   )r   r   )NN)r\   r=   r]   r=   r   r   rw   r   r   r   r   r   r   r   r@   rA   r   r0   )r4   r5   r6   r%   rE   rV   rj   rr   rz   r   r   r   r   r   __classcell__rL   s   @r   r;   r;   U   sj       ,0O O O O O O OH H H H0 0 0 0 0 0B B B B>2 2 2 2    + + + +`  37	
 	
 	
 	
 	
(
 (
 (
 (
\ #'37% !%#'+% % % % % %N         r   r;   c                  L     e Zd Z	 dd fdZedd            ZddZddZ xZS )r   Fr   r   rw   r   r   r=   r{   r   r   r   r   r0   c           	     t    t                                          ||ddd ||           || _        d| _        d S )N   zHTTP/2)r   rw   versionversion_stringreasonr   r   r   )rJ   r%   _datalength_remaining)r$   r   rw   r   r{   r   rL   s         r   r%   zHTTP2Response.__init__F  sR     	#)# 	 
	
 
	
 
	
 
 !r   c                    | j         S r!   )r   r(   s    r   r{   zHTTP2Response.data\  s
    zr   c                    d S r!   r9   r(   s    r   get_redirect_locationz#HTTP2Response.get_redirect_location`  s    tr   c                    d S r!   r9   r(   s    r   r   zHTTP2Response.closec  s    r   )F)r   r   rw   r   r   r=   r{   r   r   r   r   r0   )r   r   r   )	r4   r5   r6   r%   propertyr{   r   r   r   r   s   @r   r   r   D  s          %" " " " " " ",    X          r   r   )r   r   r   r   )r   r   r   r   )%
__future__r   loggingrer"   typestyping	h2.configrQ   h2.connection	h2.events_base_connectionr   _collectionsr   rS   r   r   
exceptionsr	   responser
   orig_HTTPSConnectionTypeVarr   	getLoggerr4   logcompiler   r   r   r   Genericr   r;   r   r9   r   r   <module>r      s   " " " " " "  				                   ) ) ) ) ) ) ) ) ) ) ) ) A A A A A A A A ( ( ( ( ( ( ' ' ' ' ' '& FN3g!!$"*%DEE 'RZ(VWW 5 5 5 5: : : :    FN1%   >l l l l lo l l l^         $          r   