U
    %ciD                     @   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 rt| _| jpt}| 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-da5m708v/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rt|	|	d	d
\}}| j jr|d}t|st|| }|dg}|rt|d drt| j jst||d}	|
t|	td 7 }
|
| j  krVdkrbn nt
d||	d qd|}t|rt||
| j  krdkrn nt
d||kr ||| k}|rd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|rtd| dqX| dkr|rtd| d|   qXt|qXq|r| jdk rtd| d|d k	rtd| dtt| | j	| _
n|d k	rz(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rtdqqq|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rn qt||qt|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rz ttj| ttj| W q tk
r   t|Y qX nF|d	krz 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st	| j| jjr| j | _|d | _t| jdkrt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rdk sn | jjst| 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