B
    `4                 @   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sx6|jD ],}t| ||||||d}
|	|
j|
jf qW x|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 qW t|	dkr~|
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UnixWSGIServer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/   W/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/waitress/server.pycreate_server   s    
r1   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/   r0   __init__   s
    zMultiSocketServer.__init__c             C   sJ   xD| j D ]:}t|}d|d kr2d|d |d< | |j|  qW d S )N:r   z[{}])r-   listformatr&   )r3   
format_strlr/   r/   r0   print_listen   s
    zMultiSocketServer.print_listenc          	   C   sF   y | j j| jj| j| jjd W n  ttfk
r@   |   Y nX d S )N)timeoutr)   use_poll)	asyncoreloopr   asyncore_loop_timeoutr)   asyncore_use_poll
SystemExitKeyboardInterruptclose)r3   r/   r/   r0   run   s    zMultiSocketServer.runc             C   s   | j   t| j d S )N)r2   shutdownr
   Z	close_allr)   )r3   r/   r/   r0   rC      s    
zMultiSocketServer.close)NNNNN)	__name__
__module____qualname__r
   r=   r4   r:   rD   rC   r/   r/   r/   r0   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   rJ   Zclear_untrusted_proxy_headersr   rK   rL   Zlog_untrusted_proxy_headersrM   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/   r0   r4      sL    




zBaseWSGIServer.__init__c             C   s   t d S )N)NotImplementedError)r3   r/   r/   r0   rP      s    z!BaseWSGIServer.bind_server_socketc             C   s   t d S )N)rS   )r3   r/   r/   r0   r"      s    zBaseWSGIServer.getsocknamec             C   s   d| _ | j| jj d S )NT)	acceptingr   r   r   backlog)r3   r/   r/   r0   rR     s    z!BaseWSGIServer.accept_connectionsc             C   s   | j | d S )N)r2   add_task)r3   taskr/   r/   r0   rV     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maintenancerT   in_connection_overflowr%   _mapZconnection_limitrM   warninginfo)r3   nowr/   r/   r0   readable	  s"    

zBaseWSGIServer.readablec             C   s   dS )NFr/   )r3   r/   r/   r0   writable%  s    zBaseWSGIServer.writablec             C   s   d S )Nr/   )r3   r/   r/   r0   handle_read(  s    zBaseWSGIServer.handle_readc             C   s   d S )Nr/   )r3   r/   r/   r0   handle_connect+  s    zBaseWSGIServer.handle_connectc             C   s~   y |   }|d krd S |\}}W n, tk
rL   | jjrH| jjddd d S X | | | |}| j| ||| j| j	d d S )Nz"server accept() threw an exceptionT)exc_info)r)   )
acceptOSErrorr   Zlog_socket_errorsrM   r]   set_socket_optionsfix_addrchannel_classr\   )r3   vconnaddrr/   r/   r0   handle_accept.  s    

zBaseWSGIServer.handle_acceptc          	   C   sH   y | j j| jj| j| jjd W n" ttfk
rB   | j	  Y nX d S )N)r;   r)   r<   )
r=   r>   r   r?   r\   r@   rA   rB   r2   rE   )r3   r/   r/   r0   rD   @  s    zBaseWSGIServer.runc             C   s   | j   d S )N)r   pull_trigger)r3   r/   r/   r0   rn   J  s    zBaseWSGIServer.pull_triggerc             C   s   d S )Nr/   )r3   rk   r/   r/   r0   rg   M  s    z!BaseWSGIServer.set_socket_optionsc             C   s   |S )Nr/   )r3   rl   r/   r/   r0   rh   P  s    zBaseWSGIServer.fix_addrc             C   s:   || j j }x(| j D ]}|js|j|k rd|_qW 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_timeoutrQ   valuesrequestsZlast_activity
will_close)r3   r_   cutoffZchannelr/   r/   r0   rZ   S  s    zBaseWSGIServer.maintenancec             C   s   |  || j| j d S )N)r&   r7   r   r   )r3   r8   r/   r/   r0   r:   ^  s    zBaseWSGIServer.print_listenc             C   s   | j   tj| S )N)r   rC   r
   r   )r3   r/   r/   r0   rC   a  s    
zBaseWSGIServer.close)NTNNNNT)rF   rG   rH   r   ri   rY   r   	socketmodr
   r=   r[   r4   rP   r"   rR   rV   r`   ra   rb   rc   rm   rD   rn   rg   rh   rZ   r:   rC   r/   r/   r/   r0   rI      s8         
8
rI   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r   c             C   s   | j \}}}}| | d S )N)r   bind)r3   _sockaddrr/   r/   r0   rP   g  s    z TcpWSGIServer.bind_server_socketc             C   s    | j | j | j j| j jB S )N)rs   getnameinfor   r"   NI_NUMERICHOSTNI_NUMERICSERV)r3   r/   r/   r0   r"   k  s    zTcpWSGIServer.getsocknamec             C   s*   x$| j jD ]\}}}|||| q
W d S )N)r   socket_optionsrO   )r3   rk   leveloptnamevaluer/   r/   r0   rg   r  s    z TcpWSGIServer.set_socket_optionsN)rF   rG   rH   rP   r"   rg   r/   r/   r/   r0   r   f  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/   r0   r4   z  s    zUnixWSGIServer.__init__c             C   sB   t | jj | | jj tj| jjr>t| jj| jj d S )N)	r   r   r   rt   ospathexistschmodZunix_socket_perms)r3   r/   r/   r0   rP     s    z!UnixWSGIServer.bind_server_socketc             C   s   d| j  fS )Nunix)r   r"   )r3   r/   r/   r0   r"     s    zUnixWSGIServer.getsocknamec             C   s   dS )N)	localhostNr/   )r3   rl   r/   r/   r0   rh     s    zUnixWSGIServer.fix_addr)NTNNNN)rF   rG   rH   r4   rP   r"   rh   __classcell__r/   r/   )r   r0   r   y  s        r   )NTNN)r   os.pathr   rX   Zwaitressr   Zwaitress.adjustmentsr   Zwaitress.channelr   Zwaitress.compatr   r   Zwaitress.taskr   Zwaitress.utilitiesr    r
   proxy_headersr   r1   r'   r   rI   r   r   r   Z
WSGIServerr/   r/   r/   r0   <module>   s,      
f) 4
(