o
    ùT·j  ã                   @  s¾   d dl mZ d dlm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mZmZ dZdZG d	d
„ d
ƒZeƒ ZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZddd„ZdS )é    )Úannotations)Úcast)ÚHeaders)ÚHTTPException)ÚPlainTextResponse)ÚASGIAppÚMessageÚReceiveÚScopeÚSendzstarlette.max_body_sizezstarlette._body_limit_responderc                   @  s   e Zd ZdZdS )Ú_Missing© N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   úb/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/starlette/middleware/body_limit.pyr      s    r   c                      s   e Zd Zd‡ fdd„Z‡  ZS )Ú_RequestBodyTooLargeÚreturnÚNonec                   s   t ƒ jddd� d S )Né�  úContent Too Large)Ústatus_codeÚdetail)ÚsuperÚ__init__©Úself©Ú	__class__r   r   r      s   z_RequestBodyTooLarge.__init__)r   r   )r   r   r   r   Ú__classcell__r   r   r   r   r      s    r   c                   @  s   e Zd ZdS )Ú_RequestBodyLimitResponseSentN)r   r   r   r   r   r   r   r!      s    r!   c                   @  s$   e Zd ZdZddd	„Zddd„ZdS )ÚRequestBodyLimitMiddlewarez-Limit the total size of an HTTP request body.Úappr   Úmax_body_sizeÚintr   r   c                 C  s   || _ || _d S ©N)r#   r$   ©r   r#   r$   r   r   r   r   !   s   
z#RequestBodyLimitMiddleware.__init__Úscoper
   Úreceiver	   Úsendr   c                 Ã  sF   �|d dkr|   |||¡I d H S t| j | jƒ}||||ƒI d H  d S )NÚtypeÚhttp)r#   ÚRequestBodyLimitResponderr$   )r   r(   r)   r*   Ú	responderr   r   r   Ú__call__%   s
   €z#RequestBodyLimitMiddleware.__call__N©r#   r   r$   r%   r   r   ©r(   r
   r)   r	   r*   r   r   r   )r   r   r   Ú__doc__r   r/   r   r   r   r   r"      s    
r"   c                   @  s^   e Zd Zddd„Zedd
d„ƒZed dd„ƒZed!dd„ƒZd"dd„Zd#dd„Z	d$dd„Z
dS )%r-   r#   r   r$   r%   r   r   c                 C  s4   || _ || _d | _d | _d | _d | _d| _d| _d S )Nr   F)r#   r$   Ú_scopeÚ_receiveÚ_sendÚcontent_lengthÚ
total_sizeÚresponse_startedr'   r   r   r   r   .   s   
z"RequestBodyLimitResponder.__init__r
   c                 C  ó   | j d usJ ‚| j S r&   )r3   r   r   r   r   r(   8   ó   zRequestBodyLimitResponder.scoper	   c                 C  r9   r&   )r4   r   r   r   r   r)   =   r:   z!RequestBodyLimitResponder.receiver   c                 C  r9   r&   )r5   r   r   r   r   r*   B   r:   zRequestBodyLimitResponder.sendr(   r)   r*   c              
   Ã  sX  �t ttB | tt¡ƒ}| j|t< t td B | t¡ƒ}|d ur5| j|_|j	|jkr+t
‚|  |||¡I d H S || _|| _|| _t|ƒ| _| |t< zMz|  || j| j¡I d H  W n$ t
yr   | jra‚ tddd�}||||ƒI d H  Y n	 tyz   Y nw W | td ¡ t|tƒr�| td ¡ d S ||t< d S | td ¡ t|tƒr§| td ¡ w ||t< w )Nr   r   ©r   )r   r%   r   ÚgetÚMAX_BODY_SIZE_SCOPE_KEYÚ_MISSINGr$   r-   Ú_BODY_LIMIT_RESPONDER_SCOPE_KEYr7   r   r#   r3   r4   r5   Ú_get_content_lengthr6   Úreceive_with_limitÚsend_with_limitr8   r   r!   ÚpopÚ
isinstance)r   r(   r)   r*   Úprevious_scope_limitÚactive_responderÚresponser   r   r   r/   G   sB   €

ÿ€
ü
z"RequestBodyLimitResponder.__call__r   c                 Ã  sd   �| j d ur| j | jkrt‚|  ¡ I d H }|d dkr0|  jt| dd¡ƒ7  _| j| jkr0t‚|S )Nr+   zhttp.requestÚbodyó    )r6   r$   r   r)   r7   Úlenr<   )r   Úmessager   r   r   rA   h   s   €z,RequestBodyLimitResponder.receive_with_limitrK   c                 Ã  sf   �|d dkr)d| _ | jd ur)| j| jkr)tddd�}|| j| j| jƒI d H  t‚|  |¡I d H  d S )Nr+   zhttp.response.startTr   r   r;   )r8   r6   r$   r   r(   r)   r*   r!   )r   rK   rG   r   r   r   rB   s   s   €z)RequestBodyLimitResponder.send_with_limitNr0   )r   r
   )r   r	   )r   r   r1   )r   r   )rK   r   r   r   )r   r   r   r   Úpropertyr(   r)   r*   r/   rA   rB   r   r   r   r   r-   -   s    



!r-   r(   r
   r   ú
int | Nonec                 C  s<   t | d� d¡}|d u rd S zt|ƒW S  ty   Y d S w )N)r(   zcontent-length)r   r<   r%   Ú
ValueError)r(   r6   r   r   r   r@   }   s   
ÿr@   N)r(   r
   r   rM   )Ú
__future__r   Útypingr   Ústarlette.datastructuresr   Ústarlette.exceptionsr   Ústarlette.responsesr   Ústarlette.typesr   r   r	   r
   r   r=   r?   r   r>   r   Ú	Exceptionr!   r"   r-   r@   r   r   r   r   Ú<module>   s    P