
    
Jh1                       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j2                  e      Z ej8                  d
      Z ej8                  d      ZddZddZ  G d dejB                  e         Z" G d de      Z# G d de      Z$y)    )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]$c                >    t        t        j                  |             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.
    )boolRE_IS_LEGAL_HEADER_NAMEmatch)names    L/var/www/test/myenv/lib/python3.12/site-packages/urllib3/http2/connection.py_is_legal_header_namer      s     '--d344    c                >    t        t        j                  |             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)values    r   _is_illegal_header_valuer   ,   s     *11%899r   c                  <    e Zd ZdZdZddZddZ	 	 	 	 	 	 	 	 d	dZy)
_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_objc                D    t        j                         | _        || _        y N)	threadingRLockr   r   )selfobjs     r   __init__z_LockedObject.__init__D   s    OO%		r   c                N    | j                   j                          | j                  S r   )r   acquirer   r!   s    r   	__enter__z_LockedObject.__enter__H   s    		yyr   c                8    | j                   j                          y r   )r   release)r!   exc_typeexc_valexc_tbs       r   __exit__z_LockedObject.__exit__L   s     			r   N)r"   r   )returnr   )r*   ztype[BaseException] | Noner+   zBaseException | Noner,   ztypes.TracebackType | Noner.   None)__name__
__module____qualname____doc__	__slots__r#   r'   r-    r   r   r   r   6   sC    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ddZddZ		 	 	 d	 	 	 	 	 	 	 	 	 ddZ
	 	 dd	Z	 	 dd
d
d
d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd fdZ xZS )HTTP2Connectionc                    | j                         | _        d | _        g | _        d|v sd|v rt	        d      t        |   ||fi | | j                  t	        d      y )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!   hostportkwargs	__class__s       r   r#   zHTTP2Connection.__init__V   so     ))+&*35f& 8%&LMMt.v.(%&MNN )r   c                    t         j                  j                  d      }t        t         j                  j                  |            S )NT)client_side)config)h2rH   H2Configurationr   
connectionH2Connection)r!   rH   s     r   r;   zHTTP2Connection._new_h2_conne   s6    **t*<R]]77v7FGGr   c                    t         |           | j                  5 }|j                          |j	                         x}r| j
                  j                  |       d d d        y # 1 sw Y   y xY wr   )r@   connectr<   initiate_connectiondata_to_sendsocksendall)r!   connrP   rE   s      r   rN   zHTTP2Connection.connecti   s]    ]] 	0d$$&#0022|2		!!,/	0 	0 	0s   >A##A,c                   d|v rt        d      d|v rt        d      |xs d| _        | j                  |       d| j                  v r!d| j                   d| j                  xs d	 }n| j                   d| j                  xs d	 }| j
                  j                  d
       | j
                  j                  d|j                         f       | j
                  j                  d|j                         f       | j
                  j                  d|j                         f       | j                  5 }|j                         | _
        ddd       y# 1 sw Y   yxY w)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)r?   _request_url_validate_pathrB   rC   r>   appendencoder<   get_next_available_stream_idr=   )r!   methodurlrD   	authorityrS   s         r   
putrequestzHTTP2Connection.putrequestp   s/    & %&CDD!V+%&NOOJ3C $))DII;b)9c(:;I99+Qtyy'7C&89I34j&--/:;mY-=-=-?@Ah

56]] 	Bd"??ADO	B 	B 	Bs   1EEc                |   t        |t              r|j                         n|}|j                         }t	        |      st        dt        |             |D ]c  }t        |t              r|j                         n|}t        |      rt        dt        |             | j                  j                  ||f       e y )NzIllegal header name zIllegal header value )	
isinstancestrr]   lowerr   
ValueErrorr   r>   r\   )r!   headervaluesr   s       r   	putheaderzHTTP2Connection.putheader   s    $.vs$;$V,3CK=ABB 	2E&0&<ELLN%E'. #8U!EFFMM  &%1		2r   c                >   | j                   t        d      | j                  5 }|j                  | j                   | j                  |d u        |j                         x}r| j                  j                  |       d d d        g | _        y # 1 sw Y   g | _        y xY w)NMust call `putrequest` first.)	stream_idheaders
end_stream)r=   r	   r<   send_headersr>   rP   rQ   rR   )r!   message_bodyrS   rP   s       r   
endheaderszHTTP2Connection.endheaders   s    ??"!"ABB]] 	0d//(D0  
  $0022|2		!!,/	0 	0 s   ABBc                d   | j                   t        d      | j                  5 }|j                         x}r| j                  j                  |       t        |d      r	 |j                  | j                        }|snlt        |t              r|j                         }|j                  | j                   |d       |j                         x}r| j                  j                  |       |j                  | j                          	 ddd       yt        |t              r|j                         }	 t        |t              rL|j                  | j                   |d       |j                         x}r| j                  j                  |       nn|D ]N  }|j                  | j                   |d       |j                         x}s4| j                  j                  |       P |j                  | j                          ddd       y# t        $ r t        dt!        |      z        w xY w# 1 sw Y   yxY w)zSend data to the server.
        `data` can be: `str`, `bytes`, an iterable, or file-like objects
        that support a .read() method.
        Nrl   readTF)ro   z6`data` should be str, bytes, iterable, or file. got %r)r=   r	   r<   rP   rQ   rR   hasattrrt   	blocksizerd   re   r]   	send_dataro   bytes	TypeErrortype)r!   datarS   rP   chunks        r   sendzHTTP2Connection.send   s   
 ??"!"ABB]] #	d#0022|2		!!,/tV$ IIdnn5E !%- %NN4??EeNL'+'8'8'::|:		)),7  0#	 #	" $${{}dE*NN4??DTNJ'+'8'8'::|:		)),7!% <t%P+/+<+<+>><> II--l;< OODOO4=#	 #	>  L4j! ?#	 #	s+   C!H& H&/BH8H!H##H&&H/c                    t        d      )Nz;HTTP/2 does not support setting up a tunnel through a proxy)r?   )r!   rB   rC   rn   schemes        r   
set_tunnelzHTTP2Connection.set_tunnel   s     "I
 	
r   c           	        d }t               }| j                  5 }d}|s}| j                  j                  d      x}r.|j	                  |      }|D ]  }t        |t        j                  j                        rnt               }|j                  D ]T  \  }	}
|	dk(  rt        |
j                               }%|j                  |	j                  d      |
j                  d             V t        |t        j                  j                        r6||j                  z  }|j!                  |j"                  |j$                         t        |t        j                  j&                        sd} |j)                         x}r| j                  j+                  |       |s}d d d        |J t-        || j.                  t1        |            S # 1 sw Y   /xY w)NFi  s   :statusasciiT)statusrn   request_urlr{   )	bytearrayr<   rQ   recvreceive_datard   rI   eventsResponseReceivedr   rn   intdecodeaddDataReceivedr{   acknowledge_received_dataflow_controlled_lengthrm   StreamEndedrP   rR   HTTP2ResponserZ   rx   )r!   r   r{   rS   ro   received_datar   eventrn   rh   r   rP   s               r   getresponsezHTTP2Connection.getresponse   s    {]] 	4dJ $(IINN5$99=9!..}=F!' .%eRYY-G-GH&4&6G16 &#)Z#7-0-@F$+KK(.g(>W@U%&	& (ryy/E/EF EJJ.D :: % < <eoo (ryy/D/DE)-J%.( $(#4#4#66<6II%%l33 !	4: !!!))t	
 	
=	4 	4s   EG
&4G

GT)preload_contentdecode_contentenforce_content_lengthc                  d|v r	 | j                   %| j                   j                  | j                         | j                  ||       |xs i }|j	                         D ]0  \  }	}
|	j                         dk(  r|
dk(  r| j                  |	|
       2 dt        | j                        vr| j                  dt                      |r$| j                  |       | j                  |       y| j                          y)zSend an HTTP/2 requestchunkedNztransfer-encodings
   user-agent)rq   )rQ   
settimeouttimeoutrb   itemsrf   rj   dictr>   r   rr   r}   )r!   r_   r`   bodyrn   r   r   r   rD   kvs              r   requestzHTTP2Connection.request  s      99 II  .$-RMMO 	%DAqwwy//ANq!$		% T]] 33NN=*A*CDOOO.IIdOOOr   c                D   | j                   5 }	 |j                          |j                         x}r| j                  j	                  |       d d d        | j                         | _         d | _        g | _        t        | )          y # t
        $ r Y Ew xY w# 1 sw Y   JxY wr   )r<   close_connectionrP   rQ   rR   	Exceptionr;   r=   r>   r@   close)r!   rS   r{   rE   s      r   r   zHTTP2Connection.close3  s    ]] 	d%%',,..4.II%%d+		 ))+  	 	s(   B=B	BBBBBr   )rB   re   rC   
int | NonerD   
typing.Anyr.   r/   )r.   z)_LockedObject[h2.connection.H2Connection]r.   r/   )r_   re   r`   re   rD   r   r.   r/   )rh   str | bytesri   r   r.   r/   )rq   r   r.   r/   )r{   r   r.   r/   )NNhttp)
rB   re   rC   r   rn   typing.Mapping[str, str] | Noner   re   r.   r/   )r.   r   )NN)r_   re   r`   re   r   z_TYPE_BODY | Nonern   r   r   r   r   r   r   r   rD   r   r.   r/   )r0   r1   r2   r#   r;   rN   rb   rj   rr   r}   r   r   r   r   __classcell__rE   s   @r   r7   r7   U   sI   ,0OO)O<FO	OH0BB B 	B
 
B>2+`  37	
	
 	
 1		

 	
 
	
(
	(
\ #'37% !%#'+%% %  	%
 1% % % !%% % 
%N r   r7   c                  \     e Zd Z	 d	 	 	 	 	 	 	 	 	 	 	 d fdZedd       ZddZddZ xZS )	r   c           	     N    t         |   ||ddd ||       || _        d| _        y )N   zHTTP/2)r   rn   versionversion_stringreasonr   r   r   )r@   r#   _datalength_remaining)r!   r   rn   r   r{   r   rE   s         r   r#   zHTTP2Response.__init__F  s=     	#)# 	 
	
 
 !r   c                    | j                   S r   )r   r&   s    r   r{   zHTTP2Response.data\  s    zzr   c                     y r   r5   r&   s    r   get_redirect_locationz#HTTP2Response.get_redirect_location`  s    r   c                     y r   r5   r&   s    r   r   zHTTP2Response.closec  s    r   )F)r   r   rn   r   r   re   r{   rx   r   r   r.   r/   )r.   rx   r   )	r0   r1   r2   r#   propertyr{   r   r   r   r   s   @r   r   r   D  se      %""  " 	"
 " " 
",  r   r   )r   rx   r.   r   )r   rx   r.   r   )%
__future__r   loggingrer   typestyping	h2.configrI   h2.connection	h2.events_base_connectionr   _collectionsr   rK   r   r   
exceptionsr	   responser
   orig_HTTPSConnectionTypeVarr   	getLoggerr0   logcompiler   r   r   r   Genericr   r7   r   r5   r   r   <module>r      s    "  	       ) ) A ( '& FNN3g!$"**%DE 'RZZ(VW 5:FNN1% >lo l^ $  r   