
    辙hZ                     |   d 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 ddlmZ ddl	m
Z
mZ ddlmZ ddlmZmZ dd	lmZ ej&                  ej(                  ej*                  ej,                  hZd
Z e       ZdZdZ ej:                  d      ZddddddZefdZ  G d d      Z! G d de!      Z" G d de!      Z#ddZ$y)zTransport implementation.    N)contextmanager)SSLError)packunpack   )UnexpectedFrame)KNOWN_TCP_OPTSSOL_TCP)set_cloexeci(  is   AMQP  	z\[([\.0-9a-f:]+)\](?::(\d+))?i  <   
   	   )TCP_NODELAYTCP_USER_TIMEOUTTCP_KEEPIDLETCP_KEEPINTVLTCP_KEEPCNTc                    |}t         j                  |       }|r@|j                  d      } |j                  d      rt        |j                  d            }| |fS d| v r | j	                  dd      \  } }t        |      }| |fS )z1Convert hostname:port string to host, port tuple.r      :)IPV6_LITERALmatchgroupintrsplit)hostdefaultportms       J/var/www/Befach/backend/env/lib/python3.12/site-packages/amqp/transport.pyto_host_portr!   (   s    D4 Awwqz771:qwwqz?D
 : $;S!,JD$t9D:    c                       e Zd ZdZ	 	 	 ddZdZd Zd Zed        Z	d Z
d	 Zd
 Zd ZddZd Zd Zd Zd ZefdZd Zy)_AbstractTransporta  Common superclass for TCP and SSL transports.

    PARAMETERS:
        host: str

            Broker address in format ``HOSTNAME:PORT``.

        connect_timeout: int

            Timeout of creating new connection.

        read_timeout: int

            sets ``SO_RCVTIMEO`` parameter of socket.

        write_timeout: int

            sets ``SO_SNDTIMEO`` parameter of socket.

        socket_settings: dict

            dictionary containing `optname` and ``optval`` passed to
            ``setsockopt(2)``.

        raise_on_initial_eintr: bool

            when True, ``socket.timeout`` is raised
            when exception is received during first read. See ``_read()`` for
            details.
    Nc                     d| _         d | _        || _        t        | _        t        |      \  | _        | _        || _        || _	        || _
        || _        y NF)	connectedsockraise_on_initial_eintrEMPTY_BUFFER_read_bufferr!   r   r   connect_timeoutread_timeoutwrite_timeoutsocket_settings)selfr   r,   r-   r.   r/   r)   kwargss           r    __init__z_AbstractTransport.__init__W   sU     	&<#(+D1	49.(*.r"   )
connectionr(   r)   r+   r   r   r,   r-   r.   r/   __dict____weakref__c           
         | j                   r| j                   j                         d    d| j                   j                         d    }	 | j                   j                         d    d| j                   j                         d    }dt        |       j                   d| d| dt        |       d	d
	S dt        |       j                   dt        |       d	d
S # t        j                  $ r}d| }Y d }~od }~ww xY w)Nr   r   r   zERROR: <z: z -> z at z#x>z: (disconnected) at )r(   getsocknamegetpeernamesocketerrortype__name__id)r0   srcdstes       r    __repr__z_AbstractTransport.__repr__t   s    99YY**,Q/0$))2G2G2I!2L1MNC$..034Adii6K6K6Ma6P5QR tDz**+2cU$se44}ANNtDz**++?4}ANN	 LL $sm$s   =C C<-C77C<c                    	 | j                   ry | j                  | j                  | j                  | j                         | j                  | j                  | j                  | j                         d| _         y # t        t        f$ r; | j                  r-| j                   s!| j                  j                          d | _         w xY w)NT)r'   _connectr   r   r,   _init_socketr/   r-   r.   OSErrorr   r(   closer0   s    r    connectz_AbstractTransport.connect   s    	~~MM$))TYY0D0DE$$d&7&79K9K "DN" 	yy		! 		s   A9 A)A9 9A
Cc              #   <  K   || j                    y | j                   }|j                         }||k7  r|j                  |       	 | j                    	 ||k7  r|j                  |       y y # t        $ rH}dt	        |      v rt        j                         dt	        |      v rt        j                          d }~wt        $ r7}|j                  t        j                  k(  rt        j                          d }~ww xY w# ||k7  r|j                  |       w w xY ww)N	timed outzThe operation did not complete)
r(   
gettimeout
settimeoutr   strr;   timeoutrG   errnoEWOULDBLOCK)r0   rP   r(   prevexcs        r    having_timeoutz!_AbstractTransport.having_timeout   s     ?))O99D??$Dw(*ii d?OOD) #  #c(* ..**5SA ..** 99 1 11 ..**
 d?OOD) #sC   ADA. D.	C=7AB::C=2C88C==D   DDc                 P   t        j                  ||t         j                  t         j                  t              }t        |      D ]x  \  }}|\  }}}	}
}	 t        j                   |||	      | _        	 t        | j                  d       | j                  j                  |       | j                  j                  |        y  y # t        $ r Y Ew xY w# t         j                  $ rB | j                  r| j                  j                          d | _        |dz   t        |      k\  r Y w xY w)NTr   )r;   getaddrinfo	AF_UNSPECSOCK_STREAMr
   	enumerater(   r   NotImplementedErrorrN   rJ   r<   rH   len)r0   r   r   rP   entriesiresafsocktypeproto	canonnamesas               r    rE   z_AbstractTransport._connect   s   $$$((&*<*<g
  (FAs14.B%B"MM"h>			40 		$$W-		!!"% # ) +  << 99IIOO% 	q5CL( )	s7   C1C6C	C
CCCAD%$D%c           
         | j                   j                  d        | j                   j                  t        j                  t        j
                  d       | j                  |       t        j                  |ft        j                  |ffD ]Z  \  }}|	t        |      }t        ||z
  dz        }| j                   j                  t        j                  |t        d||             \ | j                          | j                  t               y )Nr   i@B ll)r(   rN   
setsockoptr;   
SOL_SOCKETSO_KEEPALIVE_set_socket_optionsSO_SNDTIMEOSO_RCVTIMEOr   r   _setup_transport_writeAMQP_PROTOCOL_HEADER)r0   r/   r-   r.   rP   intervalsecusecs           r    rF   z_AbstractTransport._init_socket   s    		T"		V..0C0CQG  1 $*#5#5}"E#)#5#5|"D"FGX#(mHsNg56		$$%%wsD)"F 	()r"   c                 @   i }t         D ]  }d }|dk(  r	 ddlm} n t	        t        |      rt        t        |      }|s5|t        v rt        |   ||<   Jt	        t        |      s[|j                  t        t        t        |            ||<    |S # t        $ r d}Y aw xY w)Nr   r   )r      )	r	   r;   r   ImportErrorhasattrgetattrDEFAULT_SOCKET_SETTINGS
getsockoptr
   )r0   r(   tcp_optsoptenums        r    _get_tcp_socket_defaultsz+_AbstractTransport._get_tcp_socket_defaults   s    !CD((? %vs+11%<S%AHTNVS)%)__!5&7HTN ""  # Ds   BBBc                     | j                  | j                        }|r|j                  |       |j                         D ]&  \  }}| j                  j	                  t
        ||       ( y N)r}   r(   updateitemsrg   r
   )r0   r/   rz   r{   vals        r    rj   z&_AbstractTransport._set_socket_options   sP    00;OOO, (HCII  #s3 )r"   c                     t        d      )z#Read exactly n bytes from the peer.Must be overridden in subclassr[   )r0   ninitials      r    _readz_AbstractTransport._read       !"BCCr"   c                      y)z.Do any additional initialization of the class.N rI   s    r    rm   z#_AbstractTransport._setup_transport       r"   c                      y)z8Do any preliminary work in shutting down the connection.Nr   rI   s    r    _shutdown_transportz&_AbstractTransport._shutdown_transport   r   r"   c                     t        d      )z&Completely write a string to the peer.r   r   )r0   ss     r    rn   z_AbstractTransport._write   r   r"   c                 >   | j                   ]	 | j                          	 | j                   j                  t        j
                         	 | j                   j                          d | _         d| _        y # t        $ r Y _w xY w# t        $ r Y Dw xY w# t        $ r Y 8w xY wr&   )r(   r   rG   shutdownr;   	SHUT_RDWRrH   r'   rI   s    r    rH   z_AbstractTransport.close  s    99 ((*		""6#3#34		! DI!    
  s4   A2 )B 	B 2	A>=A>	BB	BBc                    | j                   }t        }	  |dd      }||z  } |d|      \  }}}|t        kD  r0 |t              }	  ||t        z
        }	dj                  ||	g      }
n ||      }
||
z  }t         |d            }|d
k(  r|||
fS t'        d|dd      # t        j                  t
        t        f$ r ||z  } w xY w# t        j                  $ r || j                  z   | _	         t
        t        f$ r}t        |t        j                        rXt        j                  dk(  rE|j                  t        j                  k(  r(|| j                  z   | _	        t        j                         t        |t              r5dt!        |      v r(|| j                  z   | _	        t        j                         |j                  t"        vrd| _         d	}~ww xY w)a  Parse AMQP frame.

        Frame has following format::

            0      1         3         7                   size+7      size+8
            +------+---------+---------+   +-------------+   +-----------+
            | type | channel |  size   |   |   payload   |   | frame-end |
            +------+---------+---------+   +-------------+   +-----------+
             octet    short     long        'size' octets        octet

           Tz>BHIr"   r   ntrL   FN   zReceived frame_end z#04xz while expecting 0xce)r   r*   SIGNED_INT_MAXr;   rP   rG   r   joinordr+   
isinstancer<   osnamerQ   rR   rO   _UNAVAILr'   r   )r0   r   readread_frame_bufferframe_header
frame_typechannelsizepart1part2payload	frame_endrT   s                r    
read_framez_AbstractTransport.read_frame  s    zz(,	4=L-(.v|(D%J n$^, !67E ((E5>2t*(DGI2 w//!%i%55JKM MM :  &.%	 ~~ 	 1D4E4E ED" 	3-"''T/II!2!22
 %68I8I$I!nn&&#x([CH-D %68I8I$I!nn&&yy(!&'	s0   0C B  2C  %CC 6G>CGGc                     	 | j                  |       y # t        j                  $ r  t        $ r}|j                  t
        vrd| _         d }~ww xY wr&   )rn   r;   rP   rG   rQ   r   r'   )r0   r   rT   s      r    writez_AbstractTransport.write\  sG    	KKN~~ 	 	yy(!&	s    AA

A)NNNNT)F)r>   
__module____qualname____doc__r2   	__slots__rC   rJ   r   rU   rE   rF   r}   rj   r   rm   r   rn   rH   r   r   r   r   r"   r    r$   r$   7   s~    > .226>B/
I 	O( * *4.*&*4DD, !' @MDr"   r$   c                        e Zd ZdZd fd	ZdZd ZddZddZ	 	 	 	 	 ddZ	d	 Z
dej                  ej                  ej                  ffd
Zd Z xZS )SSLTransporta  Transport that works over SSL.

    PARAMETERS:
        host: str

            Broker address in format ``HOSTNAME:PORT``.

        connect_timeout: int

            Timeout of creating new connection.

        ssl: bool|dict

            parameters of TLS subsystem.
                - when ``ssl`` is not dictionary, defaults of TLS are used
                - otherwise:
                    - if ``ssl`` dictionary contains ``context`` key,
                      :attr:`~SSLTransport._wrap_context` is used for wrapping
                      socket. ``context`` is a dictionary passed to
                      :attr:`~SSLTransport._wrap_context` as context parameter.
                      All others items from ``ssl`` argument are passed as
                      ``sslopts``.
                    - if ``ssl`` dictionary does not contain ``context`` key,
                      :attr:`~SSLTransport._wrap_socket_sni` is used for
                      wrapping socket. All items in ``ssl`` argument are
                      passed to :attr:`~SSLTransport._wrap_socket_sni` as
                      parameters.

        kwargs:

            additional arguments of
            :class:`~amqp.transport._AbstractTransport` class
    c                 r    t        |t              r|ni | _        t        | _        t        |   |fd|i| y )Nr,   )r   dictssloptsr*   r+   superr2   )r0   r   r,   sslr1   	__class__s        r    r2   zSSLTransport.__init__  s=    (d3s(	="1	=5;	=r"   )r   c                     | j                   | j                  fi | j                  | _        | j                  j                  | j                         | j                  j                          | j                  j                  | _        y)z!Wrap the socket in an SSL object.N)_wrap_socketr(   r   rN   r,   do_handshaker   _quick_recvrI   s    r    rm   zSSLTransport._setup_transport  s[    %D%%dii@4<<@			T112		 99>>r"   c                 T    |r | j                   ||fi |S  | j                  |fi |S r   )_wrap_context_wrap_socket_sni)r0   r(   contextr   s       r    r   zSSLTransport._wrap_socket  s7    %4%%dG?w??$t$$T5W55r"   c                 `    t        j                  di |}||_         |j                  |fi |S )u  Wrap socket without SNI headers.

        PARAMETERS:
            sock: socket.socket

            Socket to be wrapped.

            sslopts: dict

                Parameters of  :attr:`ssl.SSLContext.wrap_socket`.

            check_hostname

                Whether to match the peer cert’s hostname. See
                :attr:`ssl.SSLContext.check_hostname` for details.

            ctx_options

                Parameters of :attr:`ssl.create_default_context`.
        r   )r   create_default_contextcheck_hostnamewrap_socket)r0   r(   r   r   ctx_optionsctxs         r    r   zSSLTransport._wrap_context  s5    * ((7;7+st/w//r"   Fc                 T   |||||	d}|"|rt         j                  nt         j                  }t        j                  |      }||j	                  ||       ||j                  |       |
|j                  |
       	 t         j                  xr |	du|_        |||_
        |d|j                  t         j                  k7  rG|rt         j                  j                  nt         j                  j                  }|j                  |        |j                   di |}|S # t        $ r Y w xY w)u  Socket wrap with SNI headers.

        stdlib :attr:`ssl.SSLContext.wrap_socket` method augmented with support
        for setting the server_hostname field required for SNI hostname header.

        PARAMETERS:
            sock: socket.socket

                Socket to be wrapped.

            keyfile: str

                Path to the private key

            certfile: str

                Path to the certificate

            server_side: bool

                Identifies whether server-side or client-side
                behavior is desired from this socket. See
                :attr:`~ssl.SSLContext.wrap_socket` for details.

            cert_reqs: ssl.VerifyMode

                When set to other than :attr:`ssl.CERT_NONE`, peers certificate
                is checked. Possible values are :attr:`ssl.CERT_NONE`,
                :attr:`ssl.CERT_OPTIONAL` and :attr:`ssl.CERT_REQUIRED`.

            ca_certs: str

                Path to “certification authority” (CA) certificates
                used to validate other peers’ certificates when ``cert_reqs``
                is other than :attr:`ssl.CERT_NONE`.

            do_handshake_on_connect: bool

                Specifies whether to do the SSL
                handshake automatically. See
                :attr:`~ssl.SSLContext.wrap_socket` for details.

            suppress_ragged_eofs (bool):

                See :attr:`~ssl.SSLContext.wrap_socket` for details.

            server_hostname: str

                Specifies the hostname of the service which
                we are connecting to. See :attr:`~ssl.SSLContext.wrap_socket`
                for details.

            ciphers: str

                Available ciphers for sockets created with this
                context. See :attr:`ssl.SSLContext.set_ciphers`

            ssl_version:

                Protocol of the SSL Context. The value is one of
                ``ssl.PROTOCOL_*`` constants.
        )r(   server_sidedo_handshake_on_connectsuppress_ragged_eofsserver_hostnameNr   )r   PROTOCOL_TLS_SERVERPROTOCOL_TLS_CLIENT
SSLContextload_cert_chainload_verify_locationsset_ciphersHAS_SNIr   AttributeErrorverify_mode	CERT_NONEPurposeCLIENT_AUTHSERVER_AUTHload_default_certsr   )r0   r(   keyfilecertfiler   	cert_reqsca_certsr   r   r   ciphersssl_versionoptsr   purposes                  r    r   zSSLTransport._wrap_socket_sni  s8   H &'>$8.
   '',,  ..-##Hg6))(3(	;t ; "  "+G 3 3s}} D  ''[[,, 
 &&w/"w""*T*#  		s   =D 	D'&D'c                 \    | j                    | j                   j                         | _         yy)z/Unwrap a SSL socket, so we can call shutdown().N)r(   unwraprI   s    r    r   z SSLTransport._shutdown_transport2  s%    99 		((*DI !r"   c                    | j                   }| j                  }	 t        |      |k  r6	  ||t        |      z
        }|st        d      ||z  }t        |      |k  r6|d | ||d  c}| _        |S # t        $ r;}|j                  |v r'|r | j
                  rt        j                         Y d }~ d }~ww xY w#  || _         xY w)N%Server unexpectedly closed connectionr   r+   r\   rG   rQ   r)   r;   rP   	r0   r   r   _errnosrecvrbufr   rT   results	            r    r   zSSLTransport._read7  s    
   	d)a-	QT]+A !"IJJ	 d)a-" %)!Hd12h!!   yyG+"t'B'B"(.."22 	 $D9   B7 A0  B7 0	B490B/)B7 .B//B44B7 7
Cc                     | j                   j                  }|r	  ||      }|st        d      ||d }|ryy# t        $ r d}Y $w xY w)z+Write a string out to the SSL socket fully.r   zSocket closedN)r(   r   
ValueErrorrG   )r0   r   r   r   s       r    rn   zSSLTransport._writeS  sX    		!H o..!"A   
 s   9 AA)NNr   )
NNFNNFTNNN)r>   r   r   r   r2   r   rm   r   r   r   r   rQ   ENOENTEAGAINEINTRr   rn   __classcell__)r   s   @r    r   r   g  sg     D=
I*6
02 =A6:@EDH37	vp+
  %||U\\5;;?8r"   r   c                   N    e Zd ZdZd Zdej                  ej                  ffdZy)TCPTransportz~Transport that deals directly with TCP socket.

    All parameters are :class:`~amqp.transport._AbstractTransport` class.
    c                     | j                   j                  | _        t        | _        | j                   j
                  | _        y r   )r(   sendallrn   r*   r+   r   r   rI   s    r    rm   zTCPTransport._setup_transportj  s-     ii''(99>>r"   Fc                    | j                   }| j                  }	 t        |      |k  r6	  ||t        |      z
        }|st        d      ||z  }t        |      |k  r6|d| ||d c}| _        |S # t        $ r;}|j                  |v r'|r | j
                  rt        j                         Y d}~ d}~ww xY w#  || _         xY w)z%Read exactly n bytes from the socket.Nr   r   r   s	            r    r   zTCPTransport._readq  s      	d)a-QT]+A !"IJJ	 d)a-  %)!Hd12h!!  yyG+"t'B'B"(.."22 	 $Dr   N)	r>   r   r   r   rm   rQ   r   r   r   r   r"   r    r   r   d  s%    
*  %u||U[[.I r"   r   c                 6    |rt         nt        } || f||d|S )a  Create transport.

    Given a few parameters from the Connection constructor,
    select and create a subclass of
    :class:`~amqp.transport._AbstractTransport`.

    PARAMETERS:

        host: str

            Broker address in format ``HOSTNAME:PORT``.

        connect_timeout: int

            Timeout of creating new connection.

        ssl: bool|dict

            If set, :class:`~amqp.transport.SSLTransport` is used
            and ``ssl`` parameter is passed to it. Otherwise
            :class:`~amqp.transport.TCPTransport` is used.

        kwargs:

            additional arguments of :class:`~amqp.transport._AbstractTransport`
            class
    )r,   r   )r   r   )r   r,   r   r1   	transports        r    	Transportr     s$    8 !$ITN?NvNNr"   r&   )%r   rQ   r   rer;   r   
contextlibr   r   structr   r   
exceptionsr   platformr	   r
   utilsr   r   r   r   rR   r   	AMQP_PORTbytesr*   r   ro   compiler   rx   r!   r$   r   r   r   r   r"   r    <module>r     s      	 	  
 %   ' - LL%++u||U5F5FG	w /  rzz:;    ) m m`	z% zz#% #LOr"   