a
    ,Me.                     @   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rbt| _
|j| _| jdk rzt| _| jpt}| j
|d  d | _| | j}| j| |   d S )Nhttpshttpr         )cfgunreader	peer_addrremote_addrversionheadersZtrailersbodyZ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   Zmax_header_field_sizeZunused r)   D/var/www/webapp/lib/python3.9/site-packages/gunicorn/http/message.py__init__   s4    


zMessage.__init__c                 C   s
   t  d S 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 sLt| jtrL| jd |jv rR|j}|rt|| jkrnt	d|
d}t|}|ddk rt| |dd	\}	}
| j jr|	d
 }	n|	 }	t|	rt|	|	 |
 g }	}
|rN|d drN|
d}|t|7 }|| j  kr6dkrBn nt	d|
| qd|
 }
|| j  krvdkrn nt	d|	|v r|
||	 k}|rdnd}|r|| jkrt n
d}|| _||	|
f qR|S )Nc                 S   s   g | ]}t |d  qS )z
r   ).0liner)   r)   r*   
<listcomp>C       z)Message.parse_headers.<locals>.<listcomp>   
F*r   zlimit request headers fields:   z 	) 	z!limit request headers fields size r   r   T)r   splitZforwarded_allow_ips
isinstancer   tuplesecure_scheme_headerslenr    r   popfindr   stripZstrip_header_spacesrstripupper	HEADER_REsearchr   lstrip
startswithr"   appendjoinr   r   )r(   datar   r   linesZscheme_headerr=   currheader_lengthnamevaluesecurer   r)   r)   r*   parse_headers>   sX    





zMessage.parse_headersc                 C   s   d}d }| j D ]B\}}|dkr8|d ur2td| d|}q|dkr| dkrd}q|rjtt| | j| _n|d urz&t| rt	|}ntd| dW n t
y   td| dY n0 |dk rtd| dtt| j|| _ntt| j| _d S )NFzCONTENT-LENGTH)reqzTRANSFER-ENCODINGchunkedTr   )r   r   lowerr   r   r   r   str	isnumericint
ValueErrorr   r   )r(   rS   content_lengthrN   rO   r)   r)   r*   r'   }   s.    
zMessage.set_body_readerc                 C   sN   | j D ]<\}}|dkr|  }|dkr0 dS |dkr> dS  qDq| jdkS )NZ
CONNECTIONcloseTz
keep-aliveF)r6   r   )r   rT   rA   r   )r(   hvr)   r)   r*   should_close   s    zMessage.should_closeN)__name__
__module____qualname__r+   r%   rQ   r'   r]   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 )Requestr6   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   rj   	__class__r)   r*   r+      s    
zRequest.__init__Fc                 C   s0   |  }|s"|rt t| || d S r,   )readStopIterationr   getvaluewrite)r(   r   bufstoprJ   r)   r)   r*   get_data   s    zRequest.get_datac           	      C   s>  t  }| j||dd | ||| j\}}| t|r`t  }|| | ||| j\}}| | t  }|| |	 }|
d}|d d dk}|
d}|d d dk}|dk r|s| || |	 }t|| jkrtdqqq|r| j|dd   dS | |d | | _||d	 d  }d }|S )
NT)rt   s   

r   r3   r   zmax buffer headersr2   r   )ioBytesIOru   	read_linerh   proxy_protocolr   rr   parse_request_linerq   r@   r>   r$   r   r   r&   rQ   r   )	r(   r   rs   r0   ZrbufrJ   idxdoneretr)   r)   r*   r%      s8    





zRequest.parser   c                 C   s   |  }|d}|dkr>||  kr.dkrn qt||qt|d |  krZdkrln ntt||| || |  }q|d | ||d d  fS )Nr3   r   r   )rq   r@   r   r>   ru   )r(   r   rs   limitrJ   r{   r)   r)   r*   rx      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
        Fr6   ZPROXYT)r   ry   rj   rG   proxy_protocol_access_checkparse_proxy_protocol)r(   r0   r)   r)   r*   ry     s    


zRequest.proxy_protocolc                 C   s<   d| j jvr8t| jtr8| jd | j jvr8t| jd d S )Nr4   r   )r   Zproxy_allow_ipsr;   r   r<   r   r(   r)   r)   r*   r     s    
z#Request.proxy_protocol_access_checkc                 C   sl  |  }t|dkrt||d }|d }|d }|dvrHtd| |dkrz ttj| ttj| W q tjy   t|Y q0 nF|dkrz ttj| ttj| W n tjy   t|Y n0 zt|d	 }t|d
 }W n  t	y   td| Y n0 d|  kr,dkrJn nd|  krHdksVn td| |||||d| _
d S )N   r6   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )ry   client_addrZclient_portZ
proxy_addrZ
proxy_port)r:   r>   r   socket	inet_ptonAF_INETerrorAF_INET6rW   rX   rk   )r(   r0   bitsprotoZs_addrZd_addrZs_portZd_portr)   r)   r*   r     sB    6zRequest.parse_proxy_protocolc                 C   s   dd | d dD }t|dkr.tt|t|d sHt|d |d  | _|d | _	zt
| j	}W n ty   tt|Y n0 |jpd| _|jpd| _|jpd| _t|d }|d u rt|d t|dt|df| _d S )Nc                 S   s   g | ]}t |qS r)   r.   )r/   bitr)   r)   r*   r1   K  r2   z.Request.parse_request_line.<locals>.<listcomp>r   r   r   r6   r9   )r:   r>   r	   r   METH_REmatchr
   rC   rc   rd   r   rX   re   rf   rg   
VERSION_REr   rW   groupr   )r(   Z
line_bytesr   partsr   r)   r)   r*   rz   J  s$    
zRequest.parse_request_linec                    s.   t    t| jjtr*tt| jd| _d S rb   )	rl   r'   r;   r   readerr   r   r   r   r   rm   r)   r*   r'   e  s    
zRequest.set_body_reader)r6   )F)r   )r^   r_   r`   r+   ru   r%   rx   ry   r   r   rz   r'   __classcell__r)   r)   rm   r*   ra      s   
-
-ra   )!rv   rer   Zgunicorn.http.bodyr   r   r   r   Zgunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   Zgunicorn.utilr   r   ri   r!   r#   compilerD   r   r   objectr   ra   r)   r)   r)   r*   <module>   s    (


 