3
ûZð]Þ  ã               @   sœ   d dl Z d dlZ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eƒZ	G dd„ de	ƒZ
G dd„ de
ƒZG d	d
„ d
e	ƒZdd„ Zddd„Zddd„ZdS )é    N)Úutilc               @   s@   e Zd Zddd„Zdd„ Zdd„ Zdd	d
„Zdd„ Zdd„ ZdS )Ú
BaseSocketNc             C   sd   || _ || _|| _|d kr0tj| jtjƒ}d}n tj|| jtjƒ}tj|ƒ d}| j	||d�| _
d S )NFT)Úbound)ÚlogÚconfÚcfg_addrÚsocketÚFAMILYÚSOCK_STREAMÚfromfdÚosÚcloseÚset_optionsÚsock)ÚselfÚaddressr   r   Úfdr   r   © r   ú1/tmp/pip-build-w1as9q70/gunicorn/gunicorn/sock.pyÚ__init__   s    
zBaseSocket.__init__c             C   s   d| j jƒ  S )Nz<socket %d>)r   Úfileno)r   r   r   r   Ú__str__!   s    zBaseSocket.__str__c             C   s   t | j|ƒS )N)Úgetattrr   )r   Únamer   r   r   Ú__getattr__$   s    zBaseSocket.__getattr__Fc             C   s²   |j tjtjdƒ | jjrtttdƒrty|j tjtjdƒ W n8 tjk
rr } z|j	t	j
t	jfkrb‚ W Y d d }~X nX |s‚| j|ƒ |jdƒ t|dƒr |jdƒ |j| jjƒ |S )Né   ÚSO_REUSEPORTr   Úset_inheritableT)Ú
setsockoptr   Ú
SOL_SOCKETÚSO_REUSEADDRr   Z
reuse_portÚhasattrr   ÚerrorÚerrnoZENOPROTOOPTÚEINVALÚbindÚsetblockingr   ÚlistenZbacklog)r   r   r   Úerrr   r   r   r   '   s    




zBaseSocket.set_optionsc             C   s   |j | jƒ d S )N)r%   r   )r   r   r   r   r   r%   ;   s    zBaseSocket.bindc             C   s^   | j d krd S y| j jƒ  W n6 tjk
rR } z| jjdt|ƒƒ W Y d d }~X nX d | _ d S )NzError while closing socket %s)r   r   r   r"   r   ÚinfoÚstr)r   Úer   r   r   r   >   s    
$zBaseSocket.close)N)F)	Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r%   r   r   r   r   r   r      s   

r   c                   s,   e Zd ZejZdd„ Zd‡ fdd„	Z‡  ZS )Ú	TCPSocketc             C   s2   | j jrd}nd}| jjƒ }d||d |d f S )NÚhttpsÚhttpz
%s://%s:%dr   r   )r   Zis_sslr   Úgetsockname)r   ÚschemeÚaddrr   r   r   r   N   s
    
zTCPSocket.__str__Fc                s"   |j tjtjdƒ tƒ j||d�S )Nr   )r   )r   r   ÚIPPROTO_TCPÚTCP_NODELAYÚsuperr   )r   r   r   )Ú	__class__r   r   r   W   s    zTCPSocket.set_options)F)	r,   r-   r.   r   ÚAF_INETr	   r   r   Ú__classcell__r   r   )r8   r   r/   J   s   	r/   c               @   s   e Zd ZejZdd„ ZdS )Ú
TCP6Socketc             C   s   | j jƒ \}}}}d||f S )Nzhttp://[%s]:%d)r   r2   )r   ÚhostÚportÚ_r   r   r   r   `   s    zTCP6Socket.__str__N)r,   r-   r.   r   ÚAF_INET6r	   r   r   r   r   r   r;   \   s   r;   c                   s4   e Zd ZejZd‡ fdd„	Zdd„ Zdd„ Z‡  Z	S )	Ú
UnixSocketNc                sˆ   |d krpyt j|ƒ}W n4 tk
rJ } z|jd tjkr:‚ W Y d d }~X n&X tj|jƒrdt j|ƒ nt	d| ƒ‚t
ƒ j||||d� d S )Nr   z%r is not a socket)r   )r   ÚstatÚOSErrorÚargsr#   ÚENOENTÚS_ISSOCKÚst_modeÚremoveÚ
ValueErrorr7   r   )r   r4   r   r   r   Ústr+   )r8   r   r   r   i   s    zUnixSocket.__init__c             C   s
   d| j  S )Nzunix:%s)r   )r   r   r   r   r   w   s    zUnixSocket.__str__c             C   s@   t j| jjƒ}|j| jƒ tj| j| jj| jjƒ t j|ƒ d S )N)	r   Úumaskr   r%   r   r   ÚchownÚuidÚgid)r   r   Z	old_umaskr   r   r   r%   z   s    zUnixSocket.bind)N)
r,   r-   r.   r   ÚAF_UNIXr	   r   r   r%   r:   r   r   )r8   r   r@   e   s   r@   c             C   sH   t | tƒr$tj| d ƒrt}qDt}n t | ttfƒr8t}nt	d|  ƒ‚|S )Nr   z Unable to create socket from: %r)
Ú
isinstanceÚtupler   Zis_ipv6r;   r/   r*   Úbytesr@   Ú	TypeError)r4   Ú	sock_typer   r   r   Ú
_sock_type�   s    
rT   c             C   sî  g }| j }dd„ |D ƒ}|r(|t|ƒ7 }dd„ |D ƒ}| jrZtjj| jƒ rZtd| j ƒ‚| jr~tjj| jƒ r~td| j ƒ‚|rÐxH|D ]@}tj	|tj
tjƒ}|jƒ }	t|	ƒ}
|
|	| ||d�}|j|ƒ qˆW |S �x|D �]}t|ƒ}
d}xÌtdƒD ]À}y|
|| |ƒ}W n¨ tjk
�r° } zˆ|jd	 tjk�r@|jd
t|ƒƒ |jd	 tjk�rb|jdt|ƒƒ |dk �r d}|j|jt|ƒt|ƒd�ƒ |jdƒ tjdƒ W Y dd}~X qôX P qôW |dk�rÜ|jdt|ƒƒ tjdƒ |j|ƒ qØW |S )zì
    Create a new socket for the configured addresses or file descriptors.

    If a configured address is a tuple then a TCP socket is created.
    If it is a string, a Unix socket is created. Otherwise, a TypeError is
    raised.
    c             S   s   g | ]}t |tƒr|‘qS r   )rO   Úint)Ú.0r%   r   r   r   ú
<listcomp>š   s    z"create_sockets.<locals>.<listcomp>c             S   s   g | ]}t |tƒs|‘qS r   )rO   rU   )rV   r%   r   r   r   rW   �   s    zcertfile "%s" does not existzkeyfile "%s" does not exist)r   Né   r   zConnection in use: %szInvalid address: %sz$connection to {addr} failed: {error})r4   r"   zRetrying in 1 second.r   zCan't connect to %s)r   ÚlistÚcertfiler   ÚpathÚexistsrH   Úkeyfiler   r   rN   r
   r2   rT   ÚappendÚranger"   rC   r#   Z
EADDRINUSEr*   ZEADDRNOTAVAILÚdebugÚformatÚtimeÚsleepÚsysÚexit)r   r   ZfdsÚ	listenersr4   ZfdaddrÚladdrr   r   Ú	sock_namerS   ZlistenerÚir+   Úmsgr   r   r   Úcreate_socketsŽ   sP    




rk   Tc             C   s<   x6| D ].}|j ƒ }|jƒ  |rt|ƒtkrtj|ƒ qW d S )N)r2   r   rT   r@   r   Úunlink)rf   rl   r   rh   r   r   r   Úclose_socketsÏ   s
    
rm   )N)T)r#   r   r   rA   rd   rb   Zgunicornr   Úobjectr   r/   r;   r@   rT   rk   rm   r   r   r   r   Ú<module>   s   :	
A