U
    &%e                     @   s   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m	Z	 d dl
mZmZmZmZmZ e jege je f Ze jeege je f Ze dZG dd dZG d	d
 d
e	ZdS )    N)BackgroundTask)Request)ContentStreamResponseStreamingResponse)ASGIAppMessageReceiveScopeSendTc                   @   sL   e Zd Zdeeje ddddZee	e
ddddZeeedd	d
ZdS )BaseHTTPMiddlewareN)appdispatchreturnc                 C   s   || _ |d kr| jn|| _d S N)r   r   dispatch_func)selfr   r    r   X/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/starlette/middleware/base.py__init__   s    zBaseHTTPMiddleware.__init__)scopereceivesendr   c              
      s   d dkr$ ||I d H  d S t  ttd fdd}t 4 I d H >t|d}||I d H }|||I d H     W 5 Q I d H R X d S )Ntypehttp)requestr   c                    s8  d  t  \tdfddd dfdd}td dfddd d fd	d
}	| 	| z@ I d H }|dd }|d dkr|d k	r I d H }W n* t jk
r    d k	rڈ tdY nX |d dkstt	j
td f d fdd}t|d | |d}|d |_|S )N)r   c               
      s     rddiS t 4 I d H H tjg tjt f td fdd}  | j | j	I d H }W 5 Q I d H R X   rddiS |S )Nr   zhttp.disconnect)funcr   c                    s   |  I d H } j   |S r   )Zcancel_scopecancel)r   result
task_groupr   r   wrap)   s    
z[BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect.<locals>.wrap)
is_setanyiocreate_task_grouptypingCallable	Awaitabler   
start_soonwaitr   )r"   message)r   response_sentr    r   receive_or_disconnect#   s    $ zMBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnectc                      s     I d H     d S r   )r*   closer   )recv_streamr,   r   r   "close_recv_stream_on_response_sent6   s    zZBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.close_recv_stream_on_response_sent)r+   r   c                    s2   z  | I d H  W n tjk
r,   Y d S X d S r   )r   r$   ZBrokenResourceError)r+   )send_streamr   r   send_no_error:   s    zEBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_errorc                     sb   4 I d H F z I d H  W n& tk
rL }  z|  W 5 d } ~ X Y nX W 5 Q I d H R X d S r   )r   	Exception)exc)app_excr-   r   r   r2   r1   r   r   coroA   s
    z<BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.coroinfor   http.response.debugzNo response returned.zhttp.response.startc               
     sh   4 I d H @ 2 z23 d H W } | d dks.t | dd}|r|V  q6 W 5 Q I d H R X  d k	rd d S )Nr   zhttp.response.bodybody    )AssertionErrorget)r+   r9   )r5   r/   r   r   body_streamY   s    zCBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.body_streamstatus)status_codecontentr7   headers)r$   Zcreate_memory_object_streamr   r)   r   r<   ZEndOfStreamRuntimeErrorr;   r&   AsyncGeneratorbytes_StreamingResponseZraw_headers)r   r0   r6   r+   r7   r=   responser,   r   r   r!   )r5   r-   r/   r   r2   r1   r   	call_next   s4    	

  
z.BaseHTTPMiddleware.__call__.<locals>.call_next)r   )r   r$   Eventr   r   r%   r   set)r   r   r   r   rH   r   rF   r   rG   r   __call__   s    KzBaseHTTPMiddleware.__call__)r   rH   r   c                    s
   t  d S r   )NotImplementedError)r   r   rH   r   r   r   r   p   s    zBaseHTTPMiddleware.dispatch)N)__name__
__module____qualname__r   r&   OptionalDispatchFunctionr   r
   r	   r   rK   r   RequestResponseEndpointr   r   r   r   r   r   r      s     Y r   c                
       sr   e Zd Zd	eeejejeef  eje eje	 ejejeej
f  dd fddZedd fddZ  ZS )
rE      N)r@   r?   rA   
media_type
backgroundr7   r   c                    s   || _ t ||||| d S r   )_infosuperr   )r   r@   r?   rA   rT   rU   r7   	__class__r   r   r   w   s    	z_StreamingResponse.__init__)r   r   c                    s.   | j r|d| j dI d H  t |I d H S )Nr8   )r   r7   )rV   rW   stream_response)r   r   rX   r   r   rZ      s    z"_StreamingResponse.stream_response)rS   NNNN)rM   rN   rO   r   intr&   rP   Mappingstrr   Anyr   r   rZ   __classcell__r   r   rX   r   rE   v   s        rE   )r&   r$   Zstarlette.backgroundr   Zstarlette.requestsr   Zstarlette.responsesr   r   r   Zstarlette.typesr   r   r	   r
   r   r'   r(   rR   rQ   TypeVarr   r   rE   r   r   r   r   <module>   s   
e