U
    Þ?{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_addrÚ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-gyn2b1th/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_headerrB   rC   Ú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,   )rK   )r4   Úvr,   r,   r-   r6   µ   s     z+Message.set_body_reader.<locals>.<listcomp>ú,ÚchunkedTÚidentity)ÚcompressÚdeflateÚgzip)r:   r:   r   )r   r   r?   Úlowerr0   r   r   r   r   r   r    ÚstrÚ	isnumericÚintÚ
ValueErrorr   r   )r+   r]   Úcontent_lengthrV   rW   Ú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©r:   r   )r"   r   rb   rK   r   )r+   Úhr[   r,   r,   r-   Úshould_closeå   s    zMessage.should_closeN)F)	Ú__name__Ú
__module__Ú__qualname__r.   r0   r(   rY   r*   rm   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 )Ú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Úsuperr.   )r+   r   r   r   rz   ©Ú	__class__r,   r-   r.   ô   s    
ÿzRequest.__init__Fc                 C   s0   |  ¡ }|s"|rtƒ ‚t| ¡ ƒ‚| |¡ d S r1   )ÚreadÚStopIterationr   ÚgetvalueÚwrite)r+   r   ÚbufÚstoprQ   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   r7   r   zmax buffer headersó    F)rR   r   )ÚioÚBytesIOr…   Ú	read_linerx   Úproxy_protocolr   r‚   Úparse_request_liner�   rF   rD   r'   r   r   r)   rY   r   )	r+   r   rƒ   r5   ZrbufrQ   Ú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 )Nr7   r   r   )r�   rF   r   rD   r…   )r+   r   rƒ   ÚlimitrQ   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
        Fr:   ZPROXYT)r   rŠ   rz   rL   Úproxy_protocol_access_checkÚparse_proxy_protocol)r+   r5   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 )Nr8   r   )r   Zproxy_allow_ipsr@   r   rA   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<   é   r:   r   é   )ÚTCP4ÚTCP6zprotocol '%s' not supportedr”   r•   r   é   zinvalid port %sr   iÿÿ  )rŠ   Úclient_addrZclient_portZ
proxy_addrZ
proxy_port)r?   rD   r   ÚsocketÚ	inet_ptonÚAF_INETÚOSErrorÚAF_INET6re   rf   r{   )r+   r5   Ú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,   r3   )r4   Úbitr,   r,   r-   r6   –  s     z.Request.parse_request_line.<locals>.<listcomp>ó    r   r“   r   é   r:   Ú rk   )r   r   )r?   rD   r	   r   rs   r   Z!permit_unconventional_http_methodÚMETHOD_BADCHAR_RErP   r
   rH   rI   Zcasefold_http_methodrJ   rt   r   rf   ru   rv   rw   Ú
VERSION_REr   re   Ú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 rr   )	r|   r*   r@   r    Úreaderr   r   r   r   r/   r}   r,   r-   r*   Ì  s    
zRequest.set_body_reader)r:   )F)r   )rn   ro   rp   r.   r…   r(   r‰   rŠ   r�   r‘   r‹   r*   Ú__classcell__r,   r,   r}   r-   rq   ó   s   
-
-7rq   )%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   ry   r$   r&   ZRFC9110_5_6_2_TOKEN_SPECIALSÚcompileÚescaperH   r£   r¤   rO   r   rq   r,   r,   r,   r-   Ú<module>   s$   0


 S