o
    tf5"                     @  s   d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZ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eZG dd dZG dd deZ dS )    )annotationsN)ObjectReceiveStreamObjectSendStream)collapse_excgroups)BackgroundTask)ClientDisconnectRequest)ContentStreamResponseStreamingResponse)ASGIAppMessageReceiveScopeSendTc                      s,   e Zd ZdZd fddZdd
dZ  ZS )_CachedRequesta  
    If the user calls Request.body() from their dispatch function
    we cache the entire request body in memory and pass that to downstream middlewares,
    but if they call Request.stream() then all we do is send an
    empty body so that downstream things don't hang forever.
    scoper   receiver   c                   s(   t  || d| _d| _|  | _d S )NF)super__init___wrapped_rcv_disconnected_wrapped_rcv_consumedstreamZ_wrapped_rc_stream)selfr   r   	__class__ b/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/starlette/middleware/base.pyr      s   z_CachedRequest.__init__returnr   c                   s   | j rddiS | jr-| jrd| _ ddiS |  I d H }|d dkr+td|d  |S t| dd d ur?d| _d| jddS | jrKd| _dd	ddS z|  }|	 I d H }| j| _d|| j dW S  t
ys   d| _ ddi Y S w )
Ntypehttp.disconnectTzUnexpected message received: _bodyzhttp.requestF)r    body	more_body    )r   r   Z_is_disconnectedr   RuntimeErrorgetattrr"   Z_stream_consumedr   	__anext__r   )r   msgr   chunkr   r   r   wrapped_receive#   sF   z_CachedRequest.wrapped_receive)r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r+   __classcell__r   r   r   r   r      s    r   c                   @  s,   e Zd Zdddd	ZdddZdddZdS )BaseHTTPMiddlewareNappr   dispatchDispatchFunction | Noner   Nonec                 C  s$   || _ |d u r| j| _d S || _d S N)r3   r4   dispatch_func)r   r3   r4   r   r   r   r   a   s   zBaseHTTPMiddleware.__init__r   r   r   r   sendr   c              
     s   d dkr ||I d H  d S t|}|jt  d	 fdd}t E t 4 I d H !||I d H }||I d H     W d   I d H  n1 I d H s]w   Y  W d    d S W d    d S 1 suw   Y  d S )
Nr    httprequestr   r   r
   c                   s  d  t  \d	fdddfdd}dfd	d
d fdd}| | z  I d H }|dd }|d dkrU|d urU I d H }W n t jyh    d urd tdw |d dksqJ d fdd}t|d | |d}|d |_|S )Nr   r   c               	     s     r	ddiS t 4 I d H   d	 fdd}  | j | I d H }W d   I d H  n1 I d H s7w   Y    rDddiS |S )
Nr    r!   func(typing.Callable[[], typing.Awaitable[T]]r   r   c                   s   |  I d H } j   |S r7   )Zcancel_scopecancel)r<   result
task_groupr   r   wrapz   s   
z[BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect.<locals>.wrap)r<   r=   r   r   )is_setanyiocreate_task_group
start_soonwait)rB   message)response_sentr+   r@   r   receive_or_disconnectt   s   (
zMBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnectr6   c                     s     I d H     d S r7   )rG   closer   )recv_streamrI   r   r   "close_recv_stream_on_response_sent   s   zZBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.close_recv_stream_on_response_sentrH   c                   s0   z  | I d H  W d S  tjy   Y d S w r7   )r9   rD   ZBrokenResourceError)rH   )send_streamr   r   send_no_error   s   zEBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.send_no_errorc                    s   4 I d H 8 z I d H  W n ty( }  z|  W Y d } ~ nd } ~ ww W d   I d H  d S W d   I d H  d S 1 I d H sEw   Y  d S r7   )r3   	Exception)exc)app_excrJ   r   r   rO   rN   r   r   coro   s   .z<BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.coroinfor    http.response.debugzNo response returned.zhttp.response.start"typing.AsyncGenerator[bytes, None]c               	    s   4 I d H 0 2 z!3 d H W } | d dksJ |  dd}|r#|V  |  dds+ nq
6 W d   I d H  n1 I d H s=w   Y   d urH d S )Nr    zhttp.response.bodyr#   r%   r$   F)get)rH   r#   )rR   rL   r   r   body_stream   s   (	zCBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.body_streamstatus)status_codecontentrT   headersr,   )r   r6   )rH   r   r   r6   )r   rV   )	rD   Zcreate_memory_object_streamrF   r   rW   ZEndOfStreamr&   _StreamingResponseZraw_headers)r;   rM   rS   rH   rT   rX   responserI   r   r   rA   r+   )rR   rJ   rL   rO   rN   r   	call_nextn   s6   
	

z.BaseHTTPMiddleware.__call__.<locals>.call_next)r;   r   r   r
   )	r3   r   r+   rD   Eventr   rE   r8   set)r   r   r   r9   r;   r`   r^   r   r_   r   __call__e   s"   
O
*"zBaseHTTPMiddleware.__call__r;   r   r`   RequestResponseEndpointr
   c                   s   t  r7   )NotImplementedError)r   r;   r`   r   r   r   r4      s   zBaseHTTPMiddleware.dispatchr7   )r3   r   r4   r5   r   r6   )r   r   r   r   r9   r   r   r6   )r;   r   r`   rd   r   r
   )r-   r.   r/   r   rc   r4   r   r   r   r   r2   `   s    
^r2   c                      s8   e Zd Z					dd fddZd fddZ  ZS )r]      Nr[   r	   rZ   intr\   typing.Mapping[str, str] | None
media_type
str | None
backgroundBackgroundTask | NonerT   &typing.Mapping[str, typing.Any] | Noner   r6   c                   s   || _ t ||||| d S r7   )_infor   r   )r   r[   rZ   r\   ri   rk   rT   r   r   r   r      s   	z_StreamingResponse.__init__r9   r   c                   s0   | j r|d| j dI d H  t |I d H S )NrU   )r    rT   )rn   r   stream_response)r   r9   r   r   r   ro      s   z"_StreamingResponse.stream_response)rf   NNNN)r[   r	   rZ   rg   r\   rh   ri   rj   rk   rl   rT   rm   r   r6   )r9   r   r   r6   )r-   r.   r/   r   ro   r1   r   r   r   r   r]      s    r]   )!
__future__r   typingrD   Z	anyio.abcr   r   Zstarlette._utilsr   Zstarlette.backgroundr   Zstarlette.requestsr   r   Zstarlette.responsesr	   r
   r   Zstarlette.typesr   r   r   r   r   Callable	Awaitablerd   ZDispatchFunctionTypeVarr   r   r2   r]   r   r   r   r   <module>   s"    
Ki