U
    ucH                     @   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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   8/tmp/pip-unpacked-wheel-yalm6hg1/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S )_bool_markerNr;   r   r   r   r   r@   b   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eZd*Zd+Zd,Zd-Z d.Z!d/Z"d0Z#d1Z$d2Z%d3Z&d4Z'd5Z(d6Z)d7Z*d8Z+d)Z,d(Z-d9Z.e/j0e/j1d/fgZ2d/Z3d)Z4d6Z5d6Z6g Z7d:Z8d;Z9d<d= Z:e;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  :   NFhttp Zwaitressi   i    r   i   i   i   d      x   Ti   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&t'krtd#t d$| _&|| _| (| j) d S )%NrF   rB   rC   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 setrQ   z.send_bytes will be removed in a future releasezUnknown adjustment %rrc   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-protozIn future versions of Waitress clear_untrusted_proxy_headers will be set to True by default. You may opt-out by setting this value to False, or opt-in explicitly by setting this to True.F)*
ValueErrorwarningswarnDeprecationWarningitems
_param_mapsetattrr   rB   r:   rC   r?   rF   r6   	AF_UNSPECrD   r   rE   AF_INETAF_INET6rsplitr   r   r   	Exceptionr   r3   getaddrinfoSOCK_STREAMIPPROTO_TCP
AI_PASSIVEr)   appendrI   rH   rJ   KNOWN_PROXY_HEADERSjoinrL   r@   check_socketsr8   )selfkwkvZenabled_familiesZwanted_socketsZhp_pairsirB   rC   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   rf   rF   z{} {}Zno_   NfalseTr   )
_paramsr   r   r   getoptr2   formatget
startswithrt   )
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   rw   rx   typer|   hasattrr   ro   )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   dictrt   r:   rB   r?   rC   rF   rG   rH   rI   r/   rJ   rK   r@   rL   rM   rN   r\   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r_   r`   r6   SOL_TCPTCP_NODELAYsocket_optionsr]   r^   rD   rE   r8   ra   rb   r   classmethodr   r   r   r   r   r   rA   f   s   %	 %
(rA   )r   r   r6   rp   compatr   r   proxy_headersr   	frozensetr   r   r   r    r(   r-   r0   r4   r5   r9   r   r:   r   r?   r@   rA   r   r   r   r   <module>   s*   	