o
    ûÞh–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„Z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]$ÚnameÚbytesÚreturnÚboolc                 C  ó   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   úX/var/www/html/premium_crap/venv/lib/python3.10/site-packages/urllib3/http2/connection.pyÚ_is_legal_header_name   s   r   Úvaluec                 C  r   )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                   @  s2   e Zd ZdZdZddd„Zddd	„Z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Ú_objÚobjr
   c                 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__Úexc_typeútype[BaseException] | NoneÚexc_valúBaseException | NoneÚexc_tbútypes.TracebackType | NoneÚNonec                 C  s   | j  ¡  d S r   )r   Úrelease)r    r%   r'   r)   r   r   r   Ú__exit__L   s   z_LockedObject.__exit__N)r   r
   )r   r
   )r%   r&   r'   r(   r)   r*   r   r+   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r!   r$   r-   r   r   r   r   r   6   s    

r   c                      s¨   e Zd Z	d5d6‡ fd
d„Zd7dd„Zd8‡ fdd„Zd9dd„Zd:dd„Zd5d;dd„Zd<dd„Z				 d=d>d$d%„Z
d?d'd(„Z		d@d)d)d)d*œdAd1d2„Zd8‡ fd3d4„Z‡  ZS )BÚHTTP2ConnectionNÚhostÚstrÚportú
int | NoneÚkwargsú
typing.Anyr   r+   c                   sZ   |   ¡ | _d | _g | _d|v sd|v rtdƒ‚tƒ j||fi |¤Ž | jd ur+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    r4   r6   r8   ©Ú	__class__r   r   r!   V   s   

ÿzHTTP2Connection.__init__ú)_LockedObject[h2.connection.H2Connection]c                 C  s    t jjdd�}tt jj|d�ƒS )NT)Úclient_side)Úconfig)Úh2rG   ÚH2Configurationr   Ú
connectionÚH2Connection)r    rG   r   r   r   r<   e   s   zHTTP2Connection._new_h2_connc                   sf   t ƒ  ¡  | j�!}| ¡  | ¡  }r!| j |¡ W d   ƒ d S W d   ƒ d S 1 s,w   Y  d S r   )rA   Úconnectr=   Úinitiate_connectionÚdata_to_sendÚsockÚsendall)r    ÚconnrN   rC   r   r   rL   i   s   
ý"þzHTTP2Connection.connectÚmethodÚurlc                 K  sì   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p4d	› �}| j d
¡ | j d| ¡ f¡ | j d| ¡ f¡ | j d| ¡ f¡ | j�}| 	¡ | _
W d  ƒ dS 1 sow   Y  dS )z®putrequest
        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_pathr4   r6   r?   ÚappendÚencoder=   Úget_next_available_stream_idr>   )r    rR   rS   r8   Ú	authorityrQ   r   r   r   Ú
putrequestp   s    



"ÿzHTTP2Connection.putrequestÚheaderústr | bytesÚvaluesc                 G  s†   t |tƒr	| ¡ n|}| ¡ }t|ƒstdt|ƒ› �ƒ‚|D ]"}t |tƒr)| ¡ n|}t|ƒr8tdt|ƒ› �ƒ‚| j ||f¡ qd S )NzIllegal header name zIllegal header value )	Ú
isinstancer5   r\   Úlowerr   Ú
ValueErrorr   r?   r[   )r    r`   rb   r   r   r   r   Ú	putheader�   s   üzHTTP2Connection.putheaderÚmessage_bodyc                 C  sr   | j d u r	tdƒ‚| j� }|j| j | j|d u d� | ¡  }r%| j |¡ W d   ƒ n1 s/w   Y  g | _d S )NúMust call `putrequest` first.)Ú	stream_idÚheadersÚ
end_stream)r>   r   r=   Úsend_headersr?   rN   rO   rP   )r    rg   rQ   rN   r   r   r   Ú
endheadersœ   s   
ý€ù
zHTTP2Connection.endheadersÚdatac              	   C  s|  | j du r	tdƒ‚| j�¨}| ¡  }r| j |¡ t|dƒrV	 | | j¡}|s(nt	|t
ƒr1| ¡ }|j| j |dd� | ¡  }rF| j |¡ q| | j ¡ 	 W d  ƒ dS t	|t
ƒr_| ¡ }z=t	|tƒr{|j| j |dd� | ¡  }rz| j |¡ n |D ]}|j| j |dd� | ¡  }r”| j |¡ q}| | j ¡ W n ty«   tdt|ƒ ƒ‚w W d  ƒ dS 1 s·w   Y  dS )z‘Send data to the server.
        `data` can be: `str`, `bytes`, an iterable, or file-like objects
        that support a .read() method.
        Nrh   ÚreadTF)rk   z6`data` should be str, bytes, iterable, or file. got %r)r>   r   r=   rN   rO   rP   Úhasattrro   Ú	blocksizerc   r5   r\   Ú	send_datark   r   Ú	TypeErrorÚtype)r    rn   rQ   rN   Úchunkr   r   r   Úsendª   sV   


ø	ñ

€€€ÿÿÿ€"ázHTTP2Connection.sendÚhttprj   útyping.Mapping[str, str] | NoneÚschemec                 C  s   t dƒ‚)Nz;HTTP/2 does not support setting up a tunnel through a proxy)r@   )r    r4   r6   rj   ry   r   r   r   Ú
set_tunnel×   s   ÿzHTTP2Connection.set_tunnelÚHTTP2Responsec              	   C  s*  d }t ƒ }| j�t}d}|su| j d¡ }rg| |¡}|D ]J}t|tjjƒrHt	ƒ }|j
D ]\}	}
|	dkr:t|
 ¡ ƒ}q+| |	 d¡|
 d¡¡ q+qt|tjjƒr]||j7 }| |j|j¡ qt|tjjƒrfd}q| ¡  }rs| j |¡ |rW d   ƒ n1 sw   Y  |d usŠJ ‚t||| jt|ƒd�S )NFiÿÿ  s   :statusÚasciiT)Ústatusrj   Úrequest_urlrn   )Ú	bytearrayr=   rO   ÚrecvÚreceive_datarc   rH   ÚeventsÚResponseReceivedr   rj   ÚintÚdecodeÚaddÚDataReceivedrn   Úacknowledge_received_dataÚflow_controlled_lengthri   ÚStreamEndedrN   rP   r{   rY   r   )r    r}   rn   rQ   rk   Úreceived_datar‚   Úeventrj   r`   r   rN   r   r   r   Úgetresponseâ   sJ   
ÿü
ÿ€ç€þüzHTTP2Connection.getresponseT)Úpreload_contentÚdecode_contentÚenforce_content_lengthÚbodyú_TYPE_BODY | NonerŽ   r   r�   r�   c                K  s°   d|v r	 | j dur| j  | j¡ |  ||¡ |pi }| ¡ D ]\}	}
|	 ¡ dkr.|
dkr.q|  |	|
¡ qdt| jƒvrC|  dt	ƒ ¡ |rR| j
|d� |  |¡ dS |  
¡  dS )zSend an HTTP/2 requestÚchunkedNztransfer-encodings
   user-agent)rg   )rO   Ú
settimeoutÚtimeoutr_   Úitemsrd   rf   Údictr?   r   rm   rv   )r    rR   rS   r‘   rj   rŽ   r�   r�   r8   ÚkÚvr   r   r   Úrequest  s    
zHTTP2Connection.requestc              	     s‚   | j �$}z| ¡  | ¡  }r| j |¡ W n	 ty   Y nw W d   ƒ n1 s*w   Y  |  ¡ | _ d | _g | _t	ƒ  
¡  d S r   )r=   Úclose_connectionrN   rO   rP   Ú	Exceptionr<   r>   r?   rA   Úclose)r    rQ   rn   rC   r   r   r�   3  s   €ÿ€û
	zHTTP2Connection.closer   )r4   r5   r6   r7   r8   r9   r   r+   )r   rE   ©r   r+   )rR   r5   rS   r5   r8   r9   r   r+   )r`   ra   rb   ra   r   r+   )rg   r9   r   r+   )rn   r9   r   r+   )NNrw   )
r4   r5   r6   r7   rj   rx   ry   r5   r   r+   )r   r{   )NN)rR   r5   rS   r5   r‘   r’   rj   rx   rŽ   r   r�   r   r�   r   r8   r9   r   r+   )r.   r/   r0   r!   r<   rL   r_   rf   rm   rv   rz   r�   rš   r�   Ú__classcell__r   r   rC   r   r3   U   s,    ÿ



0û
.û÷'r3   c                      sD   e Zd Z	dd‡ fdd„Zeddd„ƒZddd„Zddd„Z‡  ZS )r{   Fr}   r„   rj   r   r~   r5   rn   r   r�   r   r   r+   c              	     s*   t ƒ j||ddd ||d� || _d| _d S )Né   zHTTP/2)r}   rj   ÚversionÚversion_stringÚreasonr�   r~   r   )rA   r!   Ú_dataÚlength_remaining)r    r}   rj   r~   rn   r�   rC   r   r   r!   F  s   ÷
zHTTP2Response.__init__c                 C  s   | j S r   )r¤   r#   r   r   r   rn   \  s   zHTTP2Response.datac                 C  ó   d S r   r   r#   r   r   r   Úget_redirect_location`  ó   z#HTTP2Response.get_redirect_locationc                 C  r¦   r   r   r#   r   r   r   r�   c  r¨   zHTTP2Response.close)F)r}   r„   rj   r   r~   r5   rn   r   r�   r   r   r+   )r   r   rž   )	r.   r/   r0   r!   Úpropertyrn   r§   r�   rŸ   r   r   rC   r   r{   D  s    ú
r{   )r   r   r   r   )r   r   r   r   )%Ú
__future__r   ÚloggingÚrer   ÚtypesÚtypingÚ	h2.configrH   Úh2.connectionÚ	h2.eventsÚ_base_connectionr   Ú_collectionsr   rJ   r   r   Ú
exceptionsr   Úresponser	   Úorig_HTTPSConnectionÚTypeVarr
   Ú	getLoggerr.   ÚlogÚcompiler   r   r   r   ÚGenericr   r3   r{   r   r   r   r   Ú<module>   s2    






 p