U
    nËjç
  ã                   @  sŠ   d dl mZ d dlZd dlmZmZ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 d dlmZ G d	d
„ d
ƒZdS )é    )ÚannotationsN)ÚExceptionHandlersÚStatusHandlersÚwrap_app_handling_exceptions)ÚHTTPExceptionÚWebSocketException)ÚRequest)ÚPlainTextResponseÚResponse)ÚASGIAppÚReceiveÚScopeÚSend)Ú	WebSocketc                   @  sl   e Zd Zddddddœdd	„Zd
dddœdd„Zdddddœdd„Zddddœdd„Zddddœdd„ZdS ) ÚExceptionMiddlewareNFr   zRtyping.Mapping[typing.Any, typing.Callable[[Request, Exception], Response]] | NoneÚboolÚNone)Ú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!   úC/tmp/pip-unpacked-wheel-pzfrzqh9/starlette/middleware/exceptions.pyÚ__init__   s      þzExceptionMiddleware.__init__zint | type[Exception]z/typing.Callable[[Request, Exception], Response])Ú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_handlerr   r   r   )ÚscopeÚreceiveÚsendr   c                 Ã  sx   |d dkr$|   |||¡I d H  d S | j| jf|d< |d dkrNt|||ƒ}nt|||ƒ}t| j |ƒ|||ƒI d H  d S )NÚtype)ÚhttpÚ	websocketzstarlette.exception_handlersr/   )r   r   r   r   r   r   )r   r+   r,   r-   Úconnr!   r!   r"   Ú__call__.   s    þzExceptionMiddleware.__call__r   r)   r
   )ÚrequestÚexcr   c                 C  s<   t |tƒst‚|jdkr(t|j|jd�S t|j|j|jd�S )N>   é0  éÌ   )Ústatus_codeÚheaders)r&   r   r*   r7   r
   r8   r	   Zdetail)r   r3   r4   r!   r!   r"   r   @   s    
z"ExceptionMiddleware.http_exceptionr   )r0   r4   r   c                 Ã  s*   t |tƒst‚|j|j|jd�I d H  d S )N)ÚcodeÚreason)r&   r   r*   Úcloser9   r:   )r   r0   r4   r!   r!   r"   r   F   s    z'ExceptionMiddleware.websocket_exception)NF)Ú__name__Ú
__module__Ú__qualname__r#   r   r2   r   r   r!   r!   r!   r"   r      s     ür   )Ú
__future__r   ÚtypingZstarlette._exception_handlerr   r   r   Zstarlette.exceptionsr   r   Zstarlette.requestsr   Zstarlette.responsesr	   r
   Zstarlette.typesr   r   r   r   Zstarlette.websocketsr   r   r!   r!   r!   r"   Ú<module>   s   