o
    g.                     @   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 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ed	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)InvalidProxyLineForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_urii  i   z%[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\"]z[A-Z0-9$-_.]{3,20}zHTTP/(\d+)\.(\d+)c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )Messagec                 C   s   || _ || _|| _|| _d | _g | _g | _d | _|jrdnd| _	|j
| _
| j
dks.| j
tkr1t| _
|j| _| jdk r=t| _| jpAt}| j
|d  d | _| | j}| j| |   d S )Nhttpshttpr         )cfgunreader	peer_addrremote_addrversionheaderstrailersbodyis_sslscheme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-   L/var/www/html/gwz/venv/lib/python3.10/site-packages/gunicorn/http/message.py__init__   s2   



zMessage.__init__c                 C   s   t  N)NotImplementedError)r*   r   r-   r-   r.   r'   ;   s   zMessage.parsec                 C   s  | j }g }dd |dD }d}i }d|jv s&t| jtr&| jd |jv r)|j}|rt|| jkr6t	d|
d}t|}|ddk rLt| |dd	\}	}
| j jr`|	d
 }	n|	 }	t|	rmt|	|	 |
 g}	}
|r|d dr|
d}|t|7 }|| j  krdkrt	d |
| |r|d dsd|
 }
|| j  krdkrt	d |	|v r|
||	 k}|rdnd}|r|| jkrt nd}|| _||	|
f |s+|S )Nc                 S   s   g | ]}t |d  qS )z
r   ).0liner-   r-   r.   
<listcomp>C   s    z)Message.parse_headers.<locals>.<listcomp>   
F*r   zlimit request headers fields:   z 	) 	z!limit request headers fields size r   r   T)r   splitforwarded_allow_ips
isinstancer   tuplesecure_scheme_headerslenr"   r   popfindr   stripstrip_header_spacesrstripupper	HEADER_REsearchr   lstrip
startswithr$   appendjoinr!   r   )r*   datar   r   linesscheme_headerrA   currheader_lengthnamevaluesecurer!   r-   r-   r.   parse_headers>   s`   






,zMessage.parse_headersc                 C   s   d}d }| j D ]!\}}|dkr|d urtd| d|}q|dkr(| dkr(d}q|r6tt| | j| _d S |d urpzt| rFt	|}ntd| dW n t
yZ   td| dw |dk retd| dtt| j|| _d S tt| j| _d S )NFzCONTENT-LENGTH)reqzTRANSFER-ENCODINGchunkedTr   )r   r   lowerr   r   r   r   str	isnumericint
ValueErrorr   r   )r*   rY   content_lengthrT   rU   r-   r-   r.   r)   }   s4   
zMessage.set_body_readerc                 C   sN   | j D ]\}}|dkr!|  }|dkr dS |dkr dS  nq| jdkS )N
CONNECTIONcloseTz
keep-aliveF)r9   r   )r   rZ   rE   r   )r*   hvr-   r-   r.   should_close   s   
zMessage.should_closeN)__name__
__module____qualname__r/   r'   rW   r)   rd   r-   r-   r-   r.   r      s    ?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 )Requestr9   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   rq   	__class__r-   r.   r/      s   

zRequest.__init__Fc                 C   s0   |  }|s|rt t| || d S r0   )readStopIterationr   getvaluewrite)r*   r   bufstoprO   r-   r-   r.   get_data   s   zRequest.get_datac           	      C   s>  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 | |d | | _||d	 d  }d }|S )
NT)r{   s   

r   r6   r   zmax buffer headers    r   )ioBytesIOr|   	read_linero   proxy_protocolr   ry   parse_request_linerx   rD   rB   r&   r   r   r(   rW   r   )	r*   r   rz   r4   rbufrO   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 )NTr6   r   r   )rx   rD   r   rB   r|   )r*   r   rz   limitrO   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
        Fr9   PROXYT)r   r   rq   rL   proxy_protocol_access_checkparse_proxy_protocol)r*   r4   r-   r-   r.   r     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 )Nr7   r   )r   proxy_allow_ipsr?   r   r@   r   r*   r-   r-   r.   r     s   
z#Request.proxy_protocol_access_checkc                 C   sT  |  }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jyD   t|w |dkrfzttj| ttj| W n tjye   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 )N   r9   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrclient_port
proxy_addr
proxy_port)r=   rB   r   socket	inet_ptonAF_INETerrorAF_INET6r]   r^   rr   )r*   r4   bitsprotos_addrd_addrs_portd_portr-   r-   r.   r     sH   .zRequest.parse_proxy_protocolc                 C   s   dd | d dD }t|dkrtt|t|d s$t|d |d  | _|d | _	zt
| j	}W n tyD   tt|w |jpId| _|jpOd| _|jpUd| _t|d }|d u rht|d t|dt|df| _d S )Nc                 S   s   g | ]}t |qS r-   r2   )r3   bitr-   r-   r.   r5   K  s    z.Request.parse_request_line.<locals>.<listcomp>r   r   r   r9   r<   )r=   rB   r	   r   METH_REmatchr
   rH   rj   rk   r   r^   rl   rm   rn   
VERSION_REr   r]   groupr   )r*   
line_bytesr   partsr   r-   r-   r.   r   J  s&   
"zRequest.parse_request_linec                    s2   t    t| jjtrtt| jd| _d S d S ri   )	rs   r)   r?   r   readerr   r   r   r   r   rt   r-   r.   r)   e  s   
zRequest.set_body_reader)r9   )F)r   )re   rf   rg   r/   r|   r'   r   r   r   r   r   r)   __classcell__r-   r-   rt   r.   rh      s    

--rh   )!r~   rer   gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   gunicorn.utilr   r   rp   r#   r%   compilerI   r   r   objectr   rh   r-   r-   r-   r.   <module>   s"   (


 