U
    ){f.                     @  s  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 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 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Z&G dd de'Z(G dd de'Z)G dd dZ*G dd dZ+dS )    )annotations)chain)	AwaitableCallablecastOptionalTupleTypeUnionN   )	BodyDataEndBodyEndDataEventInformationalResponseRequestResponseStreamClosed)
HTTPStream)WSStream   )Config)Closedr   RawDataUpdated)
AppWrapperConnectionStateH11SendableEvent	TaskGroupWorkerContextc                   @  s   e Zd ZddddddZdS )H2CProtocolRequiredErrorbytesh11.RequestNone)datarequestreturnc                 C  s|   d}d|j fd|jfg}|jD ]F\}}| dkr<| }n| dkrV|d|f |||f q|| _|| _|| _d S )N s   :methods   :paths   http2-settingss   hosts
   :authority)methodtargetheaderslowerdecodeappendr%   settings)selfr%   r&   r/   r+   namevalue r3   U/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/hypercorn/protocol/h11.py__init__   s    
z!H2CProtocolRequiredError.__init__N__name__
__module____qualname__r5   r3   r3   r3   r4   r!      s   r!   c                   @  s   e Zd ZdddddZdS )H2ProtocolAssumedErrorr"   r$   r%   r'   c                 C  s
   || _ d S Nr%   r0   r%   r3   r3   r4   r5   -   s    zH2ProtocolAssumedError.__init__Nr6   r3   r3   r3   r4   r:   ,   s   r:   c                   @  sh   e Zd ZdZdZdZ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ZdS )H11WSConnectionNF)    Fzh11.Connectionr$   )h11_connectionr'   c                 C  s   t |jd | _|| _d S )Nr   )	bytearraytrailing_databufferrA   )r0   rA   r3   r3   r4   r5   :   s    zH11WSConnection.__init__r"   r;   c                 C  s   | j | d S r<   )rD   extendr>   r3   r3   r4   receive_data>   s    zH11WSConnection.receive_dataz Union[Data, Type[h11.NEED_DATA]]r'   c                 C  s.   | j r$ttt| j d}t | _ |S tjS d S )N	stream_idr%   )rD   r   	STREAM_IDr"   rB   h11	NEED_DATAr0   eventr3   r3   r4   
next_eventA   s
    zH11WSConnection.next_eventr   rN   r'   c                 C  s   | j |S r<   )rA   sendrM   r3   r3   r4   rQ   I   s    zH11WSConnection.sendc                 C  s   d S r<   r3   r0   r3   r3   r4   start_next_cycleL   s    z H11WSConnection.start_next_cycle)r7   r8   r9   	our_state!they_are_waiting_for_100_continuetheir_staterC   r5   rF   rO   rQ   rS   r3   r3   r3   r4   r?   1   s   r?   c                   @  s   e Zd Zdddddd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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'Zdd	dd(d)Zd*S )+H11Protocolr   r   r    r   r   boolzOptional[Tuple[str, int]]z"Callable[[Event], Awaitable[None]]r$   )
appconfigcontext
task_groupconnection_statesslclientserverrQ   r'   c
           
      C  sf   || _ | | _|| _|| _tjtj| jjd| _	|| _
d| _|	| _|| _|| _d | _|| _|| _d S )N)Zmax_incomplete_event_sizer   )rY   Zevent_classcan_readr_   rZ   rK   
ConnectionZSERVERZh11_max_incomplete_size
connectionr[   keep_alive_requestsrQ   r`   r^   streamr\   r]   )
r0   rY   rZ   r[   r\   r]   r^   r_   r`   rQ   r3   r3   r4   r5   Q   s     
 zH11Protocol.__init__rG   c                   s   d S r<   r3   rR   r3   r3   r4   initiatem   s    zH11Protocol.initiater   rP   c                   sN   t |tr(| j|j |  I d H  n"t |trJ| jd k	rJ|  I d H  d S r<   )	
isinstancer   rc   rF   r%   _handle_eventsr   re   _close_streamrM   r3   r3   r4   handlep   s    


zH11Protocol.handleStreamEventc              	     s8  t |tr|jdkrbtt|j| jd}| j| jj	krD|
d | tj||jdI d H  n0| tjtt|j| jd|jdI d H  nt |trnt |tr| tj|jdI d H  nnt |tr| t I d H  nNt |tr| t|jdI d H  n(t |trnt |tr4|  I d H  d S )N   rK   
   connections   close)r+   status_coder=   )rg   r   ro   listr   r+   rZ   response_headersrd   Zkeep_alive_max_requestsr.   _send_h11_eventrK   r   r   r   r%   r   EndOfMessagerQ   r   r   r   _maybe_recycle)r0   rN   r+   r3   r3   r4   stream_sendx   s:    





zH11Protocol.stream_sendc              
     s  | j jr*| tjd| jddI d H  z| j  }W nf tjk
r } zF| j j	tj
tjhkrr| |jI d H  | t I d H  W Y qW 5 d }~X Y q X t|tjr| tddI d H  | |I d H  | |I d H  q |tjkr| j I d H  | j I d H  q t|tjs|tjkr2qq | jd krDqq t|tjrp| jtt|j dI d H  q t|tj!r| jt"tdI d H  q t|tr | j|I d H  q d S )Nd   rK   ro   r+   FidlerH   rI   )#rc   rU   rr   rK   r   rZ   rq   rO   ZRemoteProtocolErrorrT   ZIDLEZSEND_RESPONSE_send_error_responseZerror_status_hintrQ   r   rg   r   r   _check_protocol_create_streamZPAUSEDra   clearwaitZConnectionClosedrL   re   r   rj   r   rJ   r%   rs   r   )r0   rN   errorr3   r3   r4   rh      s>     


zH11Protocol._handle_eventsr#   )r&   r'   c           	   
     s|  d}d}|j D ]H\}}|d  }|dkr@|d }q|dkr|d }q| d}tdd |D r| dkr|jd	 d
krt| j	| j
| j| j| j| j| j| jt	| _tttj| j| _n*t| j	| j
| j| j| j| j| j| jt	| _| j
jr|j  }n
t|j }| jtt||j |jd	 |j| j dI d H  |  j!d7  _!| j" I d H  d S )Nr(   latin1upgraderc   ,c                 s  s   | ]}|  d kV  qdS )r   N)strip).0tokenr3   r3   r4   	<genexpr>   s     z-H11Protocol._create_stream.<locals>.<genexpr>Z	websocketasciiGET)rI   r+   http_versionr)   raw_pathstater   )#r+   r-   r   r,   splitanyr)   upperr   rY   rZ   r[   r\   r^   r_   r`   ru   rJ   re   r?   r   rK   rb   rc   r   Zh11_pass_raw_headers	raw_itemsrp   rj   r   r   r*   r]   rd   Zmark_request)	r0   r&   upgrade_valueZconnection_valuer1   r2   sanitised_nameZconnection_tokensr+   r3   r3   r4   r}      sj    




zH11Protocol._create_streamr   c                   sR   z| j |}W n& tjk
r6   | j jtjkr2 Y nX | t|dI d H  d S )Nr=   )rc   rQ   rK   LocalProtocolErrorrV   ERRORr   )r0   rN   r%   r3   r3   r4   rr      s    zH11Protocol._send_h11_eventint)ro   r'   c              
     sH   |  tj|ttddg| jddI d H  |  t I d H  d S )N)s   content-length   0rm   rK   rw   )rr   rK   r   rp   r   rZ   rq   rs   )r0   ro   r3   r3   r4   r{      s    

z H11Protocol._send_error_responsec                   s   |   I d H  | jj s| jjtjkr| jjtjkrz| j	  W n( tj
k
rl   | t I d H  Y qX d | _d | _| j I d H  | tddI d H  n"| j I d H  | t I d H  d S )NTrx   )ri   r[   Z
terminatedis_setrc   rT   rK   ZDONErV   rS   r   rQ   r   responsescopera   setr   rR   r3   r3   r4   rt     s"    
zH11Protocol._maybe_recyclec                   s,   | j d k	r(| j ttdI d H  d | _ d S )Nrz   )re   rj   r   rJ   rR   r3   r3   r4   ri   "  s    
zH11Protocol._close_streamc                   s   d}d}|j D ]>\}}|d  }|dkr@|d }q|dkrd}q| dkr|s| tjd| jd	d
dg dI d H  t	| j
jd |n2|jdkr|jdkr|jdkrtd| j
jd  d S )Nr(   Fr   r   >   content-lengthtransfer-encodingTZh2ce   rK   )rn      upgrade)r   s   h2crw   r   s   PRI   *s   2.0s   PRI * HTTP/2.0

)r+   r-   r   r,   rr   rK   r   rZ   rq   r!   rc   rC   r)   r*   r   r:   )r0   rN   r   Zhas_bodyr1   r2   r   r3   r3   r4   r|   '  s,    

zH11Protocol._check_protocolN)r7   r8   r9   r5   rf   rj   ru   rh   r}   rr   r{   rt   ri   r|   r3   r3   r3   r4   rW   P   s     $;	rW   ),
__future__r   	itertoolsr   typingr   r   r   r   r   r	   r
   rK   eventsr   r   r   r   r   rk   r   r   r   r   Zhttp_streamr   Z	ws_streamr   rZ   r   r   r   r   r   r   r   r   r    rJ   	Exceptionr!   r:   r?   rW   r3   r3   r3   r4   <module>   s   $,