o
    ix_                     @   sH  d dl mZ d dlZ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mZ d dlmZmZmZ d dlmZ d dlmZmZ dZG d	d
 d
eZG dd deZ G dd deZ!dZ"dZ#dZ$dZ%e&de'e% Z(e&dZ)e&dZ*e&dZ+dd Z,G dd dZ-G dd de-Z.dS )    )IntEnumN)ChunkedReaderLengthReader	EOFReaderBody)InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeadersUnsupportedTransferCodingObsoleteFoldingExpectationFailed)InvalidProxyLineInvalidProxyHeaderForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_uris   

 
QUIT
c                   @   s   e Zd ZdZdZdZdS )	PPCommandzPROXY protocol v2 commands.r      N)__name__
__module____qualname____doc__LOCALPROXY r    r    I/home/ubuntu/.local/lib/python3.10/site-packages/gunicorn/http/message.pyr      s    r   c                   @   s    e Zd ZdZdZdZdZdZdS )PPFamilyz#PROXY protocol v2 address families.r   r         N)r   r   r   r   UNSPECINETINET6UNIXr    r    r    r!   r"   "   s    r"   c                   @   s   e Zd ZdZdZdZdZdS )
PPProtocolz&PROXY protocol v2 transport protocols.r   r   r#   N)r   r   r   r   r%   STREAMDGRAMr    r    r    r!   r)   *   s
    r)   i  i   z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]c                 C   sL   d|v rdS zt | }W n
 ty   Y dS w |D ]	}||v r# dS qdS )zCheck if IP address is in the allow list.

    Args:
        ip_str: The IP address string to check
        allow_list: The original allow list (strings, may contain "*")
        networks: Pre-computed ipaddress.ip_network objects from config
    *TF)	ipaddress
ip_address
ValueError)ip_str
allow_listnetworksipnetworkr    r    r!   _ip_in_allow_list>   s   r5   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| _
d| _|j| _| jdks4| jtkr7t| _|j| _| jdk rCt| _| jpGt}| j|d  d | _| | j}| j| |   d S )NhttpshttpFr   r#      )cfgunreader	peer_addrremote_addrversionheaderstrailersbodyis_sslscheme
must_close_expected_100_continue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unusedr    r    r!   __init__S   s6   



zMessage.__init__c                 C   s
   d| _ d S )NT)rD   rN   r    r    r!   force_closer   s   
zMessage.force_closec                 C   s   t  N)NotImplementedError)rN   r;   r    r    r!   rK   u   s   zMessage.parseFc                 C   s  | j }g }dd |dD }d}i }g }|rnt| jtr*t| jd |j| r0|j}|j	}|rBt
|| jkr>td|d}	t
|	t
d }
|	ddkrVt|	|	dd	\}}| j jrg|d
}t|spt|| }|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 |s|dkr| dkr| j dk rnd| _!nt"|||v r||| k}|rdnd}|r|| j#krt$ nd}|| _#d|v r9||v s$d|v r%n| j j%dkr-n| j j%dkr5q0t||||f |s3|S )Nc                 S      g | ]}t |qS r    r   ).0liner    r    r!   
<listcomp>}       z)Message.parse_headers.<locals>.<listcomp>   
Fr   zlimit request headers fieldsz
:r    	) 	z!limit request headers fields sizez	 r_   EXPECTz100-continuer   r   Tr7   r8   _r,   	dangerousdrop)&r:   split
isinstancer<   tupler5   forwarded_allow_ipsforwarded_allow_networkssecure_scheme_headersforwarder_headerslenrF   r   popfindr   strip_header_spacesrstripTOKEN_RE	fullmatchr   upperstrip
startswithpermit_obsolete_foldingr   rH   appendjoin!RFC9110_5_5_INVALID_AND_DANGEROUSsearchlowerr>   rE   r   rC   r   
header_map)rN   datafrom_trailerr:   r?   linesscheme_headerrk   rl   currheader_lengthnamevaluesecurerC   r    r    r!   parse_headersx   s   









Yz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    )ru   )rX   vr    r    r!   rZ      r[   z+Message.set_body_reader.<locals>.<listcomp>,chunkedTidentity)compressdeflategziprb   r   )r?   r   rf   r|   rS   r   r>   r   r   r;   rA   str	isnumericintr/   r   r   )rN   r   content_lengthr   r   valsvalr    r    r!   rM      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
CONNECTIONr^   closez
keep-aliveFr   r   )rD   r?   r|   ru   r>   )rN   hr   r    r    r!   should_close&  s   
zMessage.should_closeNF)	r   r   r   rQ   rS   rK   r   rM   r   r    r    r    r!   r6   R   s    
r<r6   c                       s   e Zd Zd fdd	ZdddZdd Zdd	d
ZdddZdd Z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superrQ   )rN   r:   r;   r<   r   	__class__r    r!   rQ   5  s   

zRequest.__init__Fc                 C   s0   |  }|s|rt t| || d S rT   )readStopIterationr	   getvaluewriterN   r;   bufstopr~   r    r    r!   get_dataF  s   zRequest.get_datac           	      C   s  t  }| j||dd | jj}|dkr| jdkr| |||}| ||| j\}}| | t	|}|d d dk}	 |
d}|d d dk}|dk rd|sd| || t	|}t|| jkrctd	nnq;|rt| j|dd   d
S | j|d | dd| _||d d  }|S )NT)r   offr   r#   r\   s   

r   zmax buffer headers    F)r   r9   )	bytearray	read_intor:   proxy_protocolr   _handle_proxy_protocol	read_liner   parse_request_linebytesro   rm   rJ   r   r;   rL   r   r?   )	rN   r;   r   moderY   r~   doneidxretr    r    r!   rK   N  s4   

zRequest.parsec                 C   s0   |  }|s|rt tt||| dS )z7Read data from unreader and append to bytearray buffer.N)r   r   r	   r   extendr   r    r    r!   r   u  s   zRequest.read_intor   c                 C   s   t |}	 |d}|dkr ||  krdkrn nt||n"t|d |  kr.dkr7n ntt||| || t |}q|d| t||d d fS )z<Read a line from buffer, returning (line, remaining_buffer).Tr\   r   r#   N)r   ro   r   rm   r   r   )rN   r;   r   limitr~   r   r    r    r!   r   ~  s   

 
zRequest.read_linec                 C   sD   t ||k r| || t ||k st|d| t||d fS )z.Read exactly count bytes from buffer/unreader.N)rm   r   r   r   )rN   r;   r   countr    r    r!   
read_bytes  s    zRequest.read_bytesc                 C   s   t |dk r| || t |dk s|dv r(|dd tkr(|   | ||S |dv r>|dd dkr>|   | ||S |S )ztHandle PROXY protocol detection and parsing.

        Returns the buffer with proxy protocol data consumed.
           )v2autoN)v1r      s   PROXY )rm   r   PP_V2_SIGNATUREproxy_protocol_access_check_parse_proxy_protocol_v2_parse_proxy_protocol_v1)rN   r;   r   r   r    r    r!   r     s   zRequest._handle_proxy_protocolc                 C   s>   t | jtrt| jd | jj| j st| jd dS dS )z2Check if proxy protocol is allowed from this peer.r   N)rg   r<   rh   r5   r:   proxy_allow_ipsproxy_allow_networksr   rR   r    r    r!   r     s   z#Request.proxy_protocol_access_checkc                 C   s  t |}d|vr| || t |}d|vs|d}t|d| }t||d d }|d}t|dkr<t||d }|d }	|d }
|dvrRtd	| |d
krrzt	tj
|	 t	tj
|
 W n+ tyq   t|w |dkrzt	tj|	 t	tj|
 W n ty   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| _|S )z`Parse PROXY protocol v1 (text format).

        Returns buffer with v1 header consumed.
        r\   Nr#   r_   r   r   r$   )TCP4TCP6zprotocol '%s' not supportedr   r   r9      zinvalid port %sr   i  r   client_addrclient_port
proxy_addr
proxy_port)r   r   ro   r   r   rf   rm   r   socket	inet_ptonAF_INETOSErrorAF_INET6r   r/   r   )rN   r;   r   r~   r   rY   	remainingbitsprotos_addrd_addrs_portd_portr    r    r!   r     sZ   

.z Request._parse_proxy_protocol_v1c                 C   s|  t |dk r| || t |dk s|d }|d }tdt|dd d }|d@ d? }|d	kr8td
| |d@ }|tjtjfvrJtd| d| }t ||k r`| || t ||k sT|tjkrvdddddd| _	t
||d S |d@ d? }	|d@ }
|
tjkrtdt|dd|  }|	tjkr|dk rtdttj|dd }ttj|dd }td|dd d }td|dd d }d}n\|	tjkr|dk rtdttj|dd }ttj|dd }td|dd d }td|dd d }d}n|	tjkr'dddddd| _	t
||d S td|	 |||||d| _	t
||d S )zbParse PROXY protocol v2 (binary format).

        Returns buffer with v2 header consumed.
           r      z>H   r      r9   r#   zunsupported version %d   zunsupported command %dr   Nr   zonly TCP protocol is supportedz"insufficient address data for IPv4   
   r   $   z"insufficient address data for IPv6    "   r   r%   zunsupported address family %d)rm   r   structunpackr   r   r   r   r   r   r   r)   r*   r"   r&   r   	inet_ntopr   r'   r   r%   )rN   r;   r   ver_cmd	fam_protolengthr>   commandtotal_header_sizefamilyprotocol	addr_datar   r   r   r   r   r    r    r!   r     sz   


z Request._parse_proxy_protocol_v2c                 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   rV   r    rW   )rX   bitr    r    r!   rZ   O  r[   z.Request.parse_request_line.<locals>.<listcomp>    r#   r$   r      r    r   )r#   r   )rf   rm   r
   r   r   r:   !permit_unconventional_http_methodMETHOD_BADCHAR_REr{   r   rr   rs   casefold_http_methodrt   r   r   r/   r   r   r   
VERSION_REr   r   groupr>   "permit_unconventional_http_version)rN   
line_bytesr   partsmatchr    r    r!   r   N  sB   






zRequest.parse_request_linec                    s2   t    t| jjtrtt| jd| _d S d S r   )	r   rM   rg   rA   readerr   r   r   r;   rR   r   r    r!   rM     s   
zRequest.set_body_reader)r   r   )r   )r   r   r   rQ   r   rK   r   r   r   r   r   r   r   r   rM   __classcell__r    r    r   r!   r   4  s    

'
	=]7r   )/enumr   r-   rer   r   gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   gunicorn.utilr   r   r   r   r"   r)   r   rG   rI   RFC9110_5_6_2_TOKEN_SPECIALScompileescaperr   r   r   rz   r5   r6   r   r    r    r    r!   <module>   s4   4


 c