U
    Ýáhƒ  ã                   @   sr   d dl Z d dlZd dlZd dlZddlmZ G dd„ dƒZejdkrZG dd„ deejƒZ	nG d	d„ deej
ƒZ	dS )
é    Né   )Ú	wasyncorec                   @   sV   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
ddd„Zdd„ ZdS )Ú_triggerbasez9OS-independent base class for OS-dependent trigger class.Nc                 C   s   d| _ t ¡ | _g | _d S ©NF)Ú_closedÚ	threadingÚLockÚlockÚthunks©Úself© r   úB/var/www/html/venv/lib/python3.8/site-packages/waitress/trigger.pyÚ__init__:   s    
z_triggerbase.__init__c                 C   s   dS ©NTr   r   r   r   r   ÚreadableF   s    z_triggerbase.readablec                 C   s   dS r   r   r   r   r   r   ÚwritableI   s    z_triggerbase.writablec                 C   s   d S ©Nr   r   r   r   r   Úhandle_connectL   s    z_triggerbase.handle_connectc                 C   s   |   ¡  d S r   )Úcloser   r   r   r   Úhandle_closeO   s    z_triggerbase.handle_closec                 C   s    | j sd| _ |  ¡  |  ¡  d S r   )r   Zdel_channelÚ_closer   r   r   r   r   V   s    z_triggerbase.closec              	   C   s.   |r"| j  | j |¡ W 5 Q R X |  ¡  d S r   )r	   r
   ÚappendÚ_physical_pull)r   Úthunkr   r   r   Úpull_trigger\   s    z_triggerbase.pull_triggerc                 C   s”   z|   d¡ W n tk
r$   Y d S X | j^ | jD ]J}z
|ƒ  W q4   t ¡ \}}}}|  d|› d|› d|› d¡ Y q4X q4g | _W 5 Q R X d S )Ni    zexception in trigger thunk: (ú:ú ú))ÚrecvÚOSErrorr	   r
   r   Zcompact_tracebackZlog_info)r   r   ÚnilÚtÚvZtbinfor   r   r   Úhandle_readb   s    

&z_triggerbase.handle_read)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úkindr   r   r   r   r   r   r   r$   r   r   r   r   r   5   s   
r   Úposixc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚtriggerÚpipec                 C   s4   t  | ¡ t ¡  \}| _| _tjj| ||d d S )N©Úmap)r   r   Úosr,   r+   Ú_fdsr   Úfile_dispatcher)r   r.   Úrr   r   r   r   v   s    
útrigger.__init__c                 C   s,   | j D ]}t |¡ qg | _ tj | ¡ d S r   )r0   r/   r   r   r1   )r   Úfdr   r   r   r   {   s    
útrigger._closec                 C   s   t  | jd¡ d S ©Nó   x)r/   Úwriter+   r   r   r   r   r      s    útrigger._physical_pullN©r%   r&   r'   r)   r   r   r   r   r   r   r   r+   s   s   r+   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r+   Zloopbackc           	   
   C   sø   t  | ¡ t ¡ }| tjtjd¡ d}|d7 }t ¡ }| d¡ | ¡ }| d¡ z| 	|¡ W qÈW q( t
k
rÄ } z@t|dd ƒtjkrŒ‚ |dkr¬| ¡  | ¡  tdƒ‚| ¡  W 5 d }~X Y q(X q(| ¡ \}}| ¡  || _tjj| ||d d S )Nr   r   )z	127.0.0.1r   Úwinerroré
   zCannot bind trigger!r-   )r   r   ÚsocketÚ
setsockoptÚIPPROTO_TCPÚTCP_NODELAYÚbindÚgetsocknameÚlistenÚconnectr    ÚgetattrÚerrnoZWSAEADDRINUSEr   ÚRuntimeErrorÚacceptr+   r   Ú
dispatcher)	r   r.   ÚwÚcountÚaZconnect_addressÚdetailr2   Úaddrr   r   r   r   ‹   s0    



r3   c                 C   s   | j  ¡  | j ¡  d S r   )r=   r   r+   r   r   r   r   r   Â   s    
r5   c                 C   s   | j  d¡ d S r6   )r+   Úsendr   r   r   r   r   Ç   s    r9   Nr:   r   r   r   r   r+   ˆ   s   7)rF   r/   r=   r   Ú r   r   Únamer1   r+   rI   r   r   r   r   Ú<module>   s   !<
