U
    &%e                      @   s   d dl Z d dlmZ d dlm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mZmZmZ d dlmZ G d	d
 d
ZdS )    N)is_async_callable)run_in_threadpool)HTTPExceptionWebSocketException)Request)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSend)	WebSocketc                   @   s   e Zd Zdeejejejeje	e
gef f  eddddZejeeje
 f eje	e
gef ddddZe
ejej d	d
dZeeeddddZe	eedddZeeddddZdS )ExceptionMiddlewareNF)apphandlersdebugreturnc                 C   sN   || _ || _i | _t| jt| ji| _|d k	rJ| D ]\}}| 	|| q4d S N)
r   r   _status_handlersr   http_exceptionr   websocket_exception_exception_handlersitemsadd_exception_handler)selfr   r   r   keyvalue r   ^/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/starlette/middleware/exceptions.py__init__   s      zExceptionMiddleware.__init__)exc_class_or_status_codehandlerr   c                 C   s2   t |tr|| j|< nt|ts$t|| j|< d S r   )
isinstanceintr   
issubclass	ExceptionAssertionErrorr   )r   r!   r"   r   r   r   r   "   s    
z)ExceptionMiddleware.add_exception_handler)excr   c                 C   s,   t |jD ]}|| jkr
| j|   S q
d S r   )type__mro__r   )r   r(   clsr   r   r   _lookup_exception_handler-   s    
z-ExceptionMiddleware._lookup_exception_handler)scopereceivesendr   c              
      sr  |d dkr$|  ||I d H  d S d td d fdd}z|  |||I d H  W n tk
rl } zd }t|tr| j|j}|d kr| |}|d kr| rd}t	|||d dkrt
||d	}t|r|||I d H }	nt|||I d H }	|	|||I d H  nJ|d d
kr\t||d}
t|rJ||
|I d H  nt||
|I d H  W 5 d }~X Y nX d S )Nr)   )http	websocketF)messager   c                    s"   | d dkrd | I d H  d S )Nr)   zhttp.response.startTr   )r2   Zresponse_startedr/   r   r   sender<   s    z,ExceptionMiddleware.__call__.<locals>.senderz7Caught handled exception, but response already started.r0   )r.   r1   )r.   r/   )r   r
   r&   r#   r   r   getstatus_coder,   RuntimeErrorr   r   r   r   )r   r-   r.   r/   r4   r(   r"   msgrequestresponser1   r   r3   r   __call__5   s:    



zExceptionMiddleware.__call__)r9   r(   r   c                 C   s.   |j dkrt|j |jdS t|j|j |jdS )N>   0     )r6   headers)r6   r   r>   r   detail)r   r9   r(   r   r   r   r   c   s    
  z"ExceptionMiddleware.http_exception)r1   r(   r   c                    s   |j |j|jdI d H  d S )N)codereason)closer@   rA   )r   r1   r(   r   r   r   r   j   s    z'ExceptionMiddleware.websocket_exception)NF)__name__
__module____qualname__r	   typingOptionalMappingAnyCallabler   r&   r   boolr    Unionr$   Typer   r,   r   r   r   r;   r   r   r   r   r   r   r   r   r   r      s.     
. r   )rF   Zstarlette._utilsr   Zstarlette.concurrencyr   Zstarlette.exceptionsr   r   Zstarlette.requestsr   Zstarlette.responsesr   r   Zstarlette.typesr	   r
   r   r   r   Zstarlette.websocketsr   r   r   r   r   r   <module>   s   