o
    ߭h["                     @   s   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 )    N)ObjectReceiveStreamObjectSendStream)collapse_excgroups)BackgroundTask)ClientDisconnectRequest)ContentStreamResponseStreamingResponse)ASGIAppMessageReceiveScopeSendTc                       s8   e Zd ZdZdedef fddZdef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.
    scopereceivec                    s(   t  || d| _d| _|  | _d S )NF)super__init___wrapped_rcv_disconnected_wrapped_rcv_consumedstream_wrapped_rc_stream)selfr   r   	__class__ ^/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/starlette/middleware/base.pyr      s   z_CachedRequest.__init__returnc                    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   _is_disconnectedr   RuntimeErrorgetattrr"   _stream_consumedr   	__anext__r   )r   msgr   chunkr   r   r   wrapped_receive!   sF   z_CachedRequest.wrapped_receive)
__name__
__module____qualname____doc__r   r   r   r   r-   __classcell__r   r   r   r   r      s    r   c                   @   s\   e Zd Z	ddedeje ddfddZdede	d	e
ddfd
dZdededefddZdS )BaseHTTPMiddlewareNappdispatchr   c                 C   s$   || _ |d u r| j| _d S || _d S N)r4   r5   dispatch_func)r   r4   r5   r   r   r   r   _   s   zBaseHTTPMiddleware.__init__r   r   sendc              
      s   d dkr ||I d H  d S t|}|jt  dtdtf 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 saw   Y  W d    d S W d    d S 1 syw   Y  d S )Nr    httprequestr   c                    s.  d  t  \dtf	fdddfdd}dtdd ffddd fd	d
}| | z  I d H }|dd }|d dkr[|d ur[ I d H }W n t jyn    d urj tdw |d dkswJ dtj	t
d f f fdd}t|d | |d}|d |_|S )Nr   c               	      s     r	ddiS t 4 I d H , dtjg tjt f dtf fdd}  | j | I d H }W d   I d H  n1 I d H sCw   Y    rPddiS |S )Nr    r!   funcr   c                    s   |  I d H } j   |S r6   )cancel_scopecancel)r;   result
task_groupr   r   wrapz   s   
z[BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnect.<locals>.wrap)	is_setanyiocreate_task_grouptypingCallable	Awaitabler   
start_soonwait)rA   message)response_sentr-   r?   r   receive_or_disconnectt   s   &(
zMBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnectc                      s     I d H     d S r6   )rI   closer   )recv_streamrK   r   r   "close_recv_stream_on_response_sent   s   zZBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.close_recv_stream_on_response_sentrJ   c                    s0   z  | I d H  W d S  tjy   Y d S w r6   )r8   rC   BrokenResourceError)rJ   )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 r6   )r4   	Exception)exc)app_excrL   r   r   rR   rQ   r   r   coro   s   .z<BaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.coroinfor    http.response.debugzNo response returned.zhttp.response.startc               	     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)rJ   r#   )rU   rN   r   r   body_stream   s   (	zCBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.body_streamstatus)status_codecontentrW   headers)r   N)rC   create_memory_object_streamr   rH   r   rY   EndOfStreamr'   rE   AsyncGeneratorbytes_StreamingResponseraw_headers)r:   rO   rV   rJ   rW   rZ   responserK   r   r   r@   r-   )rU   rL   rN   rR   rQ   r   	call_nextn   s6   
	

z.BaseHTTPMiddleware.__call__.<locals>.call_next)r4   r   r-   rC   Eventr   r	   r   rD   r7   set)r   r   r   r8   r:   rg   re   r   rf   r   __call__e   s"   
O
*"zBaseHTTPMiddleware.__call__r:   rg   c                    s   t  r6   )NotImplementedError)r   r:   rg   r   r   r   r5      s   zBaseHTTPMiddleware.dispatchr6   )r.   r/   r0   r   rE   OptionalDispatchFunctionr   r   r   r   rj   r   RequestResponseEndpointr	   r5   r   r   r   r   r3   ^   s"    
^r3   c                       s   e Zd Z					ddededejejeef  deje deje	 dejejeej
f  d	df fd
dZded	df fddZ  ZS )rc      Nr]   r\   r^   
media_type
backgroundrW   r   c                    s   || _ t ||||| d S r6   )_infor   r   )r   r]   r\   r^   rp   rq   rW   r   r   r   r      s   	z_StreamingResponse.__init__r8   c                    s0   | j r|d| j dI d H  t |I d H S )NrX   )r    rW   )rr   r   stream_response)r   r8   r   r   r   rs      s   z"_StreamingResponse.stream_response)ro   NNNN)r.   r/   r0   r   intrE   rl   Mappingstrr   Anyr   r   rs   r2   r   r   r   r   rc      s,    rc   )rE   rC   	anyio.abcr   r   starlette._utilsr   starlette.backgroundr   starlette.requestsr   r   starlette.responsesr   r	   r
   starlette.typesr   r   r   r   r   rF   rG   rn   rm   TypeVarr   r   r3   rc   r   r   r   r   <module>   s     
Kk