o
    iO$                     @   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Zd dlm	Z	 ej
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d Zdd Zdd ZdS )    N)utilc                   @   sH   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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   A/home/ubuntu/.local/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   A   s   

zBaseSocket.closec                 C      dS Nr   r   r   r   r   get_backlogL      zBaseSocket.get_backlogr   F)
__name__
__module____qualname__r   r   r   r   r*   r   r5   r   r   r   r   r      s    

r   c                       sL   e Zd ZejZdd Zd
 fdd	Zedkrdd Z	  Z
S 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   T   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   ]   s   zTCPSocket.set_optionslinuxc              	   C   sN   | j r%d}z| j tjtjd}t||d W S  ttfy$   Y dS w dS )N BBBBBBBBIIIIIIIIIIIIIIIIIIIIIIIIh      r   )	r   
getsockoptr	   rB   TCP_INFOstructunpackAttributeErrorr&   )r   fmttcp_info_structr   r   r   r5   b   s   
zTCPSocket.get_backlogc                 C   r2   r3   r   r   r   r   r   r5   o   r6   r7   )r8   r9   r:   r	   AF_INETr
   r   r   PLATFORMr5   __classcell__r   r   rE   r   r;   P   s    	r;   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   w   s   zTCP6Socket.__str__N)r8   r9   r:   r	   AF_INET6r
   r   r   r   r   r   rU   s   s    rU   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
ValueErrorrD   r   )r   rA   r   r   r   str1   rE   r   r   r      s   zUnixSocket.__init__c                 C   s
   d| j  S )Nzunix:%s)r   r   r   r   r   r      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*      s   zUnixSocket.bindr   )
r8   r9   r:   r	   AF_UNIXr
   r   r   r*   rT   r   r   rE   r   rZ   |   s
    rZ   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_ipv6rU   r;   r0   bytesrZ   	TypeError)rA   	sock_typer   r   r   
_sock_type   s   
rp   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   rj   int.0r*   r   r   r   
<listcomp>       z"create_sockets.<locals>.<listcomp>c                 S   s   g | ]	}t |ts|qS r   rq   rs   r   r   r   ru      rv   zcertfile "%s" does not existzkeyfile "%s" does not existr[   N   r   zConnection in use: %szInvalid address: %sz$connection to {addr} failed: {error})rA   errorzRetrying in 1 second.r   zCan't connect to %s)r   listcertfiler   pathexistsrb   keyfiler	   r   ri   r   r?   rp   appendranger&   r]   r'   
EADDRINUSErx   r0   EADDRNOTAVAILformatdebugtimesleepsysexit)r   r   fds	listenersrA   fdaddrladdrr   r   	sock_namero   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   rp   rZ   r   unlink)r   r   r   r   r   r   r   close_sockets   s   
r   c                 C   sd   ddl m} | j}|sg S d|vrg S ddlm} | sg S g }|D ]}||v r/|||  q"|S )zGet ALPN protocol list from configuration.

    Returns list of ALPN protocol identifiers based on http_protocols setting.
    Returns empty list if HTTP/2 is not configured or available.
    r   )ALPN_PROTOCOL_MAPh2)is_http2_available)gunicorn.configr   http_protocolsgunicorn.http2r   r~   )r   r   r   r   alpn_protocolsprotor   r   r   _get_alpn_protocols   s   r   c                    s    fdd}   |S )Nc                     sZ   t jt jj jd} | j j jd  j| _	 j
r |  j
 t }|r+| | | S )N)cafile)rz   r}   )sslcreate_default_contextPurposeCLIENT_AUTHca_certsload_cert_chainrz   r}   	cert_reqsverify_modeciphersset_ciphersr   set_alpn_protocols)contextr   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   c              	   C   s6   t | tjsdS z|  W S  ttjfy   Y dS w )zGet the negotiated ALPN protocol from an SSL socket.

    Returns:
        str: The negotiated protocol name ('h2', 'http/1.1', etc.)
             or None if no protocol was negotiated.
    N)rj   r   	SSLSocketselected_alpn_protocolrO   SSLError)
ssl_socketr   r   r   get_negotiated_protocol$  s   
r   c                 C   s   t | }|dkS )zyCheck if HTTP/2 was negotiated on an SSL socket.

    Returns:
        bool: True if HTTP/2 was negotiated via ALPN.
    r   )r   )r   protocolr   r   r   is_http2_negotiated4  s   r   r   )T)r'   r   r	   r   r\   rM   r   r   gunicornr   platformrS   r   r;   rU   rZ   rp   r   r   r   r   r   r   r   r   r   r   r   <module>   s,   =#	

A