U
    h5                     @   s   d dl Z d dlZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ dd	lmZ dd
lmZ dddZG dd dZG dd dejZG dd deZeedrG dd deZeZdS )    N)trigger)Adjustments)HTTPChannel)IPPROTO_IPV6IPV6_V6ONLY)ThreadedTaskDispatcher)cleanup_unix_socket   )	wasyncore)proxy_headers_middlewareTc                 K   s  | dkrt dtf |}|dkr&i }|}|dkrDt }||j |jrzttdrztjtj	ddf}t
| ||||||dS g }	d}
|js|jD ],}t| ||||||d}
|	|
j|
jf q|jD ]}|j|j|j| f}|jtjks|jtjkr"t| |||||d|d}
|	|
j|
jf qttdr|jtjkrt
| |||||d|d}
|	|
j|
jf qt|	dkrv|
S |
j}t|||	||S )z]
    if __name__ == '__main__':
        server = create_server(app)
        server.run()
    NzmThe "app" passed to ``create_server`` was ``None``.  You forgot to return a WSGI app within your application.AF_UNIX)
dispatcheradjsockinfoF)r   r   bind_socketr   r	   )
ValueErrorr   r   set_thread_countthreadsunix_sockethasattrsocketr   SOCK_STREAMUnixWSGIServerZsocketslistenTcpWSGIServerappendeffective_hosteffective_portfamilytypeprotogetsocknameAF_INETAF_INET6lenlog_infoMultiSocketServer)applicationmap_start_sockZ_dispatcherkwr   r   r   effective_listenZ	last_servsockr%    r.   A/var/www/html/venv/lib/python3.8/site-packages/waitress/server.pycreate_server   s    


	





r0   c                   @   s2   e Zd ZeZd
ddZdd Zdd Zdd	 ZdS )r&   Nc                 C   s"   || _ || _|| _|| _|| _d S N)r   r(   r,   task_dispatcherr%   )selfr(   r   r,   r   r%   r.   r.   r/   __init__   s
    zMultiSocketServer.__init__c                 C   sH   | j D ]<}t|}d|d kr2d|d  d|d< | |j|  qd S )N:r   [])r,   listr%   format)r3   
format_strlr.   r.   r/   print_listen   s
    
zMultiSocketServer.print_listenc              	   C   sF   z | j j| jj| j| jjd W n  ttfk
r@   |   Y nX d S N)timeoutr(   Zuse_poll)	asyncoreloopr   asyncore_loop_timeoutr(   asyncore_use_poll
SystemExitKeyboardInterruptcloser3   r.   r.   r/   run   s    
zMultiSocketServer.runc                 C   s   | j   t| j d S r1   )r2   shutdownr
   Z	close_allr(   rF   r.   r.   r/   rE      s    
zMultiSocketServer.close)NNNNN)	__name__
__module____qualname__r
   r?   r4   r<   rG   rE   r.   r.   r.   r/   r&      s        
	
r&   c                   @   s   e Zd ZeZdZeZeZ	dZ
d'd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dd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& ZdS )(BaseWSGIServerr   FNTc	           
   	   K   s@  |d krt f |	}|js|jr@t||j|j|j|j|j| jd}|d krLi }|d kr^|jd }|| _	|d | _
|d | _|| _|| _t|| _|d krt }|| jj || _| jjj| ||d |d kr| | j
| j | j
tjkr| jttd |   |r|   |  \| _| _ |j!| _!i | _"|r<| #  d S )N)trusted_proxytrusted_proxy_counttrusted_proxy_headersZclear_untrustedZlog_untrustedloggerr   r	   r(   )$r   rM   Zclear_untrusted_proxy_headersr   rN   rO   Zlog_untrusted_proxy_headersrP   r   r   r   socktyper'   r   r   r   r   r   r2   r?   r   r4   Zcreate_socketr   r#   
setsockoptr   r   Zset_reuse_addrbind_server_socketr!   r   r   Zserver_nameactive_channelsaccept_connections)
r3   r'   r(   r)   r*   r   r   r   r   r+   r.   r.   r/   r4      sN    




zBaseWSGIServer.__init__c                 C   s   t d S r1   NotImplementedErrorrF   r.   r.   r/   rT      s    z!BaseWSGIServer.bind_server_socketc                 C   s   t d S r1   rW   rF   r.   r.   r/   r!      s    zBaseWSGIServer.getsocknamec                 C   s   d| _ | j| jj d S )NT)	acceptingr   r   r   backlogrF   r.   r.   r/   rV     s    z!BaseWSGIServer.accept_connectionsc                 C   s   | j | d S r1   )r2   add_task)r3   taskr.   r.   r/   r[     s    zBaseWSGIServer.add_taskc                 C   s   t   }|| jkr*|| jj | _| | | jr| js\t| j| jj	kr\d| _| j
d n*| jrt| j| jj	k rd| _| j
d | j S dS )NTzXtotal open connections reached the connection limit, no longer accepting new connectionsFzJtotal open connections dropped below the connection limit, listening again)timenext_channel_cleanupr   Zcleanup_intervalmaintenancerY   in_connection_overflowr$   _mapZconnection_limitrP   warninginfo)r3   nowr.   r.   r/   readable  s.    

zBaseWSGIServer.readablec                 C   s   dS )NFr.   rF   r.   r.   r/   writable$  s    zBaseWSGIServer.writablec                 C   s   d S r1   r.   rF   r.   r.   r/   handle_read'  s    zBaseWSGIServer.handle_readc                 C   s   d S r1   r.   rF   r.   r.   r/   handle_connect*  s    zBaseWSGIServer.handle_connectc                 C   s   z,|   }|d krW d S |\}}| | W n. tk
rZ   | jjrT| jjddd Y d S X | |}| j| ||| j| j	d d S )Nz"server accept() threw an exceptionT)exc_inforQ   )
acceptset_socket_optionsOSErrorr   Zlog_socket_errorsrP   rb   fix_addrchannel_classra   )r3   vconnaddrr.   r.   r/   handle_accept-  s    	
zBaseWSGIServer.handle_acceptc              	   C   sH   z | j j| jj| j| jjd W n" ttfk
rB   | j	  Y nX d S r=   )
r?   r@   r   rA   ra   rB   rC   rD   r2   rH   rF   r.   r.   r/   rG   C  s    
zBaseWSGIServer.runc                 C   s   | j   d S r1   )r   pull_triggerrF   r.   r.   r/   rs   M  s    zBaseWSGIServer.pull_triggerc                 C   s   d S r1   r.   )r3   rp   r.   r.   r/   rk   P  s    z!BaseWSGIServer.set_socket_optionsc                 C   s   |S r1   r.   r3   rq   r.   r.   r/   rm   S  s    zBaseWSGIServer.fix_addrc                 C   s6   || j j }| j D ]}|js|j|k rd|_qdS )z
        Closes channels that have not had any activity in a while.

        The timeout is configured through adj.channel_timeout (seconds).
        TN)r   Zchannel_timeoutrU   valuesrequestsZlast_activity
will_close)r3   rd   cutoffZchannelr.   r.   r/   r_   V  s    zBaseWSGIServer.maintenancec                 C   s   |  || j| j d S r1   )r%   r9   r   r   )r3   r:   r.   r.   r/   r<   a  s    zBaseWSGIServer.print_listenc                 C   s   | j   tj| S r1   )r   rE   r
   r   rF   r.   r.   r/   rE   d  s    
zBaseWSGIServer.close)NTNNNNT)rI   rJ   rK   r   rn   r^   r   	socketmodr
   r?   r`   r4   rT   r!   rV   r[   re   rf   rg   rh   rr   rG   rs   rk   rm   r_   r<   rE   r.   r.   r.   r/   rL      s:          
A
rL   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s   | j \}}}}| | d S r1   )r   bind)r3   _Zsockaddrr.   r.   r/   rT   j  s    z TcpWSGIServer.bind_server_socketc                 C   s    | j | j | j j| j jB S r1   )ry   getnameinfor   r!   NI_NUMERICHOSTNI_NUMERICSERVrF   r.   r.   r/   r!   n  s    zTcpWSGIServer.getsocknamec                 C   s&   | j jD ]\}}}|||| qd S r1   )r   socket_optionsrS   )r3   rp   leveloptnamevaluer.   r.   r/   rk   u  s    z TcpWSGIServer.set_socket_optionsN)rI   rJ   rK   rT   r!   rk   r.   r.   r.   r/   r   i  s   r   r   c                       s6   e Zd Zd fdd	Zdd Zdd Zd	d
 Z  ZS )r   NTc           	   	      s>   |d krt jt jd d f}t j|f||||||d| d S )N)r(   r)   r*   r   r   r   )r   r   r   superr4   )	r3   r'   r(   r)   r*   r   r   r   r+   	__class__r.   r/   r4   }  s    zUnixWSGIServer.__init__c                 C   sB   t | jj | | jj tj| jjr>t| jj| jj d S r1   )	r   r   r   rz   ospathexistschmodZunix_socket_permsrF   r.   r.   r/   rT     s    z!UnixWSGIServer.bind_server_socketc                 C   s   d| j  fS )Nunix)r   r!   rF   r.   r.   r/   r!     s    zUnixWSGIServer.getsocknamec                 C   s   dS )N)	localhostNr.   rt   r.   r.   r/   rm     s    zUnixWSGIServer.fix_addr)NTNNNN)rI   rJ   rK   r4   rT   r!   rm   __classcell__r.   r.   r   r/   r   |  s         r   )NTNN)r   os.pathr   r]   Zwaitressr   Zwaitress.adjustmentsr   Zwaitress.channelr   Zwaitress.compatr   r   Zwaitress.taskr   Zwaitress.utilitiesr    r
   proxy_headersr   r0   r&   r   rL   r   r   r   Z
WSGIServerr.   r.   r.   r/   <module>   s.       
k) 7
(