o
    i¹«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s1| jtkr4t| _|j| _| jdk r@t| _| jpDt}| j|d  d | _|  | j¡}| j |¡ |  ¡  d S )NÚhttpsÚhttpFr   é   é   )ÚcfgÚunreaderÚ	peer_addrÚremote_addrÚversionÚheadersÚtrailersÚbodyÚ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   Úmax_header_field_sizeÚunused© r0   úU/var/www/html/laksyashrimp/venv/lib/python3.10/site-packages/gunicorn/http/message.pyÚ__init__"   s4   



ÿÿzMessage.__init__c                 C   s
   d| _ d S )NT)r$   ©r-   r0   r0   r1   Úforce_close@   s   
zMessage.force_closec                 C   s   t ƒ ‚©N)ÚNotImplementedError)r-   r   r0   r0   r1   r*   C   s   zMessage.parseFc                 C   sN  | j }g }dd„ | d¡D ƒ}d}i }g }|rnd|jv s+t| jtƒr+| jd |jv r1|j}|j}|�r%t|ƒ| j	kr?t
dƒ‚| d¡}	t|	ƒtdƒ }
|	 d	¡dkrWt|	ƒ‚|	 d	d
¡\}}| j jrh| d¡}t |¡sqt|ƒ‚| ¡ }| d¡g}|r»|d  d¡r»| j jsŒt|ƒ‚| d¡}	|
t|	ƒtdƒ 7 }
|
| j  kr©dkrªt
dƒ‚ | |	 d¡¡ |r»|d  d¡s„d |¡}t |¡rÉt|ƒ‚|
| j  kr×dkrØt
dƒ‚ ||v rø||| k}|rædnd}|ró|| jkròtƒ ‚nd}|| _d|v �r||v �sd|v �rn| j jdk�rn| j jdk�rq1t|ƒ‚| ||f¡ |s4|S )Nc                 S   ó   g | ]}t |ƒ‘qS r0   ©r   )Ú.0Úliner0   r0   r1   Ú
<listcomp>K   ó    z)Message.parse_headers.<locals>.<listcomp>ó   
FÚ*r   zlimit request headers fieldsz
ú:é   ú 	)ú ú	z!limit request headers fields sizez	 rB   r   r   TÚ_Ú	dangerousÚdrop) r   ÚsplitÚforwarded_allow_ipsÚ
isinstancer   ÚtupleÚsecure_scheme_headersÚforwarder_headersÚlenr%   r   ÚpopÚfindr   Ústrip_header_spacesÚrstripÚTOKEN_REÚ	fullmatchr   ÚupperÚstripÚ
startswithÚpermit_obsolete_foldingr   r'   ÚappendÚjoinÚ!RFC9110_5_5_INVALID_AND_DANGEROUSÚsearchr#   r   Ú
header_map)r-   ÚdataÚfrom_trailerr   r   ÚlinesÚscheme_headerrK   rL   ÚcurrÚheader_lengthÚnameÚvalueÚsecurer#   r0   r0   r1   Úparse_headersF   s€   

ÿ



ÿ÷


ÿ
ÿ
¸JzMessage.parse_headersc                 C   s˜  d}d }| j D ]^\}}|dkr|d urtd| d�‚|}q|dkredd„ | d¡D ƒ}|D ]8}| ¡ dkr?|r<td| d�‚d	}q,| ¡ d
krN|rMtd| d�‚q,| ¡ dv ra|r\td| d�‚|  ¡  q,t|ƒ‚q|rˆ| jdk rstd| d�‚|d ur}td| d�‚tt| | j	ƒƒ| _
d S |d urÂzt|ƒ ¡ r˜t|ƒ}ntd| d�‚W n ty¬   td| d�‚w |dk r·td| d�‚tt| j	|ƒƒ| _
d S tt| j	ƒƒ| _
d S )NFzCONTENT-LENGTH)ÚreqzTRANSFER-ENCODINGc                 S   s   g | ]}|  ¡ ‘qS r0   )rU   )r9   Úvr0   r0   r1   r;   µ   r<   z+Message.set_body_reader.<locals>.<listcomp>ú,ÚchunkedTÚidentity)ÚcompressÚdeflateÚgzip)r@   r@   r   )r   r   rG   Úlowerr4   r   r   r   r   r   r!   ÚstrÚ	isnumericÚintÚ
ValueErrorr   r   )r-   rj   Úcontent_lengthrc   rd   ÚvalsÚvalr0   r0   r1   r,   ©   sV   ÿ
€

þÿzMessage.set_body_readerc                 C   sZ   | j rdS | jD ]\}}|dkr'| ¡  d¡}|dkr dS |dkr% dS  nq| jdkS )NTÚ
CONNECTIONrA   Úclosez
keep-aliveF©r@   r   )r$   r   ro   rU   r   )r-   Úhrh   r0   r0   r1   Úshould_closeå   s   ú
zMessage.should_closeN©F)	Ú__name__Ú
__module__Ú__qualname__r2   r4   r*   rf   r,   r{   r0   r0   r0   r1   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Úsuperr2   )r-   r   r   r   r‰   ©Ú	__class__r0   r1   r2   ô   s   

zRequest.__init__Fc                 C   s0   |  ¡ }|s|rtƒ ‚t| ¡ ƒ‚| |¡ d S r5   )ÚreadÚStopIterationr   ÚgetvalueÚwrite)r-   r   ÚbufÚstopr]   r0   r0   r1   Úget_data  s   zRequest.get_datac           	      C   sB  t  ¡ }| j||dd� |  ||| j¡\}}|  t|ƒ¡r0t  ¡ }| |¡ |  ||| j¡\}}|  |¡ t  ¡ }| |¡ | 	¡ }| 
d¡}|d d… dk}	 | 
d¡}|d d… dk}|dk ry|sy|  ||¡ | 	¡ }t|ƒ| jkrxtdƒ‚nnqP|r‰| j |dd … ¡ dS | j|d |… d	d
�| _||d d … }d }|S )NT)r“   s   

r   r=   r   zmax buffer headersó    F)r^   r   )ÚioÚBytesIOr”   Ú	read_liner‡   Úproxy_protocolr   r‘   Úparse_request_liner�   rO   rM   r)   r   r   r+   rf   r   )	r-   r   r’   r:   Úrbufr]   ÚidxÚdoneÚretr0   r0   r1   r*     s>   




ÿözRequest.parser   c                 C   s    |  ¡ }	 | d¡}|dkr ||  krdkrn nt||ƒ‚n"t|ƒd |  kr.dkr7n ntt|ƒ|ƒ‚|  ||¡ |  ¡ }q|d |… ||d d … fS )NTr=   r   r   )r�   rO   r   rM   r”   )r-   r   r’   Úlimitr]   rœ   r0   r0   r1   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@   ÚPROXYT)r   r™   r‰   rV   Úproxy_protocol_access_checkÚparse_proxy_protocol)r-   r:   r0   r0   r1   r™   L  s   


zRequest.proxy_protocolc                 C   sD   d| j jvrt| jtƒr| jd | j jvr t| jd ƒ‚d S d S d S )Nr>   r   )r   Úproxy_allow_ipsrI   r   rJ   r   r3   r0   r0   r1   r¡   a  s   
ÿýz#Request.proxy_protocol_access_checkc                 C   sR  |  d¡}t|ƒdkrt|ƒ‚|d }|d }|d }|dvr%td| ƒ‚|dkrEzt tj|¡ t tj|¡ W n+ tyD   t|ƒ‚w |d	krezt tj|¡ t tj|¡ W n tyd   t|ƒ‚w zt|d
 ƒ}t|d ƒ}W n t	y€   td| ƒ‚w d|  kr‹dkr˜n nd|  kr—dksžn td| ƒ‚|||||dœ| _
d S )NrB   é   r@   r   é   )ÚTCP4ÚTCP6zprotocol '%s' not supportedr¦   r§   r   é   zinvalid port %sr   iÿÿ  )r™   Úclient_addrÚclient_portÚ
proxy_addrÚ
proxy_port)rG   rM   r   ÚsocketÚ	inet_ptonÚAF_INETÚOSErrorÚAF_INET6rr   rs   rŠ   )r-   r:   ÚbitsÚprotoÚs_addrÚd_addrÚs_portÚd_portr0   r0   r1   r¢   h  sH   
ÿÿÿ.ûzRequest.parse_proxy_protocolc                 C   sŒ  dd„ |  dd¡D ƒ}t|ƒdkrtt|ƒƒ‚|d | _| jjs?t | j¡r+t	| jƒ‚dt|d ƒ  kr9dks?n t	| jƒ‚t
 | j¡sJt	| jƒ‚| jjrT| j ¡ | _|d | _t| jƒdkrftt|ƒƒ‚zt| jƒ}W n tyz   tt|ƒƒ‚w |jpd	| _|jp…d	| _|jp‹d	| _t |d ¡}|d u ržt|d ƒ‚t| d¡ƒt| d¡ƒf| _d
| j  kr¸dk sÂn | jjsÄt| jƒ‚d S d S )Nc                 S   r7   r0   r8   )r9   Úbitr0   r0   r1   r;   –  r<   z.Request.parse_request_line.<locals>.<listcomp>ó    r   r¥   r   é   r@   Ú ry   )r   r   )rG   rM   r	   r   r‚   r   Ú!permit_unconventional_http_methodÚMETHOD_BADCHAR_REr[   r
   rR   rS   Úcasefold_http_methodrT   rƒ   r   rs   r„   r…   r†   Ú
VERSION_REr   rr   Úgroupr   Ú"permit_unconventional_http_version)r-   Ú
line_bytesr²   ÚpartsÚmatchr0   r0   r1   rš   •  sB   





ÿ
ýzRequest.parse_request_linec                    s2   t ƒ  ¡  t| jjtƒrtt| jdƒƒ| _d S d S r�   )	r‹   r,   rI   r!   Úreaderr   r   r   r   r3   rŒ   r0   r1   r,   Ì  s   
ÿzRequest.set_body_reader)r@   r|   )r   )r}   r~   r   r2   r”   r*   r˜   r™   r¡   r¢   rš   r,   Ú__classcell__r0   r0   rŒ   r1   r€   ó   s    

--7r€   )%r–   Úrer­   Úgunicorn.http.bodyr   r   r   r   Úgunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   Úgunicorn.utilr   r   rˆ   r&   r(   ÚRFC9110_5_6_2_TOKEN_SPECIALSÚcompileÚescaperR   r½   r¿   rZ   r   r€   r0   r0   r0   r1   Ú<module>   s&   0


 S