a
    é´«jàD  ã                   @   sð   d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZmZmZmZmZ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ZdZdZd	Ze d
e e¡ ¡Ze d¡Z e d¡Z!e d¡Z"G dd„ dƒZ#G dd„ de#ƒZ$dS )é    N)ÚChunkedReaderÚLengthReaderÚ	EOFReaderÚBody)
ÚInvalidHeaderÚInvalidHeaderNameÚ
NoMoreDataÚInvalidRequestLineÚInvalidRequestMethodÚInvalidHTTPVersionÚLimitRequestLineÚLimitRequestHeadersÚUnsupportedTransferCodingÚObsoleteFolding)ÚInvalidProxyLineÚForbiddenProxyRequest)ÚInvalidSchemeHeaders)Úbytes_to_strÚsplit_request_uriiþ  i €  z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]c                   @   s>   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ ZdS )ÚMessagec                 C   sÂ   || _ || _|| _|| _d | _g | _g | _d | _|jr:dnd| _	d| _
|j| _| jdksb| jtkrht| _|j| _| jdk r€t| _| jpˆt}| j|d  d | _|  | j¡}| j |¡ |  ¡  d S )NÚhttpsÚhttpFr   é   é   )ÚcfgÚunreaderÚ	peer_addrÚremote_addrÚversionÚheadersZtrailersÚbodyZis_sslÚschemeÚ
must_closeÚlimit_request_fieldsÚMAX_HEADERSÚlimit_request_field_sizeÚDEFAULT_MAX_HEADERFIELD_SIZEÚmax_buffer_headersÚparseÚunreadÚset_body_reader)Úselfr   r   r   Zmax_header_field_sizeZunused© r,   úT/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/gunicorn/http/message.pyÚ__init__"   s6    
ÿ

ÿÿzMessage.__init__c                 C   s
   d| _ d S )NT)r"   ©r+   r,   r,   r-   Úforce_close@   s    zMessage.force_closec                 C   s
   t ƒ ‚d S ©N)ÚNotImplementedError)r+   r   r,   r,   r-   r(   C   s    zMessage.parseFc                 C   s^  | j }g }dd„ | d¡D ƒ}d}i }g }|r0n2d|jv sVt| jtƒrV| jd |jv rb|j}|j}|�rZt|ƒ| j	kr~t
dƒ‚| d¡}	t|	ƒtdƒ }
|	 d	¡dkr®t|	ƒ‚|	 d	d
¡\}}| j jrÐ| d¡}t |¡sât|ƒ‚| ¡ }| d¡g}|�rt|d  d¡�rt| j j�st|ƒ‚| d¡}	|
t|	ƒtdƒ 7 }
|
| j  k�rVdk�rbn nt
dƒ‚| |	 d¡¡ qöd |¡}t |¡�r’t|ƒ‚|
| j  k�r¬dk�r¸n nt
dƒ‚||v �r ||| k}|�rØdnd}|�rö|| jk�r tƒ ‚n
d}|| _d|v �rJ||v �sJd|v �r n*| j jdk�r0n| j jdk�rBqbnt|ƒ‚| ||f¡ qb|S )Nc                 S   s   g | ]}t |ƒ‘qS r,   ©r   )Ú.0Úliner,   r,   r-   Ú
<listcomp>K   ó    z)Message.parse_headers.<locals>.<listcomp>ó   
FÚ*r   zlimit request headers fieldsz
ú:é   ú 	)ú ú	z!limit request headers fields sizez	 r=   r   r   TÚ_Z	dangerousZdrop) r   ÚsplitZforwarded_allow_ipsÚ
isinstancer   ÚtupleÚsecure_scheme_headersÚforwarder_headersÚlenr#   r   ÚpopÚfindr   Zstrip_header_spacesÚrstripÚTOKEN_REÚ	fullmatchr   ÚupperÚstripÚ
startswithZpermit_obsolete_foldingr   r%   ÚappendÚjoinÚ!RFC9110_5_5_INVALID_AND_DANGEROUSÚsearchr!   r   Z
header_map)r+   ÚdataÚfrom_trailerr   r   ÚlinesZscheme_headerrC   rD   ÚcurrÚheader_lengthÚnameÚvalueÚsecurer!   r,   r,   r-   Úparse_headersF   sx    

ÿþ







zMessage.parse_headersc                 C   s¤  d}d }| j D ]¾\}}|dkr8|d ur2td| d�‚|}q|dkrdd„ | d¡D ƒ}|D ]r}| ¡ dkr~|rxtd| d�‚d	}qX| ¡ d
krœ|rÊtd| d�‚qX| ¡ dv rÂ|r¸td| d�‚|  ¡  qXt|ƒ‚qXq|�r| jdk rêtd| d�‚|d urþtd| d�‚tt| | j	ƒƒ| _
nŽ|d u�r�z(t|ƒ ¡ �r6t|ƒ}ntd| d�‚W n  t�yd   td| d�‚Y n0 |dk �r|td| d�‚tt| j	|ƒƒ| _
ntt| j	ƒƒ| _
d S )NFzCONTENT-LENGTH)ÚreqzTRANSFER-ENCODINGc                 S   s   g | ]}|  ¡ ‘qS r,   )rL   )r4   Úvr,   r,   r-   r6   µ   r7   z+Message.set_body_reader.<locals>.<listcomp>ú,ÚchunkedTÚidentity)ÚcompressÚdeflateÚgzip)r;   r;   r   )r   r   r@   Úlowerr0   r   r   r   r   r   r    ÚstrÚ	isnumericÚintÚ
ValueErrorr   r   )r+   r^   Úcontent_lengthrW   rX   ÚvalsÚvalr,   r,   r-   r*   ©   sN    




zMessage.set_body_readerc                 C   sZ   | j r
dS | jD ]>\}}|dkr| ¡  d¡}|dkr< dS |dkrJ dS  qPq| jdkS )NTZ
CONNECTIONr<   Úclosez
keep-aliveF©r;   r   )r"   r   rc   rL   r   )r+   Úhr\   r,   r,   r-   Úshould_closeå   s    zMessage.should_closeN)F)	Ú__name__Ú
__module__Ú__qualname__r.   r0   r(   rZ   r*   rn   r,   r,   r,   r-   r   !   s   
c<r   c                       sf   e Zd Zd‡ fdd„	Zddd„Zdd„ Zdd
d„Zdd„ Zdd„ Zdd„ Z	dd„ Z
‡ fdd„Z‡  ZS )ÚRequestr;   c                    s`   d | _ d | _d | _d | _d | _|j| _| jdk s:| jtkr@t| _|| _d | _t	ƒ  
|||¡ d S ©Nr   )ÚmethodÚuriÚpathÚqueryÚfragmentÚlimit_request_lineÚMAX_REQUEST_LINEÚ
req_numberÚproxy_protocol_infoÚsuperr.   )r+   r   r   r   r{   ©Ú	__class__r,   r-   r.   ô   s    
ÿzRequest.__init__Fc                 C   s0   |  ¡ }|s"|rtƒ ‚t| ¡ ƒ‚| |¡ d S r1   )ÚreadÚStopIterationr   ÚgetvalueÚwrite)r+   r   ÚbufÚstoprR   r,   r,   r-   Úget_data  s    zRequest.get_datac           	      C   sB  t  ¡ }| j||dd� |  ||| j¡\}}|  t|ƒ¡r`t  ¡ }| |¡ |  ||| j¡\}}|  |¡ t  ¡ }| |¡ | 	¡ }| 
d¡}|d d… dk}| 
d¡}|d d… dk}|dk rô|sô|  ||¡ | 	¡ }t|ƒ| jkròtdƒ‚qžqôqž|�r| j |dd … ¡ dS | j|d |… d	d
�| _||d d … }d }|S )NT)r…   s   

r   r8   r   zmax buffer headersr7   F)rS   r   )ÚioÚBytesIOr†   Ú	read_linery   Úproxy_protocolr   rƒ   Úparse_request_liner‚   rG   rE   r'   r   r   r)   rZ   r   )	r+   r   r„   r5   ZrbufrR   ÚidxÚdoneÚretr,   r,   r-   r(     s8    





zRequest.parser   c                 C   sž   |  ¡ }| d¡}|dkr>||  kr.dkr‚n q‚t||ƒ‚q‚t|ƒd |  krZdkrln ntt|ƒ|ƒ‚|  ||¡ |  ¡ }q|d |… ||d d … fS )Nr8   r   r   )r‚   rG   r   rE   r†   )r+   r   r„   ÚlimitrR   rŒ   r,   r,   r-   r‰   :  s    

 

ÿzRequest.read_linec                 C   s>   | j jsdS | jdkrdS | d¡s(dS |  ¡  |  |¡ dS )z¬        Detect, check and parse proxy protocol.

        :raises: ForbiddenProxyRequest, InvalidProxyLine.
        :return: True for proxy protocol line else False
        Fr;   ZPROXYT)r   rŠ   r{   rM   Úproxy_protocol_access_checkÚparse_proxy_protocol)r+   r5   r,   r,   r-   rŠ   L  s    


zRequest.proxy_protocolc                 C   s<   d| j jvr8t| jtƒr8| jd | j jvr8t| jd ƒ‚d S )Nr9   r   )r   Zproxy_allow_ipsrA   r   rB   r   r/   r,   r,   r-   r�   a  s    
ÿþz#Request.proxy_protocol_access_checkc                 C   sj  |  d¡}t|ƒdkrt|ƒ‚|d }|d }|d }|dvrJtd| ƒ‚|dkr�z t tj|¡ t tj|¡ W qÔ tyŒ   t|ƒ‚Y qÔ0 nD|d	krÔz t tj|¡ t tj|¡ W n tyÒ   t|ƒ‚Y n0 zt|d
 ƒ}t|d ƒ}W n  t	�y   td| ƒ‚Y n0 d|  k�r*dk�rHn nd|  k�rFdk�sTn td| ƒ‚|||||dœ| _
d S )Nr=   é   r;   r   é   )ÚTCP4ÚTCP6zprotocol '%s' not supportedr”   r•   r   é   zinvalid port %sr   iÿÿ  )rŠ   Úclient_addrZclient_portZ
proxy_addrZ
proxy_port)r@   rE   r   ÚsocketÚ	inet_ptonÚAF_INETÚOSErrorÚAF_INET6rf   rg   r|   )r+   r5   ÚbitsÚprotoZs_addrZd_addrZs_portZd_portr,   r,   r-   r‘   h  sB    
6ûzRequest.parse_proxy_protocolc                 C   sš  dd„ |  dd¡D ƒ}t|ƒdkr.tt|ƒƒ‚|d | _| jjs~t | j¡rVt	| jƒ‚dt|d ƒ  krrdks~n t	| jƒ‚t
 | j¡s”t	| jƒ‚| jjr¨| j ¡ | _|d | _t| jƒdkrÌtt|ƒƒ‚zt| jƒ}W n tyø   tt|ƒƒ‚Y n0 |j�pd	| _|j�pd	| _|j�p d	| _t |d ¡}|d u �rHt|d ƒ‚t| d¡ƒt| d¡ƒf| _d
| j  k�r€dk �s–n | jj�s–t| jƒ‚d S )Nc                 S   s   g | ]}t |ƒ‘qS r,   r3   )r4   Úbitr,   r,   r-   r6   –  r7   z.Request.parse_request_line.<locals>.<listcomp>ó    r   r“   r   é   r;   Ú rl   )r   r   )r@   rE   r	   r   rt   r   Z!permit_unconventional_http_methodÚMETHOD_BADCHAR_RErQ   r
   rI   rJ   Zcasefold_http_methodrK   ru   r   rg   rv   rw   rx   Ú
VERSION_REr   rf   Úgroupr   Z"permit_unconventional_http_version)r+   Z
line_bytesr�   ÚpartsÚmatchr,   r,   r-   r‹   •  s<    







zRequest.parse_request_linec                    s.   t ƒ  ¡  t| jjtƒr*tt| jdƒƒ| _d S rs   )	r}   r*   rA   r    Úreaderr   r   r   r   r/   r~   r,   r-   r*   Ì  s    
zRequest.set_body_reader)r;   )F)r   )ro   rp   rq   r.   r†   r(   r‰   rŠ   r�   r‘   r‹   r*   Ú__classcell__r,   r,   r~   r-   rr   ó   s   
-
-7rr   )%r‡   Úrer˜   Zgunicorn.http.bodyr   r   r   r   Zgunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   Zgunicorn.utilr   r   rz   r$   r&   ZRFC9110_5_6_2_TOKEN_SPECIALSÚcompileÚescaperI   r£   r¤   rP   r   rr   r,   r,   r,   r-   Ú<module>   s$   0


 S