Ë
    }ëë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          ú>/var/www/eb/venv/lib/python3.12/site-packages/gunicorn/sock.pyÚ__init__zBaseSocket.__init__   s~   € ØˆŒØˆŒ	àˆŒØˆ:Ü—=‘= §¡¬f×.@Ñ.@ÓAˆDØ‰Eä—=‘=  T§[¡[´&×2DÑ2DÓEˆDÜ�H‰H�RŒLØˆEà×$Ñ$ T°Ð$Ó7ˆ�	ó    c                 ó<   — d| j                   j                  «       z  S )Nz<socket %d>)r   Úfileno©r   s    r   Ú__str__zBaseSocket.__str__$   s   € Ø˜tŸy™y×/Ñ/Ó1Ñ1Ð1r   c                 ó.   — t        | j                  |«      S ©N)Úgetattrr   )r   Únames     r   Ú__getattr__zBaseSocket.__getattr__'   s   € Ü�t—y‘y $Ó'Ð'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Ø�I‰I× Ò ÜœF NÔ3ðØ—‘¤× 1Ñ 1´6×3FÑ3FÈÔJñ Ø�I‰I�dŒOØ×Ñ˜Ôô �4Ð*Ô+Ø× Ñ  Ô&à�‰�D—I‘I×%Ñ%Ô&Øˆøô ò Ø—9‘9¤U×%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   € Ø�9‰9ÐØð	CØ�I‰I�O‰OÔð ˆ�	øô ò 	CØ�H‰H�M‰MÐ9¼3¸q»6×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   € Ø�9‰9×ÒØ‰FàˆFà�y‰y×$Ñ$Ó&ˆØ˜v t¨A¡w°°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Ñ" 4¨uÐ"Ó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Ú BBBBBBBBIIIIIIIIIIIIIIIIIIIIIIIIéh   é   r   )	r   Ú
getsockoptr   rM   ÚTCP_INFOÚstructÚunpackÚAttributeErrorr,   )r   ÚfmtÚtcp_info_structs      r   r>   zTCPSocket.get_backlogb   sr   € Ø�yŠyà(�ðØ&*§i¡i×&:Ñ&:¼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,   € Ø!ŸY™Y×2Ñ2Ó4Ñˆˆt�Q˜Ø 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Ü—W‘W˜T“]�ô
 —=‘= §¡Ô,Ü—I‘I˜d•Oä$Ð%9¸DÑ%@ÓAÐAÜ‰Ñ˜˜t S¨RÐÕ0øô ò Ø—6‘6˜!‘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   € Ü—H‘H˜TŸY™YŸ_™_Ó-ˆ	Ø�	‰	�$—-‘-Ô Ü�
‰
�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ð
 Ðô	 
�Dœ3¤˜,Ô	'Üˆ	ð Ðô Ð:¸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Ø#Ö=�t¤z°$¼Õ'<ŠdÐ=€FÐ=Ù
Ø”$�s“)ÑˆØ"Ö@�d¬*°T¼3Õ*?ŠTÐ@€EÐ@ð ‡}‚}œRŸW™WŸ^™^¨D¯M©MÔ:ÜÐ7¸$¿-¹-ÑGÓHÐHà‡|‚|œBŸG™GŸN™N¨4¯<©<Ô8ÜÐ6¸¿¹ÑEÓFÐFñ Øò 	'ˆBÜ—=‘= ¤V§^¡^´V×5GÑ5GÓHˆDØ×(Ñ(Ó*ˆIÜ" 9Ó-ˆIÙ  ¨D°#¸"Ô=ˆHØ×Ñ˜XÕ&ð	'ð Ðð ò ˆÜ˜tÓ$ˆ	ØˆÜ�q“ò 	ˆAðÙ   t¨SÓ1�ñ ð	ð  ˆ<Ø�I‰IÐ+¬S°«YÔ7Ü�H‰H�QŒKà×Ñ˜Õð/ð2 Ðùòe >ùò Aøô8 ò 	"Ø—6‘6˜!‘9¤× 0Ñ 0Ò0Ø—I‘IÐ5´s¸4³yÔAØ—6‘6˜!‘9¤× 3Ñ 3Ò3Ø—I‘IÐ3´S¸³YÔ?Ø<�Ø—	‘	˜#Ÿ*™*¬#¨d«)¼3¸q»6˜*ÓBÔCØ�q’5Ø—I‘IÐ5Ô6Ü—J‘J˜q”Mÿùð	"ú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Ü�I‰I�iÕ ñ	!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 )zÀGet 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Øò <ˆØÐ%Ò%Ø×!Ñ!Ð"3°EÑ":Õ;ð<ð Ð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Ñ-DÈTÏ]É]Ô[ˆØ×Ñ¨¯©ÀÇÁÐÔMØ"Ÿn™nˆÔØ�<Š<Ø×Ñ §¡Ô-ô -¨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Ñ>WØAE×A]ÑA]ð )ó _ð _r   c                 ó˜   — t        | t        j                  «      sy	 | j                  «       S # t        t        j
                  f$ r Y yw xY w)z¾Get 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øÜœCŸL™LÐ)ò Ùðú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Ó2€HØ�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   