o
    [Þh²  ã                   @   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ƒ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 u rt | 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   úM/var/www/html/premium_crap/venv/lib/python3.10/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r:ttdƒr:z|  tjtjd¡ W n ty9 } z|j	t	j
t	jfvr/‚ W Y d }~nd }~ww |sA|  |¡ | d¡ t|dƒrP| d¡ | | jj¡ |S )Né   ÚSO_REUSEPORTr   Úset_inheritableT)Ú
setsockoptr	   Ú
SOL_SOCKETÚSO_REUSEADDRr   Ú
reuse_portÚhasattrr   ÚOSErrorÚerrnoÚ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 u rd S z| j  ¡  W n ty) } z| j dt|ƒ¡ W Y d }~nd }~ww d | _ d S )NzError while closing socket %s)r   r   r&   r   ÚinfoÚstr)r   Úer   r   r   r   >   s   
€ÿ
zBaseSocket.closer   ©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   Ú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_optionsr2   )	r3   r4   r5   r	   ÚAF_INETr
   r   r   Ú__classcell__r   r   r@   r   r6   J   s    	r6   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   r:   )r   ÚhostÚportÚ_r   r   r   r   `   s   zTCP6Socket.__str__N)r3   r4   r5   r	   ÚAF_INET6r
   r   r   r   r   r   rD   \   s    rD   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 u r9zt  |¡}W n ty& } z|jd tjkr‚ W Y d }~nd }~ww t |j¡r3t  |¡ nt	d| ƒ‚t
ƒ j||||d� d S )Nr   z%r is not a socket©r   )r   Ústatr&   Úargsr'   ÚENOENTÚS_ISSOCKÚst_modeÚremoveÚ
ValueErrorr?   r   )r   r<   r   r   r   Ústr1   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   Ú	old_umaskr   r   r   r*   z   s   zUnixSocket.bindr   )
r3   r4   r5   r	   ÚAF_UNIXr
   r   r   r*   rC   r   r   r@   r   rI   e   s
    rI   c                 C   sJ   t | tƒrt | d ¡rt}|S t}|S t | ttfƒrt}|S t	d|  ƒ‚)Nr   z Unable to create socket from: %r)
Ú
isinstanceÚtupler   Úis_ipv6rD   r6   r0   ÚbytesrI   Ú	TypeError)r<   Ú	sock_typer   r   r   Ú
_sock_type�   s   
ûüÿr_   c                 C   sÎ  g }| j }dd„ |D ƒ}|r|t|ƒ7 }dd„ |D ƒ}| jr,tj | j¡s,td| j ƒ‚| jr=tj | j¡s=td| j ƒ‚|rd|D ] }t 	|tj
tj¡}| ¡ }	t|	ƒ}
|
|	| ||d�}| |¡ qA|S |D ]~}t|ƒ}
d}tdƒD ][}z|
|| |ƒ}W nP tyÌ } zD|jd	 tjkr”| d
t|ƒ¡ |jd	 tjkr¤| dt|ƒ¡ d}| |jt|ƒt|ƒd�¡ |dk rÂ| d¡ t d¡ W Y d}~qrd}~ww  |du rß| dt|ƒ¡ t d¡ | |¡ qf|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   ©rY   Úint©Ú.0r*   r   r   r   Ú
<listcomp>š   ó    z"create_sockets.<locals>.<listcomp>c                 S   s   g | ]	}t |tƒs|‘qS r   r`   rb   r   r   r   rd   �   re   zcertfile "%s" does not existzkeyfile "%s" does not existrJ   Né   r   zConnection in use: %szInvalid address: %sz$connection to {addr} failed: {error})r<   ÚerrorzRetrying in 1 second.r   zCan't connect to %s)r   ÚlistÚcertfiler   ÚpathÚexistsrQ   Úkeyfiler	   r   rX   r   r:   r_   ÚappendÚranger&   rL   r'   Ú
EADDRINUSErg   r0   ÚEADDRNOTAVAILÚformatÚdebugÚtimeÚsleepÚsysÚexit)r   r   ÚfdsÚ	listenersr<   ÚfdaddrÚladdrr   r   Ú	sock_namer^   ÚlistenerÚir1   Úmsgr   r   r   Úcreate_socketsŽ   sT   

€÷
r   Tc                 C   s8   | D ]}|  ¡ }| ¡  |rt|ƒtu rt |¡ qd S r   )r:   r   r_   rI   r   Úunlink)rx   r€   r   r{   r   r   r   Úclose_socketsÏ   s   
€ür�   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)ri   rl   )ÚsslÚcreate_default_contextÚPurposeÚCLIENT_AUTHÚca_certsÚload_cert_chainri   rl   Ú	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•   r   )T)r'   r   r	   rƒ   rK   ru   rs   Úgunicornr   r   r6   rD   rI   r_   r   r�   r�   r•   r   r   r   r   Ú<module>   s"   :	

A