o
    Þ­j  ã                   @  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	   Úhandlerú8typing.Callable[[Request, Exception], typing.Any] | NoneÚdebugÚboolÚreturnÚNonec                 C  s   || _ || _|| _d S ©N)r   r   r   )Úselfr   r   r   © r   úX/var/www/html/CropPilot/venv/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    ©Ú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/   r0   Ú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   )r:   r2   r+   )Ú.0r+   r-   ©r;   r   r   r   Ú	<genexpr>Ê   s   € úü
ÿz<ServerErrorMiddleware.generate_frame_html.<locals>.<genexpr>Ú	collapsedú+z&#8210;)Úframe_filenamer/   Ú
frame_nameÚcode_contextrB   Úcollapse_buttonr   )
ÚjoinÚ	enumeraterF   r3   r4   Úfilenamer2   ÚfunctionÚFRAME_TEMPLATEr7   )r   r;   r=   rF   r9   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ÚreversedrM   r3   r4   Úexc_typeÚ__name__r.   ÚTEMPLATEr7   ÚSTYLESÚJS)
r   r'   rO   Útraceback_objrT   r=   Úexc_tracebackÚframesr;   rS   r   r   r   Úgenerate_htmlâ   s    ÿÿÿz#ServerErrorMiddleware.generate_htmlc                 C  s   d  t t|ƒ||j¡¡S )Nr>   )rH   rU   Úformat_exceptionr   rX   )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Úgetrd   r   rf   r   )r   r(   r'   rg   Úcontentr   r   r   r%   û   s   

z$ServerErrorMiddleware.debug_responsec                 C  s   t ddd�S )NzInternal Server Errorrh   ri   )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,   r0   r,   r   r.   )r;   r<   r=   r   r   r.   )rN   )r'   r$   rO   r,   r   r.   )r'   r$   r   r.   )r(   r   r'   r$   r   r   )r]   Ú
__module__Ú__qualname__Ú__doc__r   r*   r:   rM   rd   rf   r%   r&   r   r   r   r   r      s    ü


'


	r   )Ú
__future__r   r3   rY   rU   ÚtypingÚstarlette._utilsr   Ústarlette.concurrencyr   Ústarlette.requestsr   Ústarlette.responsesr   r   r   Ústarlette.typesr	   r
   r   r   r   r_   r`   r^   rL   r6   r8   r   r   r   r   r   Ú<module>   s"    6