o
    Þ­j5"  ã                   @  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ÚstreamÚ_wrapped_rc_stream)Úselfr   r   ©Ú	__class__© úV/var/www/html/CropPilot/venv/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   Ú_is_disconnectedr   ÚRuntimeErrorÚgetattrr#   Ú_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)r6   r7   Údispatch_func)r   r6   r7   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 r:   )Ú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)rF   Úmessage)Úresponse_sentr.   rD   r   Úreceive_or_disconnectt   s   €(ø
zMBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.receive_or_disconnectr9   c                   “  s   �ˆ  ¡ I d H  ˆ  ¡  d S r:   )rK   Úcloser   )Úrecv_streamrM   r   r   Ú"close_recv_stream_on_response_sent‡   s   €zZBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.close_recv_stream_on_response_sentrL   c                 “  s0   �zˆ   | ¡I d H  W d S  tjy   Y d S w r:   )r<   rH   ÚBrokenResourceError)rL   )Ú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 r:   )r6   Ú	Exception)Úexc)Úapp_excrN   r   r   rT   rS   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)rL   r$   )rW   rP   r   r   Úbody_streamª   s   €ÿû(ÿ	ÿzCBaseHTTPMiddleware.__call__.<locals>.call_next.<locals>.body_streamÚstatus)Ústatus_codeÚcontentrY   Úheadersr/   )r    r9   )rL   r   r    r9   )r    r[   )	rH   Úcreate_memory_object_streamrJ   r   r\   ÚEndOfStreamr(   Ú_StreamingResponseÚraw_headers)r>   rQ   rX   rL   rY   r]   Úresponse©rM   r   r   rE   r.   )rW   rN   rP   rT   rS   r   Ú	call_nextn   s6   €
	
€ýÿ
z.BaseHTTPMiddleware.__call__.<locals>.call_next)r>   r   r    r
   )	r6   r   r.   rH   ÚEventr   rI   r;   Úset)r   r   r   r<   r>   rh   rf   r   rg   r   Ú__call__e   s"   €
O
*ýÿ"ÿzBaseHTTPMiddleware.__call__r>   r   rh   ÚRequestResponseEndpointr
   c                 Ã  s   �t ƒ ‚r:   )ÚNotImplementedError)r   r>   rh   r   r   r   r7   Ã   s   €zBaseHTTPMiddleware.dispatchr:   )r6   r   r7   r8   r    r9   )r   r   r   r   r<   r   r    r9   )r>   r   rh   rl   r    r
   )r0   r1   r2   r   rk   r7   r   r   r   r   r5   `   s    
^r5   c                      s8   e Zd Z					dd‡ fdd„Zd‡ fdd„Z‡  ZS )rd   éÈ   Nr`   r	   r_   Úintra   útyping.Mapping[str, str] | NoneÚ
media_typeú
str | NoneÚ
backgroundúBackgroundTask | NonerY   ú&typing.Mapping[str, typing.Any] | Noner    r9   c                   s   || _ tƒ  |||||¡ d S r:   )Ú_infor   r   )r   r`   r_   ra   rq   rs   rY   r   r   r   r   Ê   s   	z_StreamingResponse.__init__r<   r   c                 ƒ  s0   �| j r|d| j dœƒI d H  tƒ  |¡I d H S )NrZ   )r!   rY   )rv   r   Ústream_response)r   r<   r   r   r   rw   Ö   s   €z"_StreamingResponse.stream_response)rn   NNNN)r`   r	   r_   ro   ra   rp   rq   rr   rs   rt   rY   ru   r    r9   )r<   r   r    r9   )r0   r1   r2   r   rw   r4   r   r   r   r   rd   É   s    ùrd   )!Ú
__future__r   ÚtypingrH   Ú	anyio.abcr   r   Ústarlette._utilsr   Ústarlette.backgroundr   Ústarlette.requestsr   r   Ústarlette.responsesr	   r
   r   Ústarlette.typesr   r   r   r   r   ÚCallableÚ	Awaitablerl   ÚDispatchFunctionÚTypeVarr   r   r5   rd   r   r   r   r   Ú<module>   s"    ÿ
Ki