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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d„ Z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   úF/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/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   O   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   X   s    zTCPSocket.set_options)F)	r1   r2   r3   r	   ÚAF_INETr
   r   r   Ú__classcell__r   r   r=   r   r4   K   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   a   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   j   s    zUnixSocket.__init__c                 C   s
   d| j  S )Nzunix:%s)r   r   r   r   r   r   x   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)   {   s    zUnixSocket.bind)N)
r1   r2   r3   r	   ÚAF_UNIXr
   r   r   r)   r@   r   r   r=   r   rF   f   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 �r’d}| |jt|ƒt|ƒd�¡ | d¡ t d¡ W 5 d}~X Y qæX  �q¬qæ|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'   Ú
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    




rv   Tc                 C   s8   | D ].}|  ¡ }| ¡  |rt|ƒtkrt |¡ qd S r   )r7   r   r\   rF   r   Úunlink)rq   rw   r   rs   r   r   r   Úclose_socketsÐ   s
    rx   c                    s   ‡ fdd„}ˆ   ˆ |¡S )Nc                     sD   t jt jjˆ jd�} | jˆ jˆ jd� ˆ j| _	ˆ j
r@|  ˆ j
¡ | S )N)Úcafile)rd   rg   )ÚsslÚcreate_default_contextÚPurposeÚCLIENT_AUTHÚca_certsÚload_cert_chainrd   rg   Ú	cert_reqsÚverify_modeÚciphersÚset_ciphers)Úcontext©r   r   r   Údefault_ssl_context_factoryÙ   s    z0ssl_context.<locals>.default_ssl_context_factory)Ússl_context)r   r†   r   r…   r   r‡   Ø   s    r‡   c                 C   s   t |ƒj| d|j|jd�S )NT)Úserver_sideÚsuppress_ragged_eofsÚdo_handshake_on_connect)r‡   Úwrap_socketr‰   rŠ   )r   r   r   r   r   Ússl_wrap_socketä   s
    
ýrŒ   )N)T)r'   r   r	   rz   rH   ro   rm   Zgunicornr   Úobjectr   r4   rA   rF   r\   rv   rx   r‡   rŒ   r   r   r   r   Ú<module>   s    :	
A
