U
    �ÒËd¶.  ã                   @   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p‚t}| 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)   úN/home/sam/Atlas/atlas_env/lib/python3.8/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ksLt| jtƒrL| jd |jkrR|j}|�rÚt|ƒ| jkrnt	dƒ‚| 
d¡}t|ƒ}| d¡dk ršt| ¡ ƒ‚| dd	¡\}	}
| j jrÂ|	 d
¡ ¡ }	n|	 ¡ }	t |	¡rÜt|	ƒ‚|	 ¡ |
 ¡ g }	}
|�rN|d  d¡�rN| 
d¡}|t|ƒ7 }|| j  k�r6dk�rBn nt	dƒ‚|
 |¡ qðd |
¡ ¡ }
|| j  k�rvdk�r‚n nt	dƒ‚|	|k�rÊ|
||	 k}|�r¢dnd}|�rÀ|| jk�rÊtƒ ‚n
d}|| _| |	|
f¡ qR|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   Ú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 k	r2td| d�‚|}q|dkr| ¡ dkrd}q|rjtt| | jƒƒ| _nˆ|d k	râz&t|ƒ ¡ rŠt	|ƒ}ntd| d�‚W n  t
k
r¸   td| d�‚Y nX |dk rÎt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(   rR   Úcontent_lengthrM   rN   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)r5   r   )r   rS   r@   r   )r(   ÚhÚvr)   r)   r*   Úshould_closeœ   s    zMessage.should_closeN)Ú__name__Ú
__module__Ú__qualname__r+   r%   rP   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 )ÚRequestr5   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   ri   ©Ú	__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ÚstoprI   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ròtdƒ‚qžqôqž|�r| j |dd … ¡ dS |  |d |… ¡| _||d	 d … }d }|S )
NT)rs   s   

r   r2   r   zmax buffer headersó    r   )ÚioÚBytesIOrt   Ú	read_linerg   Úproxy_protocolr   rq   Úparse_request_linerp   r?   r=   r$   r   r   r&   rP   r   )	r(   r   rr   r0   ZrbufrI   ÚidxÚdoneÚretr)   r)   r*   r%   Â   s8    





zRequest.parser   c                 C   sž   |  ¡ }| d¡}|dkr>||  kr.dkr‚n q‚t||ƒ‚q‚t|ƒd |  krZdkrln ntt|ƒ|ƒ‚|  ||¡ |  ¡ }q|d |… ||d d … fS )Nr2   r   r   )rp   r?   r   r=   rt   )r(   r   rr   ÚlimitrI   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
        Fr5   ZPROXYT)r   ry   ri   rF   Úproxy_protocol_access_checkÚparse_proxy_protocol)r(   r0   r)   r)   r*   ry     s    


zRequest.proxy_protocolc                 C   s<   d| j jkr8t| jtƒr8| jd | j jkr8t| jd ƒ‚d S )Nr3   r   )r   Zproxy_allow_ipsr:   r   r;   r   ©r(   r)   r)   r*   r     s    
ÿþz#Request.proxy_protocol_access_checkc                 C   sr  |  ¡ }t|ƒdkrt|ƒ‚|d }|d }|d }|dkrHtd| ƒ‚|dkr’z t tj|¡ t tj|¡ W qÚ tjk
rŽ   t|ƒ‚Y qÚX nH|dkrÚz t tj|¡ t tj|¡ W n tjk
rØ   t|ƒ‚Y nX zt|d	 ƒ}t|d
 ƒ}W n" t	k
�r   td| ƒ‚Y nX d|  k�r2dk�rPn nd|  k�rNdk�s\n td| ƒ‚|||||dœ| _
d S )Né   r5   r   é   )ÚTCP4ÚTCP6zprotocol '%s' not supportedr„   r…   r   é   zinvalid port %sr   iÿÿ  )ry   Úclient_addrZclient_portZ
proxy_addrZ
proxy_port)r9   r=   r   ÚsocketÚ	inet_ptonÚAF_INETÚerrorÚAF_INET6rV   rW   rj   )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k
rŽ   tt|ƒƒ‚Y nX |jp˜d| _|jp¤d| _|jp°d| _t |d ¡}|d krÖt|d ƒ‚t| d¡ƒt| d¡ƒf| _d S )Nc                 S   s   g | ]}t |ƒ‘qS r)   r.   )r/   Úbitr)   r)   r*   r1   K  s     z.Request.parse_request_line.<locals>.<listcomp>r   rƒ   r   r5   r8   )r9   r=   r	   r   ÚMETH_REÚmatchr
   rB   rb   rc   r   rW   rd   re   rf   Ú
VERSION_REr   rV   Ú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 ra   )	rk   r'   r:   r   Úreaderr   r   r   r   r�   rl   r)   r*   r'   e  s    
zRequest.set_body_reader)r5   )F)r   )r]   r^   r_   r+   rt   r%   rx   ry   r   r€   rz   r'   Ú__classcell__r)   r)   rl   r*   r`   ¨   s   
-
-r`   )!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   rh   r!   r#   ÚcompilerC   r�   r’   Úobjectr   r`   r)   r)   r)   r*   Ú<module>   s    (


 