U
    hE                     @   s   d Z ddlZddlZddlZddlmZmZ ddlmZ e	dZ
e	dd eD Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd deZG dd deZG dd dZdS )z$Adjustments are tunable parameters.
    N   )HAS_IPV6WIN)PROXY_HEADERS)ttrueyyeson1c                 c   s   | ]}|  d dV  qdS )_-N)lowerreplace.0header r   F/var/www/html/venv/lib/python3.8/site-packages/waitress/adjustments.py	<genexpr>   s    r   c                 C   s2   | dkrdS t | tr| S t|  } |  tkS )aG  Return the boolean value ``True`` if the case-lowered value of string
    input ``s`` is any of ``t``, ``true``, ``y``, ``on``, or ``1``, otherwise
    return the boolean value ``False``.  If ``s`` is the value ``None``,
    return ``False``.  If ``s`` is already one of the boolean values ``True``
    or ``False``, return it.NF)
isinstanceboolstrstripr   truthysr   r   r   asbool   s    
r   c                 C   s
   t | dS )z3Convert the given octal string to an actual number.   )intr   r   r   r   asoctal,   s    r    c                 C   s*   t | tr"td dd |  D } t| S )Nc                 S   s   g | ]}|  qS r   )r   )r   xr   r   r   
<listcomp>3   s     z!aslist_cronly.<locals>.<listcomp>)r   r   filter
splitlineslistvaluer   r   r   aslist_cronly1   s    
r(   c                 C   s,   t | }g }|D ]} |  }|| q|S )zReturn a list of strings, separating the input based on newlines
    and, if flatten=True (the default), also split on spaces within
    each line.)r(   splitextend)r'   valuesresultZ	subvaluesr   r   r   aslist7   s    r-   c                 C   s   t t| S N)setr-   r&   r   r   r   assetC   s    r0   c                 C   s$   |   } | r d| dd } | S )N/)r   lstriprstripr   r   r   r   slash_fixed_strG   s    r4   c                 C   s   | rt | S d S r.   )r   r   r   r   r   str_iftruthyP   s    r5   c                 C   s   dd | D S )zRChecks if the elements in the list are of type socket and
    removes them if not.c                 S   s   g | ]}t |tjr|qS r   )r   socket)r   sockr   r   r   r"   W   s      z"as_socket_list.<locals>.<listcomp>r   )socketsr   r   r   as_socket_listT   s    r9   c                   @   s   e Zd ZdS )_str_markerN__name__
__module____qualname__r   r   r   r   r:   Z   s   r:   c                   @   s   e Zd ZdS )_int_markerNr;   r   r   r   r   r?   ^   s   r?   c                #   @   s  e Zd ZdZdefdefdefdefdefdefdefd	efd
e	fdefdefdefde
fdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefdefd efd!efd"efd#eff"ZeeZed$Zed%Ze d&e gZd'Zd(Zd(Ze Zd)Zd*Zd+Zd,Zd-Zd.Zd/Z d0Z!d1Z"d2Z#d3Z$d4Z%d5Z&d6Z'd*Z(d7Z)d8Z*d)Z+d(Z,d9Z-e.j/e.j0d0fgZ1d0Z2d)Z3d*Z4d*Z5g Z6d:Z7d;Z8d<d= Z9e:d>d? Z;e:d@dA Z<d(S )BAdjustmentsz'This class contains tunable parameters.hostportipv4ipv6listenthreadstrusted_proxytrusted_proxy_counttrusted_proxy_headerslog_untrusted_proxy_headersclear_untrusted_proxy_headers
url_scheme
url_prefixbacklog
recv_bytes
send_bytesoutbuf_overflowoutbuf_high_watermarkinbuf_overflowconnection_limitcleanup_intervalchannel_timeoutlog_socket_errorsmax_request_header_sizemax_request_body_sizeexpose_tracebacksidentasyncore_loop_timeoutasyncore_use_pollunix_socketunix_socket_permsr8   channel_request_lookaheadserver_namez0.0.0.0i  :   NFThttp Zwaitressi   i    r   i   i   i   d      x   i   i   @i  r   zwaitress.invalidc              	   K   s  d|kr d|ksd|kr t dd|kr8d|kr8t dd|krXd|ksPd|krXt dd|krpd|krpt d	d|krd|ksd|krt d
d|krd|krt dd|krtdt | D ]4\}}|| jkrt d| t| || j| | qt| jt	rt| j
ts,| j d| j
 g| _tj}| jsHtsHt d| jr^| js^tj}| jsz| jrztrztj}g }g }| jD ]h}d|kr|dd\}}	d|	kr|t| j
 }}	n|t| j
 }}	trzt|	}	W n tk
r   t dY nX zd|kr,d|kr,|dd}|dkr:d }t||	|tjtjtjD ]x}
|
\}}}}}|d dks|d ddd |d f|krT| ||||f | |d ddd |d f qTW n tk
r   t dY nX q| j!d k	r| j"d krt dn| j!d kr(d| _!| j#rD| j"d krDt d| j#rdd | j#D | _#| j#t$ }|rt dd%|d%t$f d| j#kr| j#dh rt d n | j"d k	rtd!t d"h| _#|| _| &| j' d S )#NrE   rA   rB   z-host or port may not be set if listen is set.r8   z'socket may not be set if listen is set.z.host or port may not be set if sockets is set.r^   z,unix_socket may not be set if sockets is setz1unix_socket may not be set if host or port is setz+unix_socket may not be set if listen is setrP   z.send_bytes will be removed in a future releasezUnknown adjustment %rrb   zGIPv4 is disabled but IPv6 is not available. Cowardly refusing to start.r   ]z>Windows does not support service names instead of port numbers[*r   %zInvalid host/port specified.z@trusted_proxy_count has no meaning without setting trusted_proxyzBtrusted_proxy_headers has no meaning without setting trusted_proxyc                 S   s   h | ]}|  qS r   )r   r   r   r   r   	<setcomp>  s    z'Adjustments.__init__.<locals>.<setcomp>zDReceived unknown trusted_proxy_headers value (%s) expected one of %sz, Z	forwardedzyThe Forwarded proxy header and the X-Forwarded-{By,Host,Proto,Port,For} headers are mutually exclusive. Can't trust both!zNo proxy headers were marked as trusted, but trusted_proxy was set. Implicitly trusting X-Forwarded-Proto for backwards compatibility. This will be removed in future versions of waitress.zx-forwarded-proto)(
ValueErrorwarningswarnDeprecationWarningitems
_param_mapsetattrr   rA   r:   rB   r?   rE   r6   	AF_UNSPECrC   r   rD   AF_INETAF_INET6rsplitr   r   r   	Exceptionr   r3   getaddrinfoSOCK_STREAMIPPROTO_TCP
AI_PASSIVEr)   appendrH   rG   rI   KNOWN_PROXY_HEADERSjoincheck_socketsr8   )selfkwkvZenabled_familiesZwanted_socketsZhp_pairsirA   rB   r   familysocktypeprotor   ZsockaddrZunknown_valuesr   r   r   __init__$  s     
 




*

zAdjustments.__init__c           
      C   s  ddg}| j D ]D\}}|dd}|tkrD|| |d|  q||d  qddd}t|d	|\}}|D ]\}}|ddd}	|	d
krd|d
d	||d
< qt|	dr|	dd }	d||	< qt|	dkrd||	< qt| j	|	 tkrd||	< qt|||	< qt||fS )zPre-parse command line arguments for input into __init__.  Note that
        this does not cast values into adjustment types, it just creates a
        dictionary suitable for passing into __init__, where __init__ does the
        casting.
        helpcallr   r   zno-=F)r   r   re   rE   z{} {}Zno_   NfalseTr   )
_paramsr   r   r~   getoptr2   formatget
startswithrs   )
clsargv	long_optsoptcastr   optsargsr'   paramr   r   r   
parse_args  s2    





zAdjustments.parse_argsc                 C   s   d}d}d}|D ]Z}|j tjks,|j tjkr>|jtjkr>d}qttdrf|j tjkrf|jtjkrfd}qd}q|r||r|td|rtdd S )NFTAF_UNIXz+Internet and UNIX sockets may not be mixed.z1Only Internet or UNIX stream sockets may be used.)	r   r6   rv   rw   typer{   hasattrr   rn   )r   r8   Zhas_unix_socketZhas_inet_socketZhas_unsupported_socketr7   r   r   r   r     s.    




zAdjustments.check_sockets)=r<   r=   r>   __doc__r   r   r   r-   r5   r0   r4   r    r9   r   dictrs   r:   rA   r?   rB   rE   rF   rG   rH   r/   rI   rJ   rK   rL   rM   r[   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r^   r_   r6   SOL_TCPTCP_NODELAYsocket_optionsr\   r]   rC   rD   r8   r`   ra   r   classmethodr   r   r   r   r   r   r@   b   s   %	 
(r@   )r   r   r6   ro   compatr   r   proxy_headersr   	frozensetr   r   r   r    r(   r-   r0   r4   r5   r9   r   r:   r   r?   r@   r   r   r   r   <module>   s(   	