o
    [h                     @   s~   d dl Z d dlZ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mZmZmZmZ G dd deZG dd	 d	ZdS )
    N)run_in_threadpool)Request)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSendc                   @   s2   e Zd Zd	dededdfddZdefddZdS )
HTTPExceptionNstatus_codedetailreturnc                 C   s$   |d u r
t |j}|| _|| _d S N)http
HTTPStatusphraser   r   )selfr   r    r   {/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/starlette/exceptions.py__init__   s   
zHTTPException.__init__c                 C   s"   | j j}| d| jd| jdS )Nz(status_code=z	, detail=))	__class____name__r   r   )r   
class_namer   r   r   __repr__   s   zHTTPException.__repr__r   )r   
__module____qualname__intstrr   r   r   r   r   r   r      s    r   c                	   @   s   e Zd Z	ddedededdfddZd	eje	ej
e f d
ejddfddZdedejej 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 )ExceptionMiddlewareNFapphandlersdebugr   c                 C   sL   || _ || _i | _t| ji| _|d ur"| D ]\}}| || qd S d S r   )r!   r#   _status_handlersr   http_exception_exception_handlersitemsadd_exception_handler)r   r!   r"   r#   keyvaluer   r   r   r      s   zExceptionMiddleware.__init__exc_class_or_status_codehandlerc                 C   s4   t |tr|| j|< d S t|tsJ || j|< d S r   )
isinstancer   r$   
issubclass	Exceptionr&   )r   r+   r,   r   r   r   r(   %   s   
z)ExceptionMiddleware.add_exception_handlerexcc                 C   s,   t |jD ]}|| jv r| j|   S qd S r   )type__mro__r&   )r   r0   clsr   r   r   _lookup_exception_handler0   s
   
z-ExceptionMiddleware._lookup_exception_handlerscopereceivesendc           
   
      s  |d dkr|  ||I d H  d S d dtdd f fdd}z|  |||I d H  W d S  ty } zTd }t|trD| j|j}|d u rM| |}|d u rT|d  r]d}t	||t
||d	}t|rq|||I d H }	n	t|||I d H }	|	|||I d H  W Y d }~d S d }~ww )
Nr1   r   Fmessager   c                    s$   | d dkr	d | I d H  d S )Nr1   zhttp.response.startTr   )r8   Zresponse_startedr7   r   r   sender?   s   z,ExceptionMiddleware.__call__.<locals>.senderz7Caught handled exception, but response already started.)r6   )r!   r   r/   r-   r   r$   getr   r4   RuntimeErrorr   asyncioiscoroutinefunctionr   )
r   r5   r6   r7   r:   r0   r,   msgrequestresponser   r9   r   __call__8   s4   



 zExceptionMiddleware.__call__r@   c                 C   s(   |j dv rtd|j dS t|j|j dS )N>   i0         )r   )r   r   r   r   )r   r@   r0   r   r   r   r%   _   s   
z"ExceptionMiddleware.http_exception)NF)r   r   r   r   dictboolr   typingUnionr   Typer/   Callabler(   Optionalr4   r	   r   r
   rB   r   r   r   r%   r   r   r   r   r       s2    



'r    )r=   r   rG   Zstarlette.concurrencyr   Zstarlette.requestsr   Zstarlette.responsesr   r   Zstarlette.typesr   r   r   r	   r
   r/   r   r    r   r   r   r   <module>   s    