o
    óT·j„[  ã                   @  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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mZ ddlmZmZmZ ddlmZmZmZ ddlmZmZmZ dd	lmZ dd
lm Z  ddl!m"Z" e #d¡Z$ddd„Z%G dd„ dej&ƒZ'G dd„ de"ƒZ(G dd„ dƒZ)dS )é    )ÚannotationsN)Ú	Generatoré   )ÚNetworkStream)ÚConnectionNotAvailableÚLocalProtocolErrorÚRemoteProtocolError)ÚOriginÚRequestÚResponse)ÚLockÚ	SemaphoreÚShieldCancellation)ÚTrace)Úsafe_iterateé   )ÚConnectionInterfacezhttpcore2.http2Úrequestr
   ÚreturnÚboolc                 C  s   t dd„ | jD ƒƒS )Nc                 s  s,   � | ]\}}|  ¡ d kp|  ¡ dkV  qdS )s   content-lengthó   transfer-encodingN©Úlower)Ú.0ÚkÚ_v© r   úX/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/httpcore2/_sync/http2.pyÚ	<genexpr>   s   €* z#has_body_headers.<locals>.<genexpr>)ÚanyÚheaders)r   r   r   r   Úhas_body_headers   s   r!   c                   @  s   e Zd ZdZdZdZdS )ÚHTTPConnectionStater   r   é   N)Ú__name__Ú
__module__Ú__qualname__ÚACTIVEÚIDLEÚCLOSEDr   r   r   r   r"      s    r"   c                   @  sD  e Zd ZdZejjdd�Z	d[d\dd„Zd]dd„Z	d^dd„Z
d_dd„Zd_dd„Zd`dd„Zd_d d!„Zdad#d$„Zdbd&d'„Zdcd)d*„Zd[ddd,d-„Zded0d1„Zdfd2d3„Zdgd4d5„Zdhd7d8„Zd^d9d:„Zdid;d<„Zdjd>d?„Zdkd@dA„ZdkdBdC„ZdkdDdE„ZdkdFdG„ZdkdHdI„ZdkdJdK„ZdldMdN„Z dldOdP„Z!dmdQdR„Z"			dndodYdZ„Z#dS )pÚHTTP2Connectioné   F)Úvalidate_inbound_headersNÚoriginr	   Ústreamr   Úkeepalive_expiryúfloat | Nonec                 C  s†   || _ || _|| _tjj| jd�| _tj	| _
d | _d| _tƒ | _tƒ | _tƒ | _tƒ | _d| _d| _d| _i | _d | _d | _d | _d S )N)Úconfigr   F)Ú_originÚ_network_streamÚ_keepalive_expiryÚh2Ú
connectionÚH2ConnectionÚCONFIGÚ	_h2_stater"   r(   Ú_stateÚ
_expire_atÚ_request_countr   Ú
_init_lockÚ_state_lockÚ
_read_lockÚ_write_lockÚ_sent_connection_initÚ_used_all_stream_idsÚ_connection_errorÚ_eventsÚ_connection_terminatedÚ_read_exceptionÚ_write_exception)Úselfr-   r.   r/   r   r   r   Ú__init__)   s&   ý
zHTTP2Connection.__init__r   r
   r   r   c                 C  sŽ  |   |jj¡std|jj› d| j› �ƒ‚| j�# | jtjtj	fv r0|  j
d7  _
d | _tj| _ntƒ ‚W d   ƒ n1 s=w   Y  | j�v | js´z%d|i}tdt||ƒ� | jdi |¤Ž W d   ƒ n1 shw   Y  W n& ty” } ztƒ � |  ¡  W d   ƒ |‚1 s‰w   Y  |‚d }~ww d| _d| _| jjj}t|ƒ| _t|| j ƒD ]}| j ¡  q¬W d   ƒ n1 s¾w   Y  | j ¡  z| j ¡ }g | j|< W n tj j!yï   d| _"|  j
d8  _
| j #¡  tƒ ‚w z|||dœ}tdt||ƒ� | j$||d� W d   ƒ n	1 �sw   Y  td	t||ƒ� | j%||d� W d   ƒ n	1 �s/w   Y  td
t||ƒ�}| j&||d�\}	}
|	|
f|_'W d   ƒ n	1 �sUw   Y  t(|	|
t)| ||d�d| j*|dœd�W S  t�yÆ } zMtƒ �* d|i}tdt||ƒ� | j+|d� W d   ƒ n	1 �s–w   Y  W d   ƒ n	1 �s¦w   Y  t,|tj j-ƒ�rÀ| j.�r¼t/| j.ƒ‚t0|ƒ‚|‚d }~ww )NzAttempted to send request to z on connection to r   r   Úsend_connection_initT©r   Ú	stream_idÚsend_request_headersÚsend_request_bodyÚreceive_response_headers©rL   s   HTTP/2)Úhttp_versionÚnetwork_streamrL   )Ústatusr    ÚcontentÚ
extensionsrL   Úresponse_closedr   )1Úcan_handle_requestÚurlr-   ÚRuntimeErrorr2   r>   r:   r"   r'   r(   r<   r;   r   r=   rA   r   ÚloggerÚ_send_connection_initÚBaseExceptionr   ÚcloseÚ_max_streamsr9   Úlocal_settingsÚmax_concurrent_streamsr   Ú_max_streams_semaphoreÚrangeÚacquireÚget_next_available_stream_idrD   r5   Ú
exceptionsÚNoAvailableStreamIDErrorrB   ÚreleaseÚ_send_request_headersÚ_send_request_bodyÚ_receive_responseÚreturn_valuer   ÚHTTP2ConnectionByteStreamr3   Ú_response_closedÚ
isinstanceÚProtocolErrorrE   r   r   )rH   r   Ú
sci_kwargsÚexcÚlocal_settings_max_streamsÚ_rL   ÚkwargsÚtracerS   r    r   r   r   Úhandle_requestK   s¢   
þüÿ€

ÿþ€ý

€ë


ü
ÿÿþýü
ÿ€þ

€êzHTTP2Connection.handle_requestÚNonec                 C  sf   t jjdt jjjdt jjjdt jjjdid�| j_| jjt jjj	= | j 
¡  | j d¡ |  |¡ dS )z�
        The HTTP/2 connection requires some initial setup before we can start
        using individual request/response streams on it.
        Tr   éd   r+   )ÚclientÚinitial_valuesé   N)r5   ÚsettingsÚSettingsÚSettingCodesÚENABLE_PUSHÚMAX_CONCURRENT_STREAMSÚMAX_HEADER_LIST_SIZEr9   r_   ÚENABLE_CONNECT_PROTOCOLÚinitiate_connectionÚincrement_flow_control_windowÚ_write_outgoing_data)rH   r   r   r   r   r[   ©   s   


ú
þ
z%HTTP2Connection._send_connection_initrL   Úintc                 C  s„   t |ƒ }dd„ |jD ƒd }d|jfd|fd|jjfd|jjfgdd„ |jD ƒ }| jj|||d	� | jjd
|d� |  	|¡ dS )z@
        Send the request headers to a given stream ID.
        c                 S  s    g | ]\}}|  ¡ d kr|‘qS )ó   hostr   ©r   r   Úvr   r   r   Ú
<listcomp>Ò   s     z9HTTP2Connection._send_request_headers.<locals>.<listcomp>r   s   :methods
   :authoritys   :schemes   :pathc                 S  s(   g | ]\}}|  ¡ d vr|  ¡ |f‘qS ))r‡   r   r   rˆ   r   r   r   rŠ   Ù   s    ÿ
þ)Ú
end_streamr{   rP   N)
r!   r    ÚmethodrX   ÚschemeÚtargetr9   Úsend_headersr„   r…   )rH   r   rL   r‹   Ú	authorityr    r   r   r   rh   È   s   


üþûz%HTTP2Connection._send_request_headersc                 C  sp   t |ƒsdS t|jtjƒsJ ‚t|jƒ�}|D ]	}|  |||¡ qW d  ƒ n1 s+w   Y  |  ||¡ dS )zP
        Iterate over the request body sending it to a given stream ID.
        N)r!   rn   r.   ÚtypingÚIterabler   Ú_send_stream_dataÚ_send_end_stream)rH   r   rL   ÚiteratorÚchunkr   r   r   ri   ç   s   ÿÿz"HTTP2Connection._send_request_bodyÚdataÚbytesc                 C  sd   d}|t |ƒk r0|  ||¡}|||| … }|t |ƒ7 }| j ||¡ |  |¡ |t |ƒk sdS dS )zI
        Send a single chunk of data in one or more data frames.
        r   N)ÚlenÚ_wait_for_outgoing_flowr9   Ú	send_datar…   )rH   r   rL   r—   ÚpositionÚmax_flowr–   r   r   r   r“   õ   s   
ûz!HTTP2Connection._send_stream_datac                 C  s   | j  |¡ |  |¡ dS )z`
        Send an empty data frame on on a given stream ID with the END_STREAM flag set.
        N)r9   r‹   r…   )rH   r   rL   r   r   r   r”     s   z HTTP2Connection._send_end_streamú%tuple[int, list[tuple[bytes, bytes]]]c                 C  s‚   	 |   ||¡}t|tjjƒrnqd}g }|jdusJ ‚|jD ]\}}|dkr0t|jddd�ƒ}q| d¡s<| 	||f¡ q||fS )	zT
        Return the response status code and headers for a given stream ID.
        TéÈ   Ns   :statusÚasciiÚignore)Úerrorsó   :)
Ú_receive_stream_eventrn   r5   ÚeventsÚResponseReceivedr    r†   ÚdecodeÚ
startswithÚappend)rH   r   rL   ÚeventÚstatus_coder    r   r‰   r   r   r   rj   
  s   ý
€z!HTTP2Connection._receive_responseúGenerator[bytes]c                 c  sv   � 	 |   ||¡}t|tjjƒr1|jdusJ ‚|jdusJ ‚|j}| j ||¡ |  	|¡ |jV  n	t|tjj
ƒr:dS q)z]
        Iterator that returns the bytes of the response body for a given stream ID.
        TN)r¤   rn   r5   r¥   ÚDataReceivedÚflow_controlled_lengthr—   r9   Úacknowledge_received_datar…   ÚStreamEnded)rH   r   rL   rª   Úamountr   r   r   Ú_receive_response_body  s   €

öz&HTTP2Connection._receive_response_bodyúKh2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEndedc                 C  sN   | j  |¡s|  ||¡ | j  |¡r| j |  d¡}t|tjjƒr%t|ƒ‚|S )zƒ
        Return the next available event for a given stream ID.

        Will read more data from the network if required.
        r   )	rD   ÚgetÚ_receive_eventsÚpoprn   r5   r¥   ÚStreamResetr   )rH   r   rL   rª   r   r   r   r¤   .  s   ÿz%HTTP2Connection._receive_stream_eventú
int | Nonec              
   C  s>  | j �� | jdur$| jj}|r|r||kr|  jd8  _tƒ ‚t| jƒ‚|du s.| j |¡s‰|  |¡}|D ]S}t	|t
jjƒr]tdt|ƒ�}|  |¡ ||_W d  ƒ n1 sWw   Y  q5t	|t
jjt
jjt
jjt
jjfƒr~|j| jv r}| j|j  |¡ q5t	|t
jjƒrˆ|| _q5W d  ƒ n1 s“w   Y  |  |¡ dS )zp
        Read some data from the network until we see one or more events
        for a given stream ID.
        Nr   Úreceive_remote_settings)r?   rE   Úlast_stream_idr<   r   r   rD   r´   Ú_read_incoming_datarn   r5   r¥   ÚRemoteSettingsChangedr   rZ   Ú_receive_remote_settings_changerk   r¦   r­   r°   r·   rL   r©   ÚConnectionTerminatedr…   )rH   r   rL   rº   r¥   rª   ru   r   r   r   rµ   =  s@   



þ€üþ	€€Ý%zHTTP2Connection._receive_eventsrª   úh2.events.RemoteSettingsChangedc                 C  s¢   |j  tjjj¡}|rIt|j| jj	j
ƒ}|rK|| jkrM|| jkr1| j ¡  |  jd7  _|| jks || jk rO| j ¡  |  jd8  _|| jk s6d S d S d S d S d S )Nr   )Úchanged_settingsr´   r5   r|   r~   r€   ÚminÚ	new_valuer9   r_   r`   r^   ra   rg   rc   )rH   rª   r`   Únew_max_streamsr   r   r   r½   i  s$   þ


þ

þ÷z/HTTP2Connection._receive_remote_settings_changec                 C  sä   | j �e || jv r| j ¡  | j|= | jr| js|  ¡  n3| jtjkrH| jsXtj	| _| j
d ur9t ¡ }|| j
 | _| jr`|  ¡  W d   ƒ d S W d   ƒ d S W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 skw   Y  d S ©N)r>   rD   ra   rg   rE   r]   r:   r"   r'   r(   r4   ÚtimeÚ	monotonicr;   rB   )rH   rL   Únowr   r   r   rm   x  s,   




óùûù"ôz HTTP2Connection._response_closedc                 C  s    | j  ¡  tj| _| j ¡  d S rÄ   )r9   Úclose_connectionr"   r)   r:   r3   r]   ©rH   r   r   r   r]   ˆ  s   
zHTTP2Connection.closeúlist[h2.events.Event]c              
   C  sˆ   |j  di ¡}| dd ¡}| jd ur| j‚z| j | j|¡}|dkr&tdƒ‚W n ty; } z|| _d| _|‚d }~ww | j	 
|¡}|S )NÚtimeoutÚreadó    zServer disconnectedT)rU   r´   rF   r3   rÌ   ÚREAD_NUM_BYTESr   Ú	ExceptionrC   r9   Úreceive_data)rH   r   ÚtimeoutsrË   r—   rq   r¥   r   r   r   r»   ‘  s"   
ÿ	€õz#HTTP2Connection._read_incoming_datac                 C  sœ   |j  di ¡}| dd ¡}| j�4 | j ¡ }| jd ur| j‚z	| j ||¡ W n ty; } z|| _d| _	|‚d }~ww W d   ƒ d S 1 sGw   Y  d S )NrË   ÚwriteT)
rU   r´   r@   r9   Údata_to_sendrG   r3   rÒ   rÏ   rC   )rH   r   rÑ   rË   rÓ   rq   r   r   r   r…   ­  s    

	€õÿ"ùz$HTTP2Connection._write_outgoing_datac                 C  sZ   | j  |¡}| j j}t||ƒ}|dkr+|  |¡ | j  |¡}| j j}t||ƒ}|dks|S )a  
        Returns the maximum allowable outgoing flow for a given stream.

        If the allowable flow is zero, then waits on the network until
        WindowUpdated frames have increased the flow rate.
        https://tools.ietf.org/html/rfc7540#section-6.9
        r   )r9   Úlocal_flow_control_windowÚmax_outbound_frame_sizerÁ   rµ   )rH   r   rL   Ú
local_flowÚmax_frame_sizeÚflowr   r   r   rš   È  s   


üz'HTTP2Connection._wait_for_outgoing_flowr   c                 C  s
   || j kS rÄ   )r2   ©rH   r-   r   r   r   rW   Ü  ó   
z"HTTP2Connection.can_handle_requestc                 C  s
   |   ¡  S rÄ   )Ú	is_closedrÉ   r   r   r   Úis_connectedß  rÚ   zHTTP2Connection.is_connectedc                 C  s2   | j tjko| j o| j o| jjjtj	j
jk S rÄ   )r:   r"   r)   rC   rB   r9   Ústate_machineÚstater5   r6   ÚConnectionStaterÉ   r   r   r   Úis_availableâ  s   ÿþüzHTTP2Connection.is_availablec                 C  s   t  ¡ }| j}|d uo||kS rÄ   )rÅ   rÆ   r;   )rH   rÇ   Ú	expire_atr   r   r   Úhas_expiredê  s   zHTTP2Connection.has_expiredc                 C  ó   | j tjkS rÄ   )r:   r"   r(   rÉ   r   r   r   Úis_idleñ  ó   zHTTP2Connection.is_idlec                 C  s   dS )NTr   rÉ   r   r   r   Úcan_multiplexô  ó   zHTTP2Connection.can_multiplexc                 C  rã   rÄ   )r:   r"   r)   rÉ   r   r   r   rÛ   ÷  rå   zHTTP2Connection.is_closedÚstrc                 C  s$   t | jƒ}|›d| jj› d| j› �S )Nz
, HTTP/2, ú, Request Count: )rè   r2   r:   Únamer<   rÙ   r   r   r   Úinfoú  s   
zHTTP2Connection.infoc              	   C  s6   | j j}t| jƒ}d|› d|›d| jj› d| j› d�	S )Nú<z [z, ré   z]>)Ú	__class__r$   rè   r2   r:   rê   r<   )rH   Ú
class_namer-   r   r   r   Ú__repr__þ  s   
$zHTTP2Connection.__repr__c                 C  s   | S rÄ   r   rÉ   r   r   r   Ú	__enter__  rç   zHTTP2Connection.__enter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackútypes.TracebackType | Nonec                 C  s   |   ¡  d S rÄ   )r]   )rH   rñ   ró   rõ   r   r   r   Ú__exit__	  s   zHTTP2Connection.__exit__rÄ   )r-   r	   r.   r   r/   r0   )r   r
   r   r   )r   r
   r   rw   )r   r
   rL   r†   r   rw   )r   r
   rL   r†   r—   r˜   r   rw   )r   r
   rL   r†   r   rž   )r   r
   rL   r†   r   r¬   )r   r
   rL   r†   r   r³   )r   r
   rL   r¸   r   rw   )rª   r¿   r   rw   )rL   r†   r   rw   ©r   rw   )r   r
   r   rÊ   )r   r
   rL   r†   r   r†   )r-   r	   r   r   )r   r   )r   rè   )r   r*   )NNN)rñ   rò   ró   rô   rõ   rö   r   rw   )$r$   r%   r&   rÎ   r5   r1   ÚH2Configurationr8   rI   rv   r[   rh   ri   r“   r”   rj   r²   r¤   rµ   r½   rm   r]   r»   r…   rš   rW   rÜ   rà   râ   rä   ræ   rÛ   rë   rï   rð   r÷   r   r   r   r   r*   %   sF    ü
"
^




	


,


	











ür*   c                   @  s*   e Zd Zdd	d
„Zddd„Zddd„ZdS )rl   r6   r*   r   r
   rL   r†   r   rw   c                 C  s   || _ || _|| _d| _d S )NF)Ú_connectionÚ_requestÚ
_stream_idÚ_closed)rH   r6   r   rL   r   r   r   rI     s   
z"HTTP2ConnectionByteStream.__init__r¬   c                 c  sò   � | j | jdœ}zJtdt| j |ƒ�7 t| jj| j | jd�ƒ�}|D ]}|V  q!W d   ƒ n1 s1w   Y  W d   ƒ W d S W d   ƒ W d S 1 sKw   Y  W d S  tyx } ztƒ � |  	¡  W d   ƒ |‚1 smw   Y  |‚d }~ww )NrK   Úreceive_response_body)
rû   rü   r   rZ   r   rú   r²   r\   r   r]   )rH   rt   r•   r–   rq   r   r   r   Ú__iter__  s0   €ÿÿýÿ&ÿ

ÿþ€úz"HTTP2ConnectionByteStream.__iter__c                 C  s`   | j s.d| _ d| ji}tdt| j|ƒ� | jj| jd� W d   ƒ d S 1 s'w   Y  d S d S )NTrL   rV   rP   )rý   rü   r   rZ   rû   rú   rm   )rH   rt   r   r   r   r]   *  s   
"ÿýzHTTP2ConnectionByteStream.closeN)r6   r*   r   r
   rL   r†   r   rw   )r   r¬   rø   )r$   r%   r&   rI   rÿ   r]   r   r   r   r   rl     s    

rl   )r   r
   r   r   )*Ú
__future__r   ÚenumÚloggingrÅ   Útypesr‘   Úcollections.abcr   Ú	h2.configr5   Úh2.connectionÚ	h2.eventsÚh2.exceptionsÚh2.settingsÚ_backends.baser   Ú_exceptionsr   r   r   Ú_modelsr	   r
   r   Ú_synchronizationr   r   r   Ú_tracer   Ú_utilsr   Ú
interfacesr   Ú	getLoggerrZ   r!   ÚIntEnumr"   r*   rl   r   r   r   r   Ú<module>   s6    

   p