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	 d dl
mZ d dl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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, G dd dZ-dS )    )annotations)	AwaitableCallableDictListOptionalTupleUnion)H3Connection)DataReceivedHeadersReceived)NoAvailablePushIDError)QuicConnection)	QuicEvent   )
BodyDataEndBodyEndDataEventInformationalResponseRequestResponseStreamClosedTrailers)
HTTPStream)WSStream   )Config)
AppWrapperConnectionState	TaskGroupWorkerContext)filter_pseudo_headersc                   @  sp   e Zd Zdddddddd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	dddZdS ) 
H3Protocolr   r   r"   r!   r    zOptional[Tuple[str, int]]r   zCallable[[], Awaitable[None]]None)
appconfigcontext
task_groupstateclientserverquicsendreturnc
           
      C  sD   || _ || _|| _|| _t|| _|	| _|| _i | _|| _	|| _
d S )N)r&   r+   r'   r(   r
   
connectionr.   r,   streamsr)   r*   )
selfr&   r'   r(   r)   r*   r+   r,   r-   r.    r3   T/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/hypercorn/protocol/h3.py__init__   s    
zH3Protocol.__init__r   )
quic_eventr/   c                   s   | j |D ]}t|tr^| jj s| |I d H  |jr| j	|j
 t|j
dI d H  qt|tr| j	|j
 t|j
|jdI d H  |jr| j	|j
 t|j
dI d H  qd S )N	stream_id)r8   data)r0   Zhandle_event
isinstancer   r(   Z
terminatedis_set_create_streamstream_endedr1   r8   handler   r   r   r9   )r2   r6   eventr3   r3   r4   r>   6   s    



zH3Protocol.handleStreamEvent)r?   r/   c                   s  t |ttfrL| j|jdd|j fg|j | j	d  | 
 I d H  nt |ttfr~| j|j|jd | 
 I d H  nt |ttfr| j|jdd | 
 I d H  n^t |tr| j|j|j | 
 I d H  n2t |trn&t |tr| |j|j|jI d H  d S )Ns   :statuss   %dh3F    T)r:   r   r   r0   send_headersr8   status_codeheadersr'   response_headersr.   r   r   Z	send_datar9   r   r   r   r   r   _create_server_pushraw_path)r2   r?   r3   r3   r4   stream_sendF   s.    


zH3Protocol.stream_sendr   )requestr/   c              
     s   |j D ],\}}|dkr&|d }q|dkr|}q|dkrnt| j| j| j| jd| j| j	| j
|j	| j|j< n0t| j| j| j| jd| j| j	| j
|j	| j|j< | j|j t|jt|j d||| jdI d H  | j I d H  d S )N   :methodascii   :pathZCONNECTT3)r8   rE   http_versionmethodrH   r*   )rE   decodeupperr   r&   r'   r(   r)   r+   r,   rI   r8   r1   r   r>   r   r#   r*   Zmark_request)r2   rJ   namevaluerP   rH   r3   r3   r4   r<   ]   sN    

zH3Protocol._create_streamintbyteszList[Tuple[bytes, bytes]])r8   pathrE   r/   c                   s   dd|fg}| | | | jd z| jj||d}W n tk
rP   Y n@X t|d|d}| |I d H  | j|j	 
t|j	dI d H  d S )N)rK   s   GETrM   rA   )r8   rE   T)r8   r=   rE   r7   )extendr'   rF   r0   Zsend_push_promiser   r   r<   r1   r8   r>   r   )r2   r8   rW   rE   Zrequest_headersZpush_stream_idr?   r3   r3   r4   rG      s"    
 
  zH3Protocol._create_server_pushN)__name__
__module____qualname__r5   r>   rI   r<   rG   r3   r3   r3   r4   r$      s
    ,r$   N).
__future__r   typingr   r   r   r   r   r   r	   Zaioquic.h3.connectionr
   Zaioquic.h3.eventsr   r   Zaioquic.h3.exceptionsr   Zaioquic.quic.connectionr   Zaioquic.quic.eventsr   eventsr   r   r   r   r   r@   r   r   r   r   r   Zhttp_streamr   Z	ws_streamr   r'   r   r   r    r!   r"   utilsr#   r$   r3   r3   r3   r4   <module>   s   $0