
    AҐiO$                         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      Z G d de      Z G d de      Z G d	 d
e      Zd ZddZddZd Zd Zd Zd Zd Zy)    N)utilc                   :    e Zd Zd	dZd Zd Zd
dZd Zd Zd Z	y)
BaseSocketNc                 P   || _         || _        || _        |1t        j                  | j                  t        j
                        }d}nFt        j                  || j                  t        j
                        }t        j                  |       d}| j                  ||      | _
        y )NFTbound)logconfcfg_addrsocketFAMILYSOCK_STREAMfromfdoscloseset_optionssock)selfaddressr
   r	   fdr   r   s          F/var/www/descvideos/venv/lib/python3.12/site-packages/gunicorn/sock.py__init__zBaseSocket.__init__   s~    	:==f.@.@ADE==T[[&2D2DEDHHRLE$$T$7	    c                 <    d| j                   j                         z  S )Nz<socket %d>)r   filenor   s    r   __str__zBaseSocket.__str__$   s    tyy//111r   c                 .    t        | j                  |      S N)getattrr   )r   names     r   __getattr__zBaseSocket.__getattr__'   s    tyy$''r   c                 b   |j                  t        j                  t        j                  d       | j                  j
                  r@t        t        d      r0	 |j                  t        j                  t        j                  d       |s| j                  |       |j                  d       t        |d      r|j                  d       |j                  | j                  j                          |S # t        $ r7}|j                  t        j                  t        j                  fvr Y d }~d }~ww xY w)N   SO_REUSEPORTr   set_inheritableT)
setsockoptr   
SOL_SOCKETSO_REUSEADDRr
   
reuse_porthasattrr%   OSErrorerrnoENOPROTOOPTEINVALbindsetblockingr&   listenbacklog)r   r   r   errs       r   r   zBaseSocket.set_options*   s    ))6+>+>BII  FN3 1 163F3FJ IIdO 4*+  &DII%%&  99U%6%6$EE Fs   /C. .	D.7-D))D.c                 :    |j                  | j                         y r   )r0   r   )r   r   s     r   r0   zBaseSocket.bind>   s    		$-- r   c                     | j                   y 	 | j                   j                          d | _         y # t        $ r6}| j                  j	                  dt        |             Y d }~d | _         y d }~ww xY w)NzError while closing socket %s)r   r   r,   r	   infostr)r   es     r   r   zBaseSocket.closeA   sa    99	CIIOO 	  	CHHMM93q6BB		Cs   1 	A0%A++A0c                      yN r   s    r   get_backlogzBaseSocket.get_backlogL   s    r   r   F)
__name__
__module____qualname__r   r   r"   r   r0   r   r>   r=   r   r   r   r      s%    82((!	r   r   c                   \     e Zd Zej                  Zd Zd fd	Zedk(  rd Z	 xZ
S d Z	 xZ
S )	TCPSocketc                     | j                   j                  rd}nd}| j                  j                         }d||d   |d   fz  S )Nhttpshttpz
%s://%s:%dr   r$   )r
   is_sslr   getsockname)r   schemeaddrs      r   r   zTCPSocket.__str__T   sE    99FFyy$$&vtAwQ888r   c                     |j                  t        j                  t        j                  d       t        |   ||      S )Nr$   r   )r'   r   IPPROTO_TCPTCP_NODELAYsuperr   )r   r   r   	__class__s      r   r   zTCPSocket.set_options]   s4    **F,>,>Bw"4u"55r   linuxc                     | j                   rUd}	 | j                   j                  t        j                  t        j                  d      }t        j                  ||      d   S y# t        t        f$ r Y yw xY w)N BBBBBBBBIIIIIIIIIIIIIIIIIIIIIIIIh      r   )	r   
getsockoptr   rM   TCP_INFOstructunpackAttributeErrorr,   )r   fmttcp_info_structs      r   r>   zTCPSocket.get_backlogb   sr    yy(&*ii&:&:6;M;M;A??C'QO "==o>rBB  '0 s   AA# #A54A5c                      yr;   r=   r   s    r   r>   zTCPSocket.get_backlogo   s    r   r?   )r@   rA   rB   r   AF_INETr   r   r   PLATFORMr>   __classcell__rP   s   @r   rD   rD   P   s*    ^^F96 7		r   rD   c                   *    e Zd Zej                  Zd Zy)
TCP6Socketc                 N    | j                   j                         \  }}}}d||fz  S )Nzhttp://[%s]:%d)r   rI   )r   hostport_s       r   r   zTCP6Socket.__str__w   s,    !YY224tQ4,..r   N)r@   rA   rB   r   AF_INET6r   r   r=   r   r   rc   rc   s   s    __F/r   rc   c                   D     e Zd Zej                  Zd fd	Zd Zd Z xZ	S )
UnixSocketc                 P   |Y	 t        j                  |      }t        j                  |j                        rt        j                  |       nt        d|z        t        | -  ||||       y # t        $ r+}|j                  d   t        j                  k7  r Y d }~Cd }~ww xY w)Nz%r is not a socketr   r   )r   statS_ISSOCKst_moderemove
ValueErrorr,   argsr-   ENOENTrO   r   )r   rK   r
   r	   r   str9   rP   s          r   r   zUnixSocket.__init__   s    :	BWWT]
 ==,IIdO$%9D%@AAtSR0  66!9, -s   A1 1	B%:!B  B%c                      d| j                   z  S )Nzunix:%s)r   r   s    r   r   zUnixSocket.__str__   s    4==((r   c                 H   t        j                  | j                  j                        }|j                  | j                         t        j                  | j                  | j                  j                  | j                  j                         t        j                  |       y r   )	r   umaskr
   r0   r   r   chownuidgid)r   r   	old_umasks      r   r0   zUnixSocket.bind   sX    HHTYY__-			$-- 

4==$))--?
r   r   )
r@   rA   rB   r   AF_UNIXr   r   r   r0   r`   ra   s   @r   rj   rj   |   s    ^^F1)r   rj   c                     t        | t              r(t        j                  | d         rt        }|S t
        }|S t        | t        t        f      rt        }|S t        d| z        )Nr   z Unable to create socket from: %r)

isinstancetupler   is_ipv6rc   rD   r8   bytesrj   	TypeError)rK   	sock_types     r   
_sock_typer      sh    $<<Q "I  "I
 	 
D3,	'	  :TABBr   c                    g }| j                   }|D cg c]  }t        |t              s| }}|r|t        |      z  }|D cg c]  }t        |t              r| }}| j                  rAt
        j                  j                  | j                        st        d| j                  z        | j                  rAt
        j                  j                  | j                        st        d| j                  z        |rt|D ]m  }t        j                  |t        j                  t        j                        }	|	j                         }
t        |
      } ||
| ||      }|j!                  |       o |S |D ]n  }t        |      }d}	t#        d      D ]  }	  ||| |      }	 n |	0|j-                  dt/        |             t;        j<                  d       |j!                  |	       p |S c c}w c c}w # t$        $ r}|j&                  d   t(        j*                  k(  r|j-                  dt/        |             |j&                  d   t(        j0                  k(  r|j-                  dt/        |             d	}|j-                  |j3                  t/        |      t/        |      
             |dk  r&|j5                  d       t7        j8                  d       Y d}~Hd}~ww xY w)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.
    zcertfile "%s" does not existzkeyfile "%s" does not existrl   N   r   zConnection in use: %szInvalid address: %sz$connection to {addr} failed: {error})rK   errorzRetrying in 1 second.r$   zCan't connect to %s)r   r~   intlistcertfiler   pathexistsrq   keyfiler   r   r|   r   rI   r   appendranger,   rr   r-   
EADDRINUSEr   r8   EADDRNOTAVAILformatdebugtimesleepsysexit)r
   r	   fds	listenersrK   r0   fdaddrladdrr   r   	sock_namer   listenerir9   msgs                   r   create_socketsr      sg    I <<D#=tz$'<d=F=
$s)"@d*T3*?T@E@ }}RWW^^DMM:7$--GHH||BGGNN4<<86EFF  	'B==V^^V5G5GHD((*I"9-I D#"=HX&	'   t$	q 	A tS1 	  <II+SY7HHQK/2 e > A8  	"66!9 0 00II5s4yA66!9 3 33II3SY?<		#**#d)3q6*BCq5II56JJqM	"s/   G$G$G)G)
G..	K7CKKc                     | D ]L  }|j                         }|j                          |s&t        |      t        u s8t	        j
                  |       N y r   )rI   r   r   rj   r   unlink)r   r   r   r   s       r   close_socketsr      sC     !$$&	

j+z9IIi 	!r   c                     ddl m} | j                  }|sg S d|vrg S ddlm}  |       sg S g }|D ]  }||v s|j                  ||           |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protos         r   _get_alpn_protocolsr      st     2((N	 >!	 2	 N <%%!!"3E":;< r   c                 2      fd} j                   |      S )Nc                  t   t        j                  t         j                  j                  j                        } | j                  j                  j                         j                  | _	        j                  r| j                  j                         t              }|r| j                  |       | S )N)cafile)r   r   )sslcreate_default_contextPurposeCLIENT_AUTHca_certsload_cert_chainr   r   	cert_reqsverify_modeciphersset_ciphersr   set_alpn_protocols)contextr   r
   s     r   default_ssl_context_factoryz0ssl_context.<locals>.default_ssl_context_factory  s    ,,S[[-D-DT]][M"nn<<- -T2&&~6r   )ssl_context)r
   r   s   ` r   r   r     s     D"=>>r   c                 f    t        |      j                  | d|j                  |j                        S )NT)server_sidesuppress_ragged_eofsdo_handshake_on_connect)r   wrap_socketr   r   )r   r
   s     r   ssl_wrap_socketr     s8    t((59>B>W>WAEA]A] ) _ _r   c                     t        | t        j                        sy	 | j                         S # t        t        j
                  f$ r Y yw xY 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)r~   r   	SSLSocketselected_alpn_protocolrZ   SSLError)
ssl_sockets    r   get_negotiated_protocolr   $  sD     j#--00022CLL) s   - A	A	c                 "    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   protocols     r   is_http2_negotiatedr   4  s     'z2Htr   r   )T)r-   r   r   r   rm   rX   r   r   gunicornr   platformr_   r   rD   rc   rj   r   r   r   r   r   r   r   r   r=   r   r   <module>r      s   
  	  
   
  <<: :z 
  F/ / 8
>B!:?$_ r   