o
    ߤh~B                     @   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 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 G dd de!Z"G dd de"Z#dS )    N)ChunkedReaderLengthReader	EOFReaderBody)	InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeadersUnsupportedTransferCoding)InvalidProxyLineForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_urii  i   z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)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 r/   S/var/www/html/ictaz-jobs/venv/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/   r0   force_close@   s   
zMessage.force_closec                 C   s   t  N)NotImplementedError)r,   r   r/   r/   r0   r)   C   s   zMessage.parseFc                 C   s  | j }g }dd |dD }d}i }|rnd|jv s)t| jtr)| jd |jv r,|j}|rt|| jkr:t	d|
d}t|td }	|d	dkrRt||d	d
\}
}| j jrc|
d}
t|
slt|
|
 }
|dg}|r|d dr|
d}|	t|td 7 }	|	| j  krdkrt	d ||d |r|d dsd|}|	| j  krdkrt	d |
|v r|||
 k}|rdnd}|r|| jkrt nd}|| _d|
v r| j jdkrn| j jdkrq,t|
||
|f |s/|S )Nc                 S      g | ]}t |qS r/   r   ).0liner/   r/   r0   
<listcomp>K       z)Message.parse_headers.<locals>.<listcomp>   
F*r   zlimit request headers fieldsz
:    	) 	z!limit request headers fields sizez	 rA   r   r   T_	dangerousdrop)r   splitforwarded_allow_ips
isinstancer   tuplesecure_scheme_headerslenr$   r   popfindr   strip_header_spacesrstripTOKEN_RE	fullmatchr   upperlstrip
startswithr&   appendstripjoinr"   r   
header_map)r,   datafrom_trailerr   r   linesscheme_headerrJ   currheader_lengthnamevaluesecurer"   r/   r/   r0   parse_headersF   sp   







AzMessage.parse_headersc                 C   s  d}d }| j D ]T\}}|dkr|d urtd| d|}q|dkr[| dkr1|r.td| dd}q| dkr@|r?td| dq| dkrS|   | jjsRt|q|   t|q|r| jd	k rq|   | jjsqtd| d|d ur|   | jjst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-ENCODINGchunkedTidentity )r?   r?   r   )r   r   lowerr3   r   tolerate_dangerous_framingr   r   r   r   r   r    str	isnumericint
ValueErrorr   r   )r,   rd   content_lengthr_   r`   r/   r/   r0   r+      s^   

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
CONNECTIONr@   closez
keep-aliveFr?   r   )r#   r   rg   rV   r   )r,   hvr/   r/   r0   should_close   s   
zMessage.should_closeNF)	__name__
__module____qualname__r1   r3   r)   rb   r+   rs   r/   r/   r/   r0   r   !   s    
XEr   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superr1   )r,   r   r   r   r   	__class__r/   r0   r1      s   

zRequest.__init__Fc                 C   s0   |  }|s|rt t| || d S r4   )readStopIterationr   getvaluewrite)r,   r   bufstoprY   r/   r/   r0   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)rZ   r   )ioBytesIOr   	read_liner   proxy_protocolr   r   parse_request_liner   rM   rK   r(   r   r   r*   rb   r   )	r,   r   r   r9   rbufrY   idxdoneretr/   r/   r0   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   rM   r   rK   r   )r,   r   r   limitrY   r   r/   r/   r0   r   8  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   rT   proxy_protocol_access_checkparse_proxy_protocol)r,   r9   r/   r/   r0   r   J  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_ipsrH   r   rI   r   r2   r/   r/   r0   r   _  s   
z#Request.proxy_protocol_access_checkc                 C   sV  | d}t|dkrt||d }|d }|d }|dvr%td| |dkrFzttj| ttj| W n- tjyE   t|w |d	krgzttj| ttj| W n tjyf   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 )NrA      r?   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrclient_port
proxy_addr
proxy_port)rF   rK   r   socket	inet_ptonAF_INETerrorAF_INET6rk   rl   r   )r,   r9   bitsprotos_addrd_addrs_portd_portr/   r/   r0   r   f  sH   
.zRequest.parse_proxy_protocolc                 C   sr  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 | _zt| j}W n tym   tt|w |jprd	| _|jpxd	| _|jp~d	| _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   r6   r/   r7   )r8   bitr/   r/   r0   r:     r;   z.Request.parse_request_line.<locals>.<listcomp>    r   r   r      r?   rf   rp   )r   r   )rF   rK   r	   r   rz   r   !permit_unconventional_http_methodMETHOD_BADCHAR_REsearchr
   rP   rQ   casefold_http_methodrR   r{   r   rl   r|   r}   r~   
VERSION_REr   rk   groupr   "permit_unconventional_http_version)r,   
line_bytesr   partsmatchr/   r/   r0   r     s>   





zRequest.parse_request_linec                    s2   t    t| jjtrtt| jd| _d S d S ry   )	r   r+   rH   r    readerr   r   r   r   r2   r   r/   r0   r+     s   
zRequest.set_body_reader)r?   rt   )r   )ru   rv   rw   r1   r   r)   r   r   r   r   r   r+   __classcell__r/   r/   r   r0   rx      s    

--,rx   )$r   rer   gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   r   gunicorn.utilr   r   r   r%   r'   RFC9110_5_6_2_TOKEN_SPECIALScompileescaperP   r   r   objectr   rx   r/   r/   r/   r0   <module>   s$   ,

 Q