a
    ehE                     @   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   P/var/www/html/requester/venv/lib/python3.9/site-packages/waitress/adjustments.py	<genexpr>   s   r   c                 C   s2   | du rdS t | tr| S t|  } |  tv 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       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    r1   c                 C   s$   |   } | r d| dd } | S )N/)r   lstriprstripr   r   r   r   slash_fixed_strG   s    r5   c                 C   s   | rt | S d S r/   )r   r   r   r   r   str_iftruthyP   s    r6   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   r#   z"as_socket_list.<locals>.<listcomp>r   )socketsr   r   r   as_socket_listT   s    r:   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_permsr9   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|v r d|v sd|v r t dd|v r8d|v r8t dd|v rXd|v sPd|v rXt dd|v rpd|v rpt d	d|v rd|v sd|v rt d
d|v rd|v rt dd|v rtdt | D ]4\}}|| jv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 ]d}d|v r|dd\}}	d|	v r|t| j
 }}	n|t| j
 }}	trzt|	}	W n ty   t dY n0 zd|v r*d|v r*|dd}|dkr8d }t||	|tjtjtjD ]x}
|
\}}}}}|d dks|d ddd |d f|vrR| ||||f | |d ddd |d f qRW n ty   t dY n0 q| j!d ur| j"d u rt dn| j!d u r$d| _!| j#r@| j"d u r@t d| j#rdd | j#D | _#| j#t$ }|rt dd%|d%t$f d| j#v r| j#dh rt d n | j"d urtd!t d"h| _#|| _| &| j' d S )#NrF   rB   rC   z-host or port may not be set if listen is set.r9   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-proto)(
ValueErrorwarningswarnDeprecationWarningitems
_param_mapsetattrr   rB   r;   rC   r@   rF   r7   	AF_UNSPECrD   r   rE   AF_INETAF_INET6rsplitr   r   r   	Exceptionr   r4   getaddrinfoSOCK_STREAMIPPROTO_TCP
AI_PASSIVEr*   appendrI   rH   rJ   KNOWN_PROXY_HEADERSjoincheck_socketsr9   )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u 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v rd||	< qt| j	|	 tu 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   getoptr3   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   r7   rw   rx   typer|   hasattrr   ro   )r   r9   Zhas_unix_socketZhas_inet_socketZhas_unsupported_socketr8   r   r   r   r     s.    




zAdjustments.check_sockets)=r=   r>   r?   __doc__r   r   r   r.   r6   r1   r5   r    r:   r   dictrt   r;   rB   r@   rC   rF   rG   rH   rI   r0   rJ   rK   rL   rM   rN   r\   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r_   r`   r7   SOL_TCPTCP_NODELAYsocket_optionsr]   r^   rD   rE   r9   ra   rb   r   classmethodr   r   r   r   r   r   rA   b   s   %	 
(rA   )r   r   r7   rp   compatr   r   proxy_headersr   	frozensetr   r   r   r    r)   r.   r1   r5   r6   r:   r   r;   r   r@   rA   r   r   r   r   <module>   s(   	