U
    ){f<                     @  s,  d dl mZ d dlmZmZmZmZmZmZm	Z	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mZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	l m!Z! dd
lm"Z"mZm#Z#m$Z$ ddlm%Z%m&Z&mZ'm(Z(m)Z) ddl*m+Z+ dZ,e,d Z-G dd de.Z/G dd dZ0G dd dZ1dS )    )annotations)	AwaitableCallableDictListOptionalTupleTypeUnionN   )
BodyDataEndBodyEndDataEventInformationalResponseRequestResponseStreamClosedTrailers)
HTTPStream)WSStream   )Config)Closedr   RawDataUpdated)
AppWrapperConnectionStater   	TaskGroupWorkerContext)filter_pseudo_headersi   c                   @  s   e Zd ZdS )BufferCompleteErrorN)__name__
__module____qualname__ r&   r&   T/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/hypercorn/protocol/h2.pyr"   "   s   r"   c                   @  sx   e Zd ZdddddZddddZddd	d
ZddddZeddddZdddddZ	dddddZ
dS )StreamBufferzType[IOEvent]None)event_classreturnc                 C  s"   t  | _d| _| | _| | _d S )NF)	bytearraybuffer	_complete	_is_empty_paused)selfr*   r&   r&   r'   __init__'   s    zStreamBuffer.__init__r+   c                   s   | j  I d H  d S N)r/   waitr1   r&   r&   r'   drain-   s    zStreamBuffer.drainc                 C  s
   d| _ d S NT)r.   r6   r&   r&   r'   set_complete0   s    zStreamBuffer.set_completec                   s2   d| _ t | _| j I d H  | j I d H  d S r8   )r.   r,   r-   r/   setr0   r6   r&   r&   r'   close3   s    zStreamBuffer.closeboolc                 C  s   | j ot| jdkS Nr   )r.   lenr-   r6   r&   r&   r'   complete9   s    zStreamBuffer.completebytes)datar+   c                   sZ   | j rt | j| | j I d H  t| jtkrV| j	 I d H  | j I d H  d S r4   )
r.   r"   r-   extendr/   clearr>   BUFFER_HIGH_WATERr0   r5   r1   rA   r&   r&   r'   push=   s    zStreamBuffer.pushint)
max_lengthr+   c                   sl   t t| j|}t| jd | }| jd |= t|tk rJ| j I d H  t| jdkrh| j I d H  |S r=   )minr>   r-   r@   BUFFER_LOW_WATERr0   r:   r/   )r1   rH   lengthrA   r&   r&   r'   popF   s    zStreamBuffer.popN)r#   r$   r%   r2   r7   r9   r;   propertyr?   rF   rL   r&   r&   r&   r'   r(   &   s   	r(   c                   @  s  e Zd Zdddddddddd	d

ddZeddddZd:ddd	dddZd	dddZdd	dddZdd	dddZ	d d	dd!d"Z
d#d	d$d%d&Zd	dd'd(Zd)d	dd*d+Zd,d	dd-d.Zd/d	d0d1d2Zdd3d4d	d5d6d7Zdd	dd8d9ZdS );
H2Protocolr   r   r    r   r   r<   zOptional[Tuple[str, int]]z"Callable[[Event], Awaitable[None]]r)   )
appconfigcontext
task_groupconnection_statesslclientserversendr+   c
           
      C  s   || _ || _d| _|| _|| _|| _|| _tjj	tjj
dd dd| _|j| j_tjjdtjjj|jtjjj|jtjjjdid| j_d| _|	| _|| _|| _i | _| j | _t | _i | _d S )NF)Zclient_sideheader_encoding)rP   r   )rU   Zinitial_valuesr   ) rO   rU   closedrP   rQ   rR   rS   h2
connectionZH2ConnectionZH2ConfigurationZh2_max_inbound_frame_sizeZDEFAULT_MAX_INBOUND_FRAME_SIZEsettingsZSettingsSettingCodesMAX_CONCURRENT_STREAMSZh2_max_concurrent_streamsZMAX_HEADER_LIST_SIZEZh2_max_header_list_sizeZENABLE_CONNECT_PROTOCOLZlocal_settingskeep_alive_requestsrW   rV   rT   streamsr*   has_datapriorityZPriorityTreestream_buffers)
r1   rO   rP   rQ   rR   rS   rT   rU   rV   rW   r&   r&   r'   r2   R   s:    
   
	
zH2Protocol.__init__r3   c                 C  s&   t | jdkp$tdd | j D S )Nr   c                 s  s   | ]}|j V  qd S r4   idle.0streamr&   r&   r'   	<genexpr>   s     z"H2Protocol.idle.<locals>.<genexpr>)r>   r`   allvaluesr6   r&   r&   r'   re   }   s    zH2Protocol.idleNz#Optional[List[Tuple[bytes, bytes]]]zOptional[str])headersr\   r+   c                   s   |d k	r| j | n
| j   |  I d H  |d k	r|tj }d|_||_| 	|I d H  | j
|j t|jdI d H  | j| j d S )Nr   	stream_id)r[   Zinitiate_upgrade_connectionZinitiate_connection_flushrZ   eventsRequestReceivedrn   rl   _create_streamr`   handler   rR   spawn	send_task)r1   rl   r\   eventr&   r&   r'   initiate   s    

 zH2Protocol.initiatec                   sb   | j s^zt| j}W n6 tjk
rJ   | j I d H  | j I d H  Y q X | |I d H  q d S r4   )rY   nextrb   ZDeadlockErrorra   r5   rC   
_send_datar1   rn   r&   r&   r'   ru      s    zH2Protocol.send_taskrG   )rn   r+   c              
     s   zt | j|| jj}td|}| j| |I d H }|rZ| j|| |  I d H  n| j	
| | j| jr| j| |  I d H  | j|= | j	| W nJ tjjttjjfk
r   | j|  I d H  | j|= | j	| Y nX d S r=   )rI   r[   Zlocal_flow_control_windowZmax_outbound_frame_sizemaxrc   rL   Z	send_dataro   rb   blockr?   Z
end_streamZremove_streamrZ   
exceptionsZStreamClosedErrorKeyErrorProtocolErrorr;   )r1   rn   
chunk_sizerA   r&   r&   r'   ry      s(    

zH2Protocol._send_datar   )rv   r+   c                   s   t |trhz| j|j}W n8 tjjk
rT   |  I d H  | 	t
 I d H  Y qX | |I d H  nHt |t
rd| _t| j }|D ]}| |I d H  q| j I d H  d S r8   )
isinstancer   r[   Zreceive_datarA   rZ   r}   r   ro   rW   r   _handle_eventsrY   listr`   keys_close_streamra   r:   )r1   rv   rp   Z
stream_idsrn   r&   r&   r'   rs      s    

zH2Protocol.handleStreamEventc                   s  zt |ttfrR| j|jdd|j fg|j | j	d  | 
 I d H  n|t |ttfr| j|j | j I d H  | j|j |jI d H  n2t |ttfr| j|j   | j|j | j I d H  | j|j  I d H  nt |tr| j|j|j | 
 I d H  nt |tr| |jI d H  t| jdkpbtdd | j D }|r| jj ! r| j"  | 
 I d H  | #t$|dI d H  n&t |t%r| &|j|j'|jI d H  W n& t(t)tj*t+j,j-fk
r   Y d S X d S )Ns   :statuss   %drZ   r   c                 s  s   | ]}|j V  qd S r4   rd   rf   r&   r&   r'   ri      s    z)H2Protocol.stream_send.<locals>.<genexpr>rd   ).r   r   r   r[   send_headersrn   status_coderl   rP   response_headersro   r   r   rb   unblockra   r:   rc   rF   rA   r   r   r9   r7   r   r   r   r>   r`   rj   rk   rQ   
terminatedis_setclose_connectionrW   r   r   _create_server_pushraw_pathr"   r~   MissingStreamErrorrZ   r}   r   )r1   rv   re   r&   r&   r'   stream_send   sR    

zH2Protocol.stream_sendzList[h2.events.Event])rp   r+   c              	     s  |D ]}t |tjjr| jj rJ| j|j	 | j
tjjjdi n&| |I d H  | tddI d H  | j| jjkr| j  qt |tjjr| j|j	 t|j	|jdI d H  | j|j|j	 qt |tjjrz$| j|j	 t|j	dI d H  W n tk
r   Y nX qt |tjjrT|  |j	I d H  | !|j	I d H  qt |tjj"rx| !|j	I d H  qt |tjj#r| $|I d H  qt |tjj%rtjjj&|j'kr| !d I d H  qt |tjj(r| t) I d H  q| * I d H  d S )Nr   Frd   )rn   rA   rm   )+r   rZ   rp   rq   rQ   r   r   r[   Zreset_streamrn   Zupdate_settingsr\   r]   r^   rr   rW   r   r_   rP   Zkeep_alive_max_requestsr   ZDataReceivedr`   rs   r   rA   Zacknowledge_received_dataZflow_controlled_lengthZStreamEndedr   r~   ZStreamResetr   _window_updatedZWindowUpdatedZPriorityUpdated_priority_updatedZRemoteSettingsChangedZINITIAL_WINDOW_SIZEZchanged_settingsZConnectionTerminatedr   ro   )r1   rp   rv   r&   r&   r'   r      sJ    

 $zH2Protocol._handle_eventsc                   s,   | j  }|dkr(| t|dI d H  d S )N    )rA   )r[   Zdata_to_sendrW   r   rE   r&   r&   r'   ro     s    
zH2Protocol._flushzOptional[int]c                   sd   |d ks|dkr2t | j D ]}| j| qn|d k	rP|| jkrP| j| | j I d H  d S r=   )r   rc   r   rb   r   ra   r:   rz   r&   r&   r'   r   "  s    zH2Protocol._window_updatedzh2.events.PriorityUpdatedc              	     s~   z$| j j|j|jpd |j|jd W nD t jk
rh   | j j|j|jpHd |j|jd | j |j Y nX | j	
 I d H  d S )N)rn   
depends_onweight	exclusive)rb   Zreprioritizern   r   r   r   r   insert_streamr|   ra   r:   )r1   rv   r&   r&   r'   r   +  s     
zH2Protocol._priority_updatedzh2.events.RequestReceived)requestr+   c              
     sB  |j D ],\}}|dkr&|d }q|dkr|}q|dkrpt| j| j| j| j| j| j	| j
| j|j	| j|j< n2t| j| j| j| j| j| j	| j
| j|j	| j|j< t| jj| j|j< z| j|j W n tjk
r   Y nX | j|j | j|j t|jt|j d||| jdI d H  |  jd7  _| j I d H  d S )N   :methodascii   :pathZCONNECT2)rn   rl   http_versionmethodr   stater   )rl   decodeupperr   rO   rP   rQ   rR   rT   rU   rV   r   rn   r`   r   r(   r*   rc   rb   r   ZDuplicateStreamErrorr|   rs   r   r!   rS   r_   Zmark_request)r1   r   namevaluer   r   r&   r&   r'   rr   >  s\    

zH2Protocol._create_streamr@   zList[Tuple[bytes, bytes]])rn   pathrl   r+   c                   s   | j  }dd|fg}|| || jd z$| j j|||d |  I d H  W n tjj	k
rn   Y nVX tj
 }||_||_| |I d H  | j|j t|jdI d H  |  jd7  _d S )N)r   s   GETr   rZ   )rn   Zpromised_stream_idrequest_headersrm   r   )r[   Zget_next_available_stream_idrB   rP   r   Zpush_streamro   rZ   r}   r   rp   rq   rn   rl   rr   r`   rs   r   r_   )r1   rn   r   rl   Zpush_stream_idr   rv   r&   r&   r'   r   s  s&    


 zH2Protocol._create_server_pushc                   s@   || j kr<| j |}|t|dI d H  | j I d H  d S )Nrm   )r`   rL   rs   r   ra   r:   )r1   rn   rh   r&   r&   r'   r     s    
zH2Protocol._close_stream)NN)r#   r$   r%   r2   rM   re   rw   ru   ry   rs   r   r   ro   r   r   rr   r   r   r&   r&   r&   r'   rN   Q   s"    +   +*	5rN   )2
__future__r   typingr   r   r   r   r   r   r	   r
   rZ   Zh2.connectionZ	h2.eventsZh2.exceptionsrb   rp   r   r   r   r   r   r   r   r   r   r   r   Zhttp_streamr   Z	ws_streamr   rP   r   r   r   r   r   r   ZIOEventr   r    utilsr!   rD   rJ   	Exceptionr"   r(   rN   r&   r&   r&   r'   <module>   s$   (0+