a
     d                      @   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 u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   h/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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$J || j|< d S r   )
isinstanceintr   
issubclass	Exceptionr   )r   r!   r"   r   r   r   r   "   s    
z)ExceptionMiddleware.add_exception_handler)excr   c                 C   s,   t |jD ]}|| jv 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              
      st  |d dvr$|  ||I d H  d S d td d fdd}z|  |||I d H  W n tyn } zd }t|tr| j|j}|d u r| |}|d u 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rZt||d}
t|rH||
|I d H  nt||
|I d H  W Y d }~n
d }~0 0 d S )Nr(   )http	websocketF)messager   c                    s"   | d dkrd | I d H  d S )Nr(   zhttp.response.startTr   )r1   Zresponse_startedr.   r   r   sender<   s    z,ExceptionMiddleware.__call__.<locals>.senderz7Caught handled exception, but response already started.r/   )r-   r0   )r-   r.   )r   r
   r&   r#   r   r   getstatus_coder+   RuntimeErrorr   r   r   r   )r   r,   r-   r.   r3   r'   r"   msgrequestresponser0   r   r2   r   __call__5   s:    



zExceptionMiddleware.__call__)r8   r'   r   c                 C   s.   |j dv rt|j |jdS t|j|j |jdS )N>   i0     )r5   headers)r5   r   r<   r   Zdetail)r   r8   r'   r   r   r   r   c   s
    
z"ExceptionMiddleware.http_exception)r0   r'   r   c                    s   |j |j|jdI d H  d S )N)codereason)closer=   r>   )r   r0   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   )rC   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   