U
    +5øià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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!e d¡Z"G dd„ dƒZ#G dd„ de#ƒZ$dS )é    N)ÚChunkedReaderÚLengthReaderÚ	EOFReaderÚBody)
ÚInvalidHeaderÚInvalidHeaderNameÚ
NoMoreDataÚInvalidRequestLineÚInvalidRequestMethodÚInvalidHTTPVersionÚLimitRequestLineÚLimitRequestHeadersÚUnsupportedTransferCodingÚObsoleteFolding)ÚInvalidProxyLineÚForbiddenProxyRequest)ÚInvalidSchemeHeaders)Úbytes_to_strÚsplit_request_uriiþ  i €  z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]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sb| jtkrht| _|j| _| jdk r€t| _| jpˆt}| j|d  d | _|  | j¡}| j |¡ |  ¡  d S )NÚhttpsÚhttpFr   é   é   )ÚcfgÚunreaderÚ	peer_addrZremote_addrÚversionÚheadersZtrailersÚbodyZ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   Zmax_header_field_sizeZunused© r+   ú9/tmp/pip-unpacked-wheel-pa3uujlc/gunicorn/http/message.pyÚ__init__"   s6    
ÿ

ÿÿzMessage.__init__c                 C   s
   d| _ d S )NT)r!   ©r*   r+   r+   r,   Úforce_close@   s    zMessage.force_closec                 C   s
   t ƒ ‚d S ©N)ÚNotImplementedError)r*   r   r+   r+   r,   r'   C   s    zMessage.parseFc                 C   s^  | j }g }dd„ | d¡D ƒ}d}i }g }|r0n2d|jksVt| jtƒrV| jd |jkrb|j}|j}|�rZt|ƒ| j	kr~t
dƒ‚| d¡}	t|	ƒtdƒ }
|	 d	¡dkr®t|	ƒ‚|	 d	d
¡\}}| j jrÐ| d¡}t |¡sât|ƒ‚| ¡ }| d¡g}|�rt|d  d¡�rt| j j�st|ƒ‚| d¡}	|
t|	ƒtdƒ 7 }
|
| j  k�rVdk�rbn nt
dƒ‚| |	 d¡¡ qöd |¡}t |¡�r’t|ƒ‚|
| j  k�r¬dk�r¸n nt
dƒ‚||k�r ||| k}|�rØdnd}|�rö|| jk�r tƒ ‚n
d}|| _d|k�rJ||k�sJd|k�r n*| j jdk�r0n| j jdk�rBqbnt|ƒ‚| ||f¡ qb|S )Nc                 S   s   g | ]}t |ƒ‘qS r+   ©r   )Ú.0Úliner+   r+   r,   Ú
<listcomp>K   s     z)Message.parse_headers.<locals>.<listcomp>ó   
FÚ*r   zlimit request headers fieldsz
ú:é   ú 	)ú ú	z!limit request headers fields sizez	 r;   r   r   TÚ_Z	dangerousZdrop) r   ÚsplitZforwarded_allow_ipsÚ
isinstancer   ÚtupleÚsecure_scheme_headersÚforwarder_headersÚlenr"   r   ÚpopÚfindr   Zstrip_header_spacesÚrstripÚTOKEN_REÚ	fullmatchr   ÚupperÚstripÚ
startswithZpermit_obsolete_foldingr   r$   ÚappendÚjoinÚ!RFC9110_5_5_INVALID_AND_DANGEROUSÚsearchr    r   Z
header_map)r*   ÚdataÚfrom_trailerr   r   ÚlinesZscheme_headerrA   rB   ÚcurrÚheader_lengthÚnameÚvalueÚsecurer    r+   r+   r,   Úparse_headersF   sx    

ÿþ







zMessage.parse_headersc                 C   s¦  d}d }| j D ]¾\}}|dkr8|d k	r2td| d�‚|}q|dkrdd„ | d¡D ƒ}|D ]r}| ¡ dkr~|rxtd| d�‚d	}qX| ¡ d
krœ|rÊtd| d�‚qX| ¡ dkrÂ|r¸td| d�‚|  ¡  qXt|ƒ‚qXq|�r| jdk rêtd| d�‚|d k	rþtd| d�‚tt| | j	ƒƒ| _
n�|d k	�r’z(t|ƒ ¡ �r6t|ƒ}ntd| d�‚W n" tk
�rf   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-ENCODINGc                 S   s   g | ]}|  ¡ ‘qS r+   )rJ   )r3   Úvr+   r+   r,   r5   µ   s     z+Message.set_body_reader.<locals>.<listcomp>ú,ÚchunkedTÚidentity)ÚcompressÚdeflateÚgzip)r9   r9   r   )r   r   r>   Úlowerr/   r   r   r   r   r   r   ÚstrÚ	isnumericÚintÚ
ValueErrorr   r   )r*   r\   Úcontent_lengthrU   rV   ÚvalsÚvalr+   r+   r,   r)   ©   sN    




zMessage.set_body_readerc                 C   sZ   | j r
dS | jD ]>\}}|dkr| ¡  d¡}|dkr< dS |dkrJ dS  qPq| jdkS )NTZ
CONNECTIONr:   Úclosez
keep-aliveF©r9   r   )r!   r   ra   rJ   r   )r*   ÚhrZ   r+   r+   r,   Úshould_closeå   s    zMessage.should_closeN)F)	Ú__name__Ú
__module__Ú__qualname__r-   r/   r'   rX   r)   rl   r+   r+   r+   r,   r   !   s   
c<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   ry   ©Ú	__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ÚstoprP   r+   r+   r,   Úget_data  s    zRequest.get_datac           	      C   sB  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 | j|d |… d	d
�| _||d d … }d }|S )NT)rƒ   s   

r   r6   r   zmax buffer headersó    F)rQ   r   )ÚioÚBytesIOr„   Ú	read_linerw   Úproxy_protocolr   r�   Úparse_request_liner€   rE   rC   r&   r   r   r(   rX   r   )	r*   r   r‚   r4   ZrbufrP   Ú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 )Nr6   r   r   )r€   rE   r   rC   r„   )r*   r   r‚   ÚlimitrP   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   ZPROXYT)r   r‰   ry   rK   Úproxy_protocol_access_checkÚparse_proxy_protocol)r*   r4   r+   r+   r,   r‰   L  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 )Nr7   r   )r   Zproxy_allow_ipsr?   r   r@   r   r.   r+   r+   r,   r�   a  s    
ÿþz#Request.proxy_protocol_access_checkc                 C   sp  |  d¡}t|ƒdkrt|ƒ‚|d }|d }|d }|dkrJtd| ƒ‚|dkr’z t tj|¡ t tj|¡ W qØ tk
rŽ   t|ƒ‚Y qØX nF|d	krØz t tj|¡ t tj|¡ W n tk
rÖ   t|ƒ‚Y nX zt|d
 ƒ}t|d ƒ}W n" t	k
�r   td| ƒ‚Y nX d|  k�r0dk�rNn nd|  k�rLdk�sZn td| ƒ‚|||||dœ| _
d S )Nr;   é   r9   r   é   )ÚTCP4ÚTCP6zprotocol '%s' not supportedr“   r”   r   é   zinvalid port %sr   iÿÿ  )r‰   Úclient_addrZclient_portZ
proxy_addrZ
proxy_port)r>   rC   r   ÚsocketÚ	inet_ptonÚAF_INETÚOSErrorÚAF_INET6rd   re   rz   )r*   r4   ÚbitsÚprotoZs_addrZd_addrZs_portZd_portr+   r+   r,   r�   h  sB    
6ûzRequest.parse_proxy_protocolc                 C   sœ  dd„ |  dd¡D ƒ}t|ƒdkr.tt|ƒƒ‚|d | _| jjs~t | j¡rVt	| jƒ‚dt|d ƒ  krrdks~n t	| jƒ‚t
 | j¡s”t	| jƒ‚| jjr¨| j ¡ | _|d | _t| jƒdkrÌtt|ƒƒ‚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�rJt|d ƒ‚t| d¡ƒt| d¡ƒf| _d
| j  k�r‚dk �s˜n | jj�s˜t| jƒ‚d S )Nc                 S   s   g | ]}t |ƒ‘qS r+   r2   )r3   Úbitr+   r+   r,   r5   –  s     z.Request.parse_request_line.<locals>.<listcomp>ó    r   r’   r   é   r9   Ú rj   )r   r   )r>   rC   r	   r   rr   r   Z!permit_unconventional_http_methodÚMETHOD_BADCHAR_RErO   r
   rG   rH   Zcasefold_http_methodrI   rs   r   re   rt   ru   rv   Ú
VERSION_REr   rd   Úgroupr   Z"permit_unconventional_http_version)r*   Z
line_bytesrœ   ÚpartsÚmatchr+   r+   r,   rŠ   •  s<    







zRequest.parse_request_linec                    s.   t ƒ  ¡  t| jjtƒr*tt| jdƒƒ| _d S rq   )	r{   r)   r?   r   Úreaderr   r   r   r   r.   r|   r+   r,   r)   Ì  s    
zRequest.set_body_reader)r9   )F)r   )rm   rn   ro   r-   r„   r'   rˆ   r‰   r�   r�   rŠ   r)   Ú__classcell__r+   r+   r|   r,   rp   ó   s   
-
-7rp   )%r†   Úrer—   Zgunicorn.http.bodyr   r   r   r   Zgunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   Zgunicorn.utilr   r   rx   r#   r%   ZRFC9110_5_6_2_TOKEN_SPECIALSÚcompileÚescaperG   r¢   r£   rN   r   rp   r+   r+   r+   r,   Ú<module>   s$   0


 S