B
    `3H                 @   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   \/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/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.   )int)r   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   s0   t | }g }x|D ]} |  }|| qW |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    r,   c             C   s$   |   } | r d| dd } | S )N/)r   lstriprstrip)r   r   r   r   slash_fixed_strG   s    r0   c             C   s   | rt | S d S )N)r   )r   r   r   r   str_iftruthyP   s    r1   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    r5   c               @   s   e Zd ZdS )_str_markerN)__name__
__module____qualname__r   r   r   r   r6   Z   s   r6   c               @   s   e Zd ZdS )_int_markerN)r7   r8   r9   r   r   r   r   r:   ^   s   r:   c               @   s   e Zd ZdS )_bool_markerN)r7   r8   r9   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d&e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/e0j1e0j2d/fgZ3d/Z4d)Z5d6Z6d6Z7g Z8d:Z9d;Z:d<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_permsr4   channel_request_lookaheadserver_namez0.0.0.0i  z{}:{}   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 x@| D ]4\}}|| jkrt d| t| || j| | qW t| jt	rt| j
ts.d| j| j
g| _tj}| jsJtsJt d| jr`| js`tj}| js|| jr|tr|tj}g }g }xx| jD ]l}d|kr|dd\}}	d|	kr|t| j
 }}	n|t| j
 }}	tryt|	}	W n tk
r
   t dY nX yd|kr2d|kr2|dd}|dkr@d }xt||	|tjtjtjD ]x}
|
\}}}}}|d dks|d  ddd |d f|kr\|!||||f |!|d  ddd |d f q\W W n tk
r   t dY nX qW | j"d k	r"| j#d kr"t dn| j"d kr4d| _"| j$rP| j#d krPt 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 )&NrA   r=   r>   z-host or port may not be set if listen is set.r4   z'socket may not be set if listen is set.z.host or port may not be set if sockets is set.rZ   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 setrL   z.send_bytes will be removed in a future releasezUnknown adjustment %rz{}:{}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   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   r=   r6   r>   r:   formatrA   r2   	AF_UNSPECr?   r   r@   AF_INETAF_INET6rsplitr   r   r   	Exceptionr   r/   getaddrinfoSOCK_STREAMIPPROTO_TCP
AI_PASSIVEr&   appendrD   rC   rE   KNOWN_PROXY_HEADERSjoinrG   r;   check_socketsr4   )selfkwkvZenabled_familiesZwanted_socketsZhp_pairsir=   r>   r   familysocktypeprotor   sockaddrZunknown_valuesr   r   r   __init__)  s    



",
zAdjustments.__init__c       
      C   s  ddg}xN| j D ]D\}}|dd}|tkrF|| |d|  q||d  qW ddd}t|d	|\}}x|D ]\}}|ddd}	|	d
krd|d
d	||d
< qz|	dr|	dd }	d||	< qz|	dkrd||	< qz| j	|	 tkrd||	< qz|||	< qzW ||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   r`   rA   z{} {}Zno_   NfalseTr   )
_paramsr   r   r{   getoptr.   rq   get
startswithro   )
clsargv	long_optsoptcastr   optsargsr$   paramr   r   r   
parse_args  s0    




zAdjustments.parse_argsc             C   s   d}d}d}xb|D ]Z}|j tjks.|j tjkr@|jtjkr@d}qttdrh|j tjkrh|jtjkrhd}qd}qW |r|rt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   r2   rs   rt   typerx   hasattrr   rj   )r   r4   Zhas_unix_socketZhas_inet_socketZhas_unsupported_socketr3   r   r   r   r~     s     

zAdjustments.check_sockets)?r7   r8   r9   __doc__r   r   r   r*   r1   r,   r0   r   r5   r   dictro   r6   r=   r:   r>   rq   rA   rB   rC   rD   r+   rE   rF   r;   rG   rH   rI   rW   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rZ   r[   r2   SOL_TCPTCP_NODELAYsocket_optionsrX   rY   r?   r@   r4   r\   r]   r   classmethodr   r~   r   r   r   r   r<   f   s   
	 %)r<   )r   r   r2   rk   compatr   r   proxy_headersr   	frozensetr   r|   r   r   r%   r*   r,   r0   r1   r5   r   r6   r   r:   r;   r<   r   r   r   r   <module>   s(   	