a
    eh#.                     @   s   d dl mZ ddlmZmZmZ eh dZedg d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_BYX_FORWARDED_PORTX_FORWARDED_HOST	FORWARDEDX_FORWARDED_FORX_FORWARDED_PROTO	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__ R/var/www/html/requester/venv/lib/python3.9/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 nZ ty } zBd|j||j|j td|j d}|| |W  Y d }~S d }~0 0 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$   s2    
"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   s2  |d u rt  }g }d } } }}d }	t t}
dd }d|v rd| v rzg }| d dD ]N}| }t|}d|vrd|v r|d	 d
kr|d| d
 q^|| q^|| d  }|d }	|
d W n: ty
 } z tdt	|| d W Y d }~n
d }~0 0 d|v rd| v rzXg }| d dD ] }| }t|}|| q4|| d  }|d }|
d W n: ty } z tdt	|| d W Y d }~n
d }~0 0 d|v r(z.t| 
dd}d|v r|  |
d W n: ty& } z tdt	|| d W Y d }~n
d }~0 0 d|v rz.t| 
dd}d|v rT|  |
d W n: ty } z tdt	|| d W Y d }~n
d }~0 0 d|v r|
d d|v r| 
dd }tdh }
|rxg }z|dD ]}| }d } }}d }}|d D ]}| }|s*q|d!\}}}|d!krLtd"| |krbtd#| |krxtd$|d%krt|}nJ|d&krt|}n6|d'krt|}n"|d(krt|}n|d)|  q|t|||| qW n: ty. } z td*t	|| d W Y d }~n
d }~0 0 || d  }|d d d	 D ]*}|jpZ|	}	|jpf|}|jpr|}qL|r| }|d+vrt|rd,ndd-||| d.< |s|d/krd0}|d1krd2}|rd|v r0|d	 d
kr0|dd3\}}| t	| }}||kr|}|| d4< || d5< n|| d4< || d5< |r|d6vrbd7||| d5< nR|d0kr| d. d/krd7||| d5< n(|d2kr| d. d1krd7||| d5< |rt	|| d8< |	r.d|	v 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   >   httpshttpzForwarded Proto=zunsupported proto valuezwsgi.url_schemerD   80rC   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   s6   

















*







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u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      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)   rg   )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>   s&   

+
 n