o
    tf                     @  s   d dl mZ d dlZ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 d dlmZmZmZ d dlmZmZmZmZmZ dZd	Zd
ZdZdZdZG dd dZdS )    )annotationsN)is_async_callable)run_in_threadpool)Request)HTMLResponsePlainTextResponseResponse)ASGIAppMessageReceiveScopeSenda  
p {
    color: #211c1c;
}
.traceback-container {
    border: 1px solid #038BB8;
}
.traceback-title {
    background-color: #038BB8;
    color: lemonchiffon;
    padding: 12px;
    font-size: 20px;
    margin-top: 0px;
}
.frame-line {
    padding-left: 10px;
    font-family: monospace;
}
.frame-filename {
    font-family: monospace;
}
.center-line {
    background-color: #038BB8;
    color: #f9f6e1;
    padding: 5px 0px 5px 5px;
}
.lineno {
    margin-right: 5px;
}
.frame-title {
    font-weight: unset;
    padding: 10px 10px 10px 10px;
    background-color: #E4F4FD;
    margin-right: 10px;
    color: #191f21;
    font-size: 17px;
    border: 1px solid #c7dce8;
}
.collapse-btn {
    float: right;
    padding: 0px 5px 1px 5px;
    border: solid 1px #96aebb;
    cursor: pointer;
}
.collapsed {
  display: none;
}
.source-code {
  font-family: courier;
  font-size: small;
  padding-bottom: 10px;
}
a  
<script type="text/javascript">
    function collapse(element){
        const frameId = element.getAttribute("data-frame-id");
        const frame = document.getElementById(frameId);

        if (frame.classList.contains("collapsed")){
            element.innerHTML = "&#8210;";
            frame.classList.remove("collapsed");
        } else {
            element.innerHTML = "+";
            frame.classList.add("collapsed");
        }
    }
</script>
a  
<html>
    <head>
        <style type='text/css'>
            {styles}
        </style>
        <title>Starlette Debugger</title>
    </head>
    <body>
        <h1>500 Server Error</h1>
        <h2>{error}</h2>
        <div class="traceback-container">
            <p class="traceback-title">Traceback</p>
            <div>{exc_html}</div>
        </div>
        {js}
    </body>
</html>
a  
<div>
    <p class="frame-title">File <span class="frame-filename">{frame_filename}</span>,
    line <i>{frame_lineno}</i>,
    in <b>{frame_name}</b>
    <span class="collapse-btn" data-frame-id="{frame_filename}-{frame_lineno}" onclick="collapse(this)">{collapse_button}</span>
    </p>
    <div id="{frame_filename}-{frame_lineno}" class="source-code {collapsed}">{code_context}</div>
</div>
zV
<p><span class="frame-line">
<span class="lineno">{lineno}.</span> {line}</span></p>
zv
<p class="center-line"><span class="frame-line center-line">
<span class="lineno">{lineno}.</span> {line}</span></p>
c                   @  sh   e Zd ZdZ		d2d3ddZd4ddZd5ddZd6d!d"Zd7d8d'd(Zd9d)d*Z	d:d.d/Z
d:d0d1ZdS );ServerErrorMiddlewareaz  
    Handles returning 500 responses when a server error occurs.

    If 'debug' is set, then traceback responses will be returned,
    otherwise the designated 'handler' will be called.

    This middleware class should generally be used to wrap *everything*
    else up, so that unhandled exceptions anywhere in the stack
    always result in an appropriate 500 response.
    NFappr	   handler8typing.Callable[[Request, Exception], typing.Any] | NonedebugboolreturnNonec                 C  s   || _ || _|| _d S N)r   r   r   )selfr   r   r    r   d/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/starlette/middleware/errors.py__init__   s   
zServerErrorMiddleware.__init__scoper   receiver   sendr   c              
     s   |d dkr|  ||I d H  d S d d
 fdd	}z|  |||I d H  W d S  tyv } z@t|}| jr@| ||}n%| jd u rL| ||}nt| jr[| ||I d H }n
t| j||I d H } sp|||I d H  |d }~ww )NtypehttpFmessager
   r   r   c                   s$   | d dkr	d | I d H  d S )Nr   zhttp.response.startTr   )r    Zresponse_startedr   r   r   _send   s   z-ServerErrorMiddleware.__call__.<locals>._send)r    r
   r   r   )	r   	Exceptionr   r   debug_responser   error_responser   r   )r   r   r   r   r"   excrequestresponser   r!   r   __call__   s,   

zServerErrorMiddleware.__call__indexintlinestrframe_linenoframe_indexc                 C  sH   t |dd|| | d}||krtjdi |S tjdi |S )N z&nbsp)r,   linenor   )htmlescapereplaceLINEformatCENTER_LINE)r   r*   r,   r.   r/   valuesr   r   r   format_line   s   
z!ServerErrorMiddleware.format_lineframeinspect.FrameInfois_collapsedc                   sh   d  fddt jpg D }t j jt j||r#dnd|r(dndd}tj	di |S )	N c                 3  s(    | ]\}} || j jV  qd S r   )r9   r1   r*   ).0r*   r,   r:   r   r   r   	<genexpr>   s    
z<ServerErrorMiddleware.generate_frame_html.<locals>.<genexpr>	collapsed+z&#8210;)frame_filenamer.   Z
frame_namecode_contextrA   Zcollapse_buttonr   )
join	enumeraterD   r2   r3   filenamer1   functionFRAME_TEMPLATEr6   )r   r:   r<   rD   r8   r   r?   r   generate_frame_html   s   



z)ServerErrorMiddleware.generate_frame_html   r&   r#   limitc           
      C  s   t jj|dd}d}d}|j}|d ur*t||}t|D ]}|| ||7 }d}qt	|j
j dt	t| }	tjtt|	|dS )NT)capture_localsr=   Fz: )stylesjserrorexc_html)	tracebackTracebackExceptionfrom_exception__traceback__inspectgetinnerframesreversedrJ   r2   r3   exc_type__name__r-   TEMPLATEr6   STYLESJS)
r   r&   rL   Ztraceback_objrQ   r<   exc_tracebackframesr:   rP   r   r   r   generate_html   s    z#ServerErrorMiddleware.generate_htmlc                 C  s   d tt|||jS )Nr=   )rE   rR   format_exceptionr   rU   )r   r&   r   r   r   generate_plain_text   s   z)ServerErrorMiddleware.generate_plain_textr'   r   r   c                 C  sB   |j dd}d|v r| |}t|ddS | |}t|ddS )Nacceptr=   z	text/html  status_code)headersgetr`   r   rb   r   )r   r'   r&   rc   contentr   r   r   r$      s   

z$ServerErrorMiddleware.debug_responsec                 C  s   t dddS )NzInternal Server Errorrd   re   )r   )r   r'   r&   r   r   r   r%     s   z$ServerErrorMiddleware.error_response)NF)r   r	   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )
r*   r+   r,   r-   r.   r+   r/   r+   r   r-   )r:   r;   r<   r   r   r-   )rK   )r&   r#   rL   r+   r   r-   )r&   r#   r   r-   )r'   r   r&   r#   r   r   )rZ   
__module____qualname____doc__r   r)   r9   rJ   r`   rb   r$   r%   r   r   r   r   r      s    


'


	r   )
__future__r   r2   rV   rR   typingZstarlette._utilsr   Zstarlette.concurrencyr   Zstarlette.requestsr   Zstarlette.responsesr   r   r   Zstarlette.typesr	   r
   r   r   r   r\   r]   r[   rI   r5   r7   r   r   r   r   r   <module>   s"    6