o
    ^~#g#                     @  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
mZ d dl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)ClientDisconnectRequest)AsyncContentStreamResponse)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stream_wrapped_rc_stream)selfr   r   	__class__ ~/var/www/static.ux5.de/https/Moving-Object-Detection-with-OpenCV/env/lib/python3.10/site-packages/starlette/middleware/base.pyr      s   z_CachedRequest.__init__returnr   c                   s   | j rddiS | jr0| jrd| _ ddiS |  I d H }|d dkr+td|d  d| _ |S t| dd d urBd| _d| jddS | jrNd| _dd	ddS z|  }|	 I d H }| j| _d|| j dW S  t
yv   d| _ ddi Y S w )
Ntypehttp.disconnectTzUnexpected message received: _bodyzhttp.requestFr   body	more_body    )r   r   _is_disconnectedr   RuntimeErrorgetattrr!   _stream_consumedr   	__anext__r   )r   msgr   chunkr   r   r   wrapped_receive    sH   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)r5   r6   dispatch_func)r   r5   r6   r   r   r   r   _   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 r9   )cancel_scopecancel)r>   result
task_groupr   r   wrapx   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)rE   message)response_sentr-   rC   r   receive_or_disconnectr   s   (
zMBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnectr8   c                     s     I d H     d S r9   )rJ   closer   )recv_streamrL   r   r   "close_recv_stream_on_response_sent   s   zZBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.close_recv_stream_on_response_sentrK   c                   s0   z  | I d H  W d S  tjy   Y d S w r9   )r;   rG   BrokenResourceError)rK   )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 r9   )r5   	Exception)exc)app_excrM   r   r   rS   rR   r   r   coro   s   .z<BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.coroinfor   http.response.debugzNo response returned.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   http.response.bodyr#   r%   r$   F)get)rK   r#   )rV   rO   r   r   body_stream   s   (	zCBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.body_streamstatus)status_codecontentrX   headersr.   )r   r8   )rK   r   r   r8   )r   r[   )	rG   create_memory_object_streamrI   r   r]   EndOfStreamr'   _StreamingResponseraw_headers)r=   rP   rW   rK   rX   r^   responserL   r   r   rD   r-   )rV   rM   rO   rS   rR   r   	call_nextl   s2   
	

z.BaseHTTPMiddleware.__call__.<locals>.call_next)r=   r   r   r	   )	r5   r   r-   rG   Eventr   rH   r:   set)r   r   r   r;   r=   ri   rg   r   rh   r   __call__c   s"   
M
*"zBaseHTTPMiddleware.__call__r=   r   ri   RequestResponseEndpointr	   c                   s   t  r9   )NotImplementedError)r   r=   ri   r   r   r   r6      s   zBaseHTTPMiddleware.dispatchr9   )r5   r
   r6   r7   r   r8   r   r   r   r   r;   r   r   r8   )r=   r   ri   rm   r   r	   )r/   r0   r1   r   rl   r6   r   r   r   r   r4   ^   s    
\r4   c                   @  s*   e Zd Z				ddddZdddZdS )re      Nra   r   r`   intrb   typing.Mapping[str, str] | None
media_type
str | NonerX   &typing.Mapping[str, typing.Any] | Noner   r8   c                 C  s,   || _ || _|| _|| _| | d | _d S r9   )rX   body_iteratorr`   rs   init_headers
background)r   ra   r`   rb   rs   rX   r   r   r   r      s   

z_StreamingResponse.__init__r   r   r   r   r;   r   c                   s   | j d ur|d| j dI d H  |d| j| jdI d H  | j2 z3 d H W }|d|ddI d H  q!6 |ddd	dI d H  | jrK|  I d H  d S d S )
NrY   )r   rX   rZ   )r   r_   rb   r\   Tr"   r%   F)rX   r`   rf   rv   rx   )r   r   r   r;   r,   r   r   r   rl      s    

z_StreamingResponse.__call__)rp   NNN)ra   r   r`   rq   rb   rr   rs   rt   rX   ru   r   r8   ro   )r/   r0   r1   r   rl   r   r   r   r   re      s    re   )
__future__r   typingrG   	anyio.abcr   r   starlette._utilsr   starlette.requestsr   r   starlette.responsesr   r	   starlette.typesr
   r   r   r   r   Callable	Awaitablerm   DispatchFunctionTypeVarr   r   r4   re   r   r   r   r   <module>   s    
Le