U
    h#.                     @   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__ H/var/www/html/venv/lib/python3.8/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rzt| d}W n\ tk
r } z>d|j||j|j td|j d}|| | W Y 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 "z" malformed.)log_warningr   )
PROXY_HEADERSparse_proxy_headersr   warningr   r   r   r   Z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$   s8    
"   z9proxy_headers_middleware.<locals>.translate_proxy_headersr   )r0   r3   r$   r%   r1   r2   r   r4   r   r/   r   proxy_headers_middleware   s    	r5   c              
   C   s(  |d krt  }g }d } } }}d }	t t}
dd }d|kr
d| kr
zg }| d dD ]N}| }t|}d|krd|kr|d	 d
kr|d| d
 q^|| q^|| d  }|d }	|
d W n8 tk
r } ztdt	|| d W 5 d }~X Y nX d|krd| krzXg }| d dD ] }| }t|}|| q2|| d  }|d }|
d W n8 tk
r } ztdt	|| d W 5 d }~X Y nX d|kr"z.t| 
dd}d|kr|  |
d W n8 tk
r  } ztdt	|| d W 5 d }~X Y nX d|krz.t| 
dd}d|krN|  |
d W n8 tk
r } ztdt	|| d W 5 d }~X Y nX d|kr|
d d|kr| 
dd }tdh }
|rng }z|dD ]}| }d } }}d }}|d D ]}| }|s"q|d!\}}}|d!krDtd"| |krZtd#| |krptd$|d%krt|}nJ|d&krt|}n6|d'krt|}n"|d(krt|}n|d)|  q|t|||| qW n8 tk
r$ } ztd*t	|| d W 5 d }~X Y nX || d  }|d d d	 D ]*}|jpP|	}	|jp\|}|jph|}qB|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rXd7||| d5< nR|d0kr| d. d/krd7||| d5< n(|d2kr| d. d1krd7||| d5< |rt	|| d8< |	r$d|	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,.:][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   >   httphttpszForwarded Proto=zunsupported proto valuezwsgi.url_schemerC   80rD   443r   ZSERVER_NAMEZ	HTTP_HOST>   rE   rF   z{}:{}ZSERVER_PORTr"   ZREMOTE_PORTZREMOTE_HOST)setr'   splitstripr   appendremove	Exceptionr   strgetlower	partitionr7   r)   r   r   r   r   rsplitformatstrip_brackets)r+   r$   r%   r   Zforwarded_forZforwarded_hostZforwarded_protoZforwarded_portr?   client_addrr,   r8   Zforward_hopr-   Zforwarded_host_multipleZforward_hostproxiesZforwarded_elementZforwarded_bypairtokenequalsr   proxyr   portaddrr   r   r   r(   E   sR   
    

  

  












   &





 
 
 r(   c                 C   s(   | d dkr$| d dkr$| dd S | S )Nr   r>   r<   r=   r   r   )r[   r   r   r   rS   2  s    rS   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 r   )
capitalize)r^   xr   r   r   	<genexpr>C  s     z5clear_untrusted_headers.<locals>.<listcomp>.<genexpr>_)joinrH   r]   r   r   r   r`   B  s   zNRemoved untrusted headers (%s). Waitress recommends these be removed upstream.z, )r)   rf   )r+   r,   r&   r   Zuntrusted_headers_removedr   r_   r   r*   8  s    
r*   )collectionsr   Z	utilitiesr   r   r   	frozensetr'   r   rL   r   r5   r(   rS   r*   r   r   r   r   <module>   s4   

+
 n 