o
    sZhD                     @   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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,   D/var/www/auris/lib/python3.10/site-packages/gunicorn/http/message.py__init__"   s4   



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  N)NotImplementedError)r+   r   r,   r,   r-   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st||d}	|
t|	td 7 }
|
| j  krdkrt
d ||	d |r|d dsd|}t|rt||
| j  krdkrt
d ||v r||| k}|rdnd}|r|| jkrt 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 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_headerrD   rE   currheader_lengthnamevaluesecurer!   r,   r,   r-   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rzt| rt|}ntd| dW n ty   td| dw |dk rtd| dtt| j	|| _
d S tt| j	| _
d S )NFzCONTENT-LENGTH)reqzTRANSFER-ENCODINGc                 S   s   g | ]}|  qS r,   )rM   )r5   vr,   r,   r-   r7      r8   z+Message.set_body_reader.<locals>.<listcomp>,chunkedTidentity)compressdeflategzip)r<   r<   r   )r   r   rA   lowerr0   r   r   r   r   r   r    str	isnumericint
ValueErrorr   r   )r+   r_   content_lengthrX   rY   valsvalr,   r,   r-   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 )NTZ
CONNECTIONr=   closez
keep-aliveFr<   r   )r"   r   rd   rM   r   )r+   hr]   r,   r,   r-   should_close   s   
zMessage.should_closeNF)	__name__
__module____qualname__r.   r0   r(   r[   r*   ro   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stoprS   r,   r,   r-   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   r9   r   zmax buffer headers    F)rT   r   )ioBytesIOr   	read_liner{   proxy_protocolr   r   parse_request_liner   rH   rF   r'   r   r   r)   r[   r   )	r+   r   r   r6   ZrbufrS   idxdoneretr,   r,   r-   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 )NTr9   r   r   )r   rH   r   rF   r   )r+   r   r   limitrS   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}   rN   proxy_protocol_access_checkparse_proxy_protocol)r+   r6   r,   r,   r-   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   Zproxy_allow_ipsrB   r   rC   r   r/   r,   r,   r-   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rdkrn nd|  krdksn 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)rA   rF   r   socket	inet_ptonAF_INETOSErrorAF_INET6rg   rh   r~   )r+   r6   bitsprotoZs_addrZd_addrZs_portZd_portr,   r,   r-   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pd	| _|jpd	| _t|d }|d u rt|d t|dt|df| _d
| j  krdk sn | jjst| jd S d S )Nc                 S   r3   r,   r4   )r5   bitr,   r,   r-   r7     r8   z.Request.parse_request_line.<locals>.<listcomp>    r   r   r      r<    rm   )r   r   )rA   rF   r	   r   rv   r   Z!permit_unconventional_http_methodMETHOD_BADCHAR_RErR   r
   rJ   rK   Zcasefold_http_methodrL   rw   r   rh   rx   ry   rz   
VERSION_REr   rg   groupr   Z"permit_unconventional_http_version)r+   Z
line_bytesr   partsmatchr,   r,   r-   r     sB   






zRequest.parse_request_linec                    s2   t    t| jjtrtt| jd| _d S d S ru   )	r   r*   rB   r    readerr   r   r   r   r/   r   r,   r-   r*     s   
zRequest.set_body_reader)r<   rp   )r   )rq   rr   rs   r.   r   r(   r   r   r   r   r   r*   __classcell__r,   r,   r   r-   rt      s    

--7rt   )%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   r|   r$   r&   ZRFC9110_5_6_2_TOKEN_SPECIALScompileescaperJ   r   r   rQ   r   rt   r,   r,   r,   r-   <module>   s&   0


 S