a
    Wg|1                     @  s  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d	ZeeZed
ZedZdddddZdddddZ G dd dej!e Z"G dd deZ#G d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]$bytesbool)namereturnc                 C  s   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    r   f/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/urllib3/http2/connection.py_is_legal_header_name   s    r   )valuer   c                 C  s   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   r   r   r   _is_illegal_header_value,   s    r   c                   @  sD   e Zd ZdZdZddddZdddd	Zd
dddd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_objr
   )objc                 C  s   t  | _|| _d S N)	threadingRLockr   r   )selfr   r   r   r   __init__D   s    
z_LockedObject.__init__r   c                 C  s   | j   | jS r   )r   acquirer   r   r   r   r   	__enter__H   s    
z_LockedObject.__enter__ztype[BaseException] | NonezBaseException | Noneztypes.TracebackType | NoneNone)exc_typeexc_valexc_tbr   c                 C  s   | j   d S r   )r   release)r   r&   r'   r(   r   r   r   __exit__L   s    z_LockedObject.__exit__N)__name__
__module____qualname____doc__	__slots__r    r$   r*   r   r   r   r   r   6   s
   r   c                      s   e Zd Zd-ddddd fddZd	d
ddZdd
 fddZdddddddZddddddZd.dddddZdddddZ	d/dddddddd Z
d!d
d"d#Zd0d$d$d$d%ddd&dd'd'd'ddd(	d)d*Zdd
 fd+d,Z  ZS )1HTTP2ConnectionNstrz
int | Nonez
typing.Anyr%   )hostportkwargsr   c                   sZ   |   | _d | _g | _d|v s&d|v r.tdt j||fi | | jd urVt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   r2   r3   r4   	__class__r   r   r    V   s    

zHTTP2Connection.__init__z)_LockedObject[h2.connection.H2Connection]r!   c                 C  s    t jjdd}tt jj|dS )NT)Zclient_side)config)h2r@   ZH2Configurationr   
connectionZH2Connection)r   r@   r   r   r   r7   e   s    zHTTP2Connection._new_h2_connc                   sT   t    | j0}|  |  }r2| j| W d    n1 sF0    Y  d S r   )r<   connectr8   Zinitiate_connectiondata_to_sendsocksendall)r   connrD   r>   r   r   rC   i   s
    
zHTTP2Connection.connect)methodurlr4   r   c                 K  s   d|v rt dd|v r t d|p&d| _| | d| jv rXd| j d| jpPd	 }n| j d| jphd	 }| jd
 | jd| f | jd| f | jd| f | j}|	 | _
W d   n1 s0    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)r;   _request_url_validate_pathr2   r3   r:   appendencoder8   Zget_next_available_stream_idr9   )r   rH   rI   r4   	authorityrG   r   r   r   
putrequestp   s    



zHTTP2Connection.putrequestzstr | bytes)headervaluesr   c                 G  s   t |tr| n|}| }t|s8tdt| |D ]D}t |trR| n|}t|rptdt| | j||f q<d S )NzIllegal header name zIllegal header value )	
isinstancer1   rR   lowerr   
ValueErrorr   r:   rQ   )r   rU   rV   r   r   r   r   	putheader   s    zHTTP2Connection.putheader)message_bodyr   c                 C  sr   | j d u rtd| j@}|j| j | j|d u d |  }rJ| j| W d    n1 s^0    Y  g | _d S )NMust call `putrequest` first.)	stream_idheaders
end_stream)r9   r   r8   send_headersr:   rD   rE   rF   )r   r[   rG   rD   r   r   r   
endheaders   s    
*zHTTP2Connection.endheaders)datar   c              	   C  s  | j du rtd| jP}|  }r4| j| t|dr|| j}|sPqt	|t
rb| }|j| j |dd |  }r>| j| q>|| j  W d   dS t	|t
r| }zzt	|tr|j| j |dd |  }r| j| n@|D ].}|j| j |dd |  }r| j| q|| j  W n$ tyZ   tdt| Y n0 W d   n1 sr0    Y  dS )zSend data to the server.
        `data` can be: `str`, `bytes`, an iterable, or file-like objects
        that support a .read() method.
        Nr\   readF)r_   Tz6`data` should be str, bytes, iterable, or file. got %r)r9   r   r8   rD   rE   rF   hasattrrc   	blocksizerW   r1   rR   Z	send_datar_   r   	TypeErrortype)r   rb   rG   rD   chunkr   r   r   send   sD    





zHTTP2Connection.sendhttpztyping.Mapping[str, str] | None)r2   r3   r^   schemer   c                 C  s   t dd S )Nz;HTTP/2 does not support setting up a tunnel through a proxy)r;   )r   r2   r3   r^   rk   r   r   r   
set_tunnel   s    zHTTP2Connection.set_tunnelHTTP2Responsec              	   C  s*  d }t  }| j}d}|s| jd }r||}|D ]}t|tjjrt	 }|j
D ]6\}	}
|	dkrtt|
 }qV||	d|
d qVq8t|tjjr||j7 }||j|j q8t|tjjr8d}q8|  }r| j| qW d    n1 s0    Y  |d usJ t||| jt|dS )NFi  s   :statusasciiT)statusr^   request_urlrb   )	bytearrayr8   rE   recvZreceive_datarW   rA   eventsZResponseReceivedr   r^   intdecodeaddZDataReceivedrb   Zacknowledge_received_dataZflow_controlled_lengthr]   ZStreamEndedrD   rF   rm   rO   r   )r   ro   rb   rG   r_   Zreceived_datars   eventr^   rU   r   rD   r   r   r   getresponse   s@    

,zHTTP2Connection.getresponseT)preload_contentdecode_contentenforce_content_lengthz_TYPE_BODY | Noner   )	rH   rI   bodyr^   ry   rz   r{   r4   r   c                K  s   d|v r| j dur | j | j | || |p2i }| D ],\}	}
|	 dkr\|
dkr\q<q<| |	|
 q<dt| jvr| dt	  |r| j
|d | | n| 
  dS )zSend an HTTP/2 requestchunkedNztransfer-encodings
   user-agent)r[   )rE   
settimeouttimeoutrT   itemsrX   rZ   dictr:   r   ra   ri   )r   rH   rI   r|   r^   ry   rz   r{   r4   kvr   r   r   request  s    
zHTTP2Connection.requestc              	     s   | j H}z$|  |  }r*| j| W n ty>   Y n0 W d    n1 sT0    Y  |  | _ d | _g | _t	 
  d S r   )r8   Zclose_connectionrD   rE   rF   	Exceptionr7   r9   r:   r<   close)r   rG   rb   r>   r   r   r   3  s    $
zHTTP2Connection.close)N)N)NNrj   )NN)r+   r,   r-   r    r7   rC   rT   rZ   ra   ri   rl   rx   r   r   __classcell__r   r   r>   r   r0   U   s*    0   .  "'r0   c                      s\   e Zd Zdddddddd fd	d
ZeddddZddddZddddZ  ZS )rm   Frt   r   r1   r   r   r%   )ro   r^   rp   rb   rz   r   c              	     s*   t  j||ddd ||d || _d| _d S )N   zHTTP/2)ro   r^   versionversion_stringreasonrz   rp   r   )r<   r    _datalength_remaining)r   ro   r^   rp   rb   rz   r>   r   r   r    F  s    zHTTP2Response.__init__r!   c                 C  s   | j S r   )r   r#   r   r   r   rb   \  s    zHTTP2Response.datac                 C  s   d S r   r   r#   r   r   r   get_redirect_location`  s    z#HTTP2Response.get_redirect_locationc                 C  s   d S r   r   r#   r   r   r   r   c  s    zHTTP2Response.close)F)	r+   r,   r-   r    propertyrb   r   r   r   r   r   r>   r   rm   D  s    rm   )%
__future__r   loggingrer   typestypingZ	h2.configrA   Zh2.connectionZ	h2.eventsZ_base_connectionr   _collectionsr   rB   r   r   
exceptionsr   responser	   Zorig_HTTPSConnectionTypeVarr
   	getLoggerr+   logcompiler   r   r   r   Genericr   r0   rm   r   r   r   r   <module>   s0   




 p