B
    `3.                 @   s   d dl mZ ddlmZmZmZ edddddd	hZed
ddddgZG dd de	Z
dddddefddZefddZdd ZdefddZdS )    )
namedtuple   )
BadRequestloggerundquoteX_FORWARDED_FORX_FORWARDED_HOSTX_FORWARDED_PROTOX_FORWARDED_PORTX_FORWARDED_BY	FORWARDED	Forwardedbyfor_hostprotoc                   s   e Zd Z fddZ  ZS )MalformedProxyHeaderc                s&   || _ || _|| _t ||| d S )N)headerreasonvaluesuper__init__)selfr   r   r   )	__class__ ^/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/waitress/proxy_headers.pyr      s    zMalformedProxyHeader.__init__)__name__
__module____qualname__r   __classcell__r   r   )r   r   r      s   r   NTFc                s    fdd}|S )Nc          
      s   t }| d }dks|kryt| d}W nR tk
r } z4d|j||j|j td|j}|	| |S d }~X Y nX rt
| |d  | |S )NREMOTE_ADDR*)trusted_proxy_counttrusted_proxy_headersr   z3Malformed proxy header "%s" from "%s": %s value: %szHeader "{}" malformed.)log_warningr   )PROXY_HEADERSparse_proxy_headersr   warningr   r   r   r   formatZwsgi_responseclear_untrusted_headers)environZstart_responseuntrusted_headersZremote_peerexerror)appclear_untrustedlog_untrustedr   trusted_proxyr"   r#   r   r   translate_proxy_headers$   s,    z9proxy_headers_middleware.<locals>.translate_proxy_headersr   )r.   r1   r"   r#   r/   r0   r   r2   r   )r.   r/   r0   r   r1   r"   r#   r   proxy_headers_middleware   s    	r3   c          
   C   s<  |d krt  }g }d } } }}d }	t t}
dd }d|krd| kryg }x^| d dD ]L}| }t|}d|krd|kr|d	 d
kr|d| q`|| q`W || d  }|d }	|
d W n8 tk
r
 } zt	dt
|| d W d d }~X Y nX d|krd| kry\g }x2| d dD ] }| }t|}|| q6W || d  }|d }|
d W n8 tk
r } zt	dt
|| d W d d }~X Y nX d|kr(y.t| dd}d|kr|  |
d W n8 tk
r& } zt	dt
|| d W d d }~X Y nX d|kry.t| dd}d|krT|  |
d W n8 tk
r } zt	dt
|| d W d d }~X Y nX d|kr|
d d|kr| dd }tdh }
|rg }y"x|dD ]
}| }d } }}d }}x|d D ]}| }|s.q|d!\}}}|d!krPtd"| |krftd#| |kr|td$|d%krt|}nJ|d&krt|}n6|d'krt|}n"|d(krt|}n|d)|  qW |t|||| qW W n8 tk
r4 } zt	d*t
|| d W d d }~X Y nX || d  }x<|d d d	 D ]*}|jpb|	}	|jpn|}|jpz|}qTW |r| }|d+krt	|rd,ndd-||| d.< |s|d/krd0}|d1krd2}|rd|kr:|d	 d
kr:|dd3\}}| t
| }}||kr(|}|| d4< || d5< n|| d4< || d5< |r|d6krld7||| d5< nR|d0kr| d. d/krd7||| d5< n(|d2kr| d. d1krd7||| d5< |rt
|| d8< |	r8d|	kr|	d	 d
kr|	dd3\}}t| | d9< | | d:< nt|	 | d9< | d9 | d;< |
S )<N c               S   s   t dd S )Nz8Unspecified behavior for multiple values found in header)
ValueErrorr   r   r   r   raise_for_multiple_valuesP   s    z6parse_proxy_headers.<locals>.raise_for_multiple_valueszx-forwarded-forZHTTP_X_FORWARDED_FOR,.:]z[{}]r   r   zX-Forwarded-Forzx-forwarded-hostZHTTP_X_FORWARDED_HOSTr   zX-Forwarded-Hostzx-forwarded-protoZHTTP_X_FORWARDED_PROTOr	   zX-Forwarded-Protozx-forwarded-portZHTTP_X_FORWARDED_PORTr
   zX-Forwarded-Portzx-forwarded-byr   	forwardedZHTTP_FORWARDEDr   ;=z"Invalid forwarded-pair missing "="z)Token may not be surrounded by whitespacez)Value may not be surrounded by whitespacer   forr   r   zUnknown Forwarded token: %sr   >   httpshttpzForwarded Proto=zunsupported proto valuezwsgi.url_schemerA   80r@   443r   ZSERVER_NAMEZ	HTTP_HOST>   rC   rB   z{}:{}ZSERVER_PORTr    ZREMOTE_PORTZREMOTE_HOST)setr%   splitstripr   appendr(   remove	Exceptionr   strgetlower	partitionr5   r'   r   r   r   r   rsplitstrip_brackets)r*   r"   r#   r   Zforwarded_forZforwarded_hostZforwarded_protoZforwarded_portr<   client_addrr+   r6   Zforward_hopr,   Zforwarded_host_multipleZforward_hostproxiesZforwarded_elementZforwarded_bypairtokenequalsr   proxyr   portaddrr   r   r   r&   E   s   $

$

$

$












&





r&   c             C   s(   | d dkr$| d dkr$| dd S | S )Nr   [r:   r;   r   r   )rW   r   r   r   rO   2  s    rO   c                s>    fdd|D }|r:|r:dd |D }| dd| d S )Nc                s$   g | ]}  d | ddk	r|qS )ZHTTP_F)pop).0r   )r*   r   r   
<listcomp><  s   z+clear_untrusted_headers.<locals>.<listcomp>c             S   s&   g | ]}d  dd |dD qS )-c             s   s   | ]}|  V  qd S )N)
capitalize)rZ   xr   r   r   	<genexpr>C  s    z5clear_untrusted_headers.<locals>.<listcomp>.<genexpr>_)joinrE   )rZ   r   r   r   r   r[   C  s   zNRemoved untrusted headers (%s). Waitress recommends these be removed upstream.z, )r'   ra   )r*   r+   r$   r   Zuntrusted_headers_removedr   )r*   r   r)   8  s    
r)   )collectionsr   Z	utilitiesr   r   r   	frozensetr%   r   rI   r   r3   r&   rO   r)   r   r   r   r   <module>   s(   
$ m