U
    d                     @   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tj}d}n t|| jtj}t| 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-unpacked-wheel-1tw_qy24/gunicorn/sock.py__init__   s    
zBaseSocket.__init__c                 C   s   d| 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   | tjtjd | jjrtttdrtz| tjtjd W n8 tjk
rr } z|j	t	j
t	jfkrb W 5 d }~X Y nX |s| | |d t|dr|d || jj |S )N   SO_REUSEPORTr   set_inheritableT)
setsockoptr	   
SOL_SOCKETSO_REUSEADDRr   
reuse_porthasattrr   errorerrnoZENOPROTOOPTEINVALbindsetblockingr    listenbacklog)r   r   r   errr   r   r   r   '   s     



zBaseSocket.set_optionsc                 C   s   | | j d S r   )r)   r   )r   r   r   r   r   r)   ;   s    zBaseSocket.bindc              
   C   s^   | j d krd S z| j   W n6 tjk
rR } z| jdt| W 5 d }~X Y 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 }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"   | 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)	r1   r2   r3   r	   AF_INETr
   r   r   __classcell__r   r   r=   r   r4   J   s   	r4   c                   @   s   e Zd ZejZdd ZdS )
TCP6Socketc                 C   s   | j  \}}}}d||f S )Nzhttp://[%s]:%d)r   r7   )r   hostport_r   r   r   r   `   s    zTCP6Socket.__str__N)r1   r2   r3   r	   AF_INET6r
   r   r   r   r   r   rA   \   s   rA   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rpzt |}W n4 tk
rJ } z|jd tjkr: W 5 d }~X Y n&X t|jrdt | 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
ValueErrorr<   r   )r   r9   r   r   r   str0   r=   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 t| j| jj| jj t | d S r   )	r   umaskr   r)   r   r   chownuidgid)r   r   Z	old_umaskr   r   r   r)   z   s    zUnixSocket.bind)N)
r1   r2   r3   r	   AF_UNIXr
   r   r   r)   r@   r   r   r=   r   rF   e   s   rF   c                 C   sH   t | tr$t| d rt}qDt}n t | ttfr8t}nt	d|  |S )Nr   z Unable to create socket from: %r)

isinstancetupler   is_ipv6rA   r4   r/   bytesrF   	TypeError)r9   	sock_typer   r   r   
_sock_type   s    
r\   c                 C   s  g }| j }dd |D }|r(|t|7 }dd |D }| jrXtj| jsXtd| j | jrztj| jsztd| j |r|D ]@}t	|tj
tj}| }	t|	}
|
|	| ||d}|| q|S |D ]}t|}
d}tdD ]}z|
|| |}W n tjk
r } z|jd	 tjkr2|d
t| |jd	 tjkrT|dt| |dk rd}||jt|t|d |d td W 5 d}~X Y qX  qq|dkr|dt| td || q|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   rV   int.0r)   r   r   r   
<listcomp>   s     
 z"create_sockets.<locals>.<listcomp>c                 S   s   g | ]}t |ts|qS r   r]   r_   r   r   r   ra      s     
 zcertfile "%s" does not existzkeyfile "%s" does not existrG   N   r   zConnection in use: %szInvalid address: %sz$connection to {addr} failed: {error})r9   r&   zRetrying in 1 second.r   zCan't connect to %s)r   listcertfiler   pathexistsrO   keyfiler	   r   rU   r   r7   r\   appendranger&   rJ   r'   Z
EADDRINUSEr/   ZEADDRNOTAVAILdebugformattimesleepsysexit)r   r   Zfds	listenersr9   Zfdaddrladdrr   r   	sock_namer[   Zlistenerir0   msgr   r   r   create_sockets   sP    




ru   Tc                 C   s8   | D ].}|  }|  |rt|tkrt| qd S r   )r7   r   r\   rF   r   unlink)rp   rv   r   rr   r   r   r   close_sockets   s
    rw   )N)T)r'   r   r	   rH   rn   rl   Zgunicornr   objectr   r4   rA   rF   r\   ru   rw   r   r   r   r   <module>   s   :	
A