
    hZ                        S r SSKrSSKrSSKrSSKrSSKrSSKJr  SSKJr  SSK	J
r
Jr  SSKJr  SSKJrJr  SS	KJr  \R&                  \R(                  \R*                  \R,                  1rS
r\" 5       rSrSr\R:                  " S5      rSSSSSS.r\4S jr  " S S5      r! " S S\!5      r" " S S\!5      r#SS jr$g)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                    Un[         R                  U 5      nU(       aD  UR                  S5      n UR                  S5      (       a  [        UR                  S5      5      nX4$ SU ;   a  U R	                  SS5      u  p[        U5      nX4$ )z1Convert hostname:port string to host, port tuple.r      :)IPV6_LITERALmatchgroupintrsplit)hostdefaultportms       6D:\TimeStamps\venv\Lib\site-packages\amqp/transport.pyto_host_portr!   (   s{    D4 Awwqz771::qwwqz?D
 : $;S!,JDt9D:    c                       \ rS rSrSr   SS jrSrS rS r\	S 5       r
S	 rS
 rS rS rSS jrS rS rS rS r\4S jrS rSrg)_AbstractTransport7   a  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                     SU l         S U l        X`l        [        U l        [        U5      u  U l        U l        X l        X0l	        X@l
        XPl        g 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/   r0   r*   kwargss           r    __init___AbstractTransport.__init__W   sK     	&<#(+D1	49.(*.r"   )
connectionr)   r*   r,   r   r   r-   r.   r/   r0   __dict____weakref__c           
      
   U R                   (       a  U R                   R                  5       S    SU R                   R                  5       S    3n U R                   R                  5       S    SU R                   R                  5       S    3nS[        U 5      R                   SU SU S[        U 5      S	 S
3	$ S[        U 5      R                   S[        U 5      S	 S
3$ ! [        R                   a  nSU 3n S nANpS nAff = f)Nr   r   r   zERROR: <z: z -> z at z#x>z: (disconnected) at )r)   getsocknamegetpeernamesocketerrortype__name__id)r1   srcdstes       r    __repr___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 D3C==Dc                     U R                   (       a  g U R                  U R                  U R                  U R                  5        U R                  U R                  U R                  U R                  5        SU l         g ! [        [        4 aE    U R                  (       a2  U R                   (       d!  U R                  R                  5         S U l        e f = f)NT)r(   _connectr   r   r-   _init_socketr0   r.   r/   OSErrorr   r)   closer1   s    r    connect_AbstractTransport.connect   s    	~~MM$))TYY0D0DE$$d&7&79K9K "DN" 	yy		! 		s   A> A)A> >ACc              #   R  #    Uc  U R                   v   g U R                   nUR                  5       nX1:w  a  UR                  U5         U R                   v    X:w  a  UR                  U5        g g ! [         aN  nS[	        U5      ;   a  [
        R                  " 5       eS[	        U5      ;   a  [
        R                  " 5       ee S nAf[         a9  nUR                  [        R                  :X  a  [
        R                  " 5       ee S nAff = f! X:w  a  UR                  U5        f f = f7f)N	timed outzThe operation did not complete)
r)   
gettimeout
settimeoutr   strr=   timeoutrJ   errnoEWOULDBLOCK)r1   rT   r)   prevexcs        r    having_timeout!_AbstractTransport.having_timeout   s     ?))O99D??$D(*ii ?OOD) #  #c(* ..**5SA ..** 99 1 11 ..**
 ?OOD) #sC   AD'A/ D'/
D9A	CD4DDD D$$D'c                 ^   [         R                  " X[         R                  [         R                  [        5      n[        U5       Hu  u  pVUu  pxpn [         R                   " XxU	5      U l         [        U R                  S5        U R                  R                  U5        U R                  R                  U5          g    g ! [         a     NGf = f! [         R                   aI    U R                  (       a  U R                  R                  5         S U l        US-   [        U5      :  a  e  M  f = f)NTr   )r=   getaddrinfo	AF_UNSPECSOCK_STREAMr
   	enumerater)   r   NotImplementedErrorrR   rM   r>   rK   len)r1   r   r   rT   entriesiresafsocktypeproto	canonnamesas               r    rH   _AbstractTransport._connect   s    $$((&*<*<g
  (FA14.B%B"MM">			40 		$$W-		!!"% # ) +  << 99IIOO% 	q5CL( )	s7   C.B?6C?
C	CCCAD,+D,c           
         U R                   R                  S 5        U R                   R                  [        R                  [        R
                  S5        U R                  U5        [        R                  U4[        R                  U44 HZ  u  pEUc  M
  [        U5      n[        XV-
  S-  5      nU R                   R                  [        R                  U[        SXg5      5        M\     U R                  5         U R                  [        5        g )Nr   i@B ll)r)   rR   
setsockoptr=   
SOL_SOCKETSO_KEEPALIVE_set_socket_optionsSO_SNDTIMEOSO_RCVTIMEOr   r   _setup_transport_writeAMQP_PROTOCOL_HEADER)r1   r0   r.   r/   rT   intervalsecusecs           r    rI   _AbstractTransport._init_socket   s    		T"		V..0C0CQG  1 $*#5#5}"E#)#5#5|"D"FG#(mHNg56		$$%%ws)"F 	()r"   c                 l   0 n[          H  nS nUS:X  a   SSKJn  O%[	        [        U5      (       a  [        [        U5      nU(       d  MA  U[        ;   a  [        U   X$'   MX  [	        [        U5      (       d  Mo  UR                  [        [        [        U5      5      X$'   M     U$ ! [         a    Sn Nqf = f)Nr   r   )r      )	r	   r=   r   ImportErrorhasattrgetattrDEFAULT_SOCKET_SETTINGS
getsockoptr
   )r1   r)   tcp_optsoptenums        r    _get_tcp_socket_defaults+_AbstractTransport._get_tcp_socket_defaults   s    !CD((? %%vs+t11%<S%AHNVS))%)__!5&7HN ""  # Ds   B$$B32B3c                     U R                  U R                  5      nU(       a  UR                  U5        UR                  5        H%  u  p4U R                  R	                  [
        X45        M'     g N)r   r)   updateitemsrm   r
   )r1   r0   r   r   vals        r    rp   &_AbstractTransport._set_socket_options   sL    00;OOO, (HCII  #3 )r"   c                     [        S5      e)z#Read exactly n bytes from the peer.Must be overridden in subclassr`   )r1   ninitials      r    _read_AbstractTransport._read       !"BCCr"   c                     g)z.Do any additional initialization of the class.N rL   s    r    rs   #_AbstractTransport._setup_transport       r"   c                     g)z8Do any preliminary work in shutting down the connection.Nr   rL   s    r    _shutdown_transport&_AbstractTransport._shutdown_transport   r   r"   c                     [        S5      e)z&Completely write a string to the peer.r   r   )r1   ss     r    rt   _AbstractTransport._write   r   r"   c                 F   U R                   b]   U R                  5          U R                   R                  [        R
                  5         U R                   R                  5         S U l         SU l        g ! [         a     N`f = f! [         a     NFf = f! [         a     N;f = fr'   )r)   r   rJ   shutdownr=   	SHUT_RDWRrK   r(   rL   s    r    rK   _AbstractTransport.close  s    99 ((*		""6#3#34		! DI!    
  s4   A3 )B 
B 3
B ?B 
BB
B B c                    U R                   n[        n U" SS5      nX4-  nU" SU5      u  pVnU[        :  a/  U" [        5      n U" U[        -
  5      n	SR                  X/5      n
OU" U5      n
X:-  n[        U" S5      5      nUS
:X  a  XVU
4$ ['        SUS S35      e! [        R                  [
        [        4 a    X8-  ne f = f! [        R                   a    X0R                  -   U l	        e [
        [        4 a  n[        U[        R                  5      (       aZ  [        R                  S:X  aF  UR                  [        R                  :X  a(  X0R                  -   U l	        [        R                  " 5       e[        U[        5      (       a7  S[!        U5      ;   a(  X0R                  -   U l	        [        R                  " 5       eUR                  ["        ;  a  SU l        e S	nAff = f)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   ntrP   FN   zReceived frame_end z#04xz while expecting 0xce)r   r+   SIGNED_INT_MAXr=   rT   rJ   r   joinordr,   
isinstancer>   osnamerU   rV   rS   _UNAVAILr(   r   )r1   r   readread_frame_bufferframe_header
frame_typechannelsizepart1part2payload	frame_endrX   s                r    
read_frame_AbstractTransport.read_frame  s    zz(,	4=L-(.v|(D%J n$^, !67E ((E>2t*(DGI2 //!%i%55JKM MM :  &.%	 ~~ 	 14E4E ED" 	3--"''T/II!2!22
 %68I8I$I!nn&&#x(([CH-D %68I8I$I!nn&&yy(!&'	s0   /C B 0C %CC 7G"<C!GG"c                      U R                  U5        g ! [        R                   a    e [         a!  nUR                  [
        ;  a  SU l        e S nAff = fr'   )rt   r=   rT   rJ   rU   r   r(   )r1   r   rX   s      r    write_AbstractTransport.write\  sG    	KKN~~ 	 	yy(!&	s    AAA)
r,   r-   r(   r   r   r*   r.   r)   r0   r/   )NNNNT)F)r@   
__module____qualname____firstlineno____doc__r3   	__slots__rE   rM   r   rY   rH   rI   r   rp   r   rs   r   rt   rK   r   r   r   __static_attributes__r   r"   r    r$   r$   7   s~    > .226>B/
I 	O( * *4.*&*4DD, !' @MDr"   r$   c                      ^  \ rS rSrSrSU 4S jjrSrS rSS jrSS jr	     SS	 jr
S
 rS\R                  \R                  \R                  44S jrS rSrU =r$ )SSLTransportig  ao  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                 ~   > [        U[        5      (       a  UO0 U l        [        U l        [
        TU ]  " U4SU0UD6  g )Nr-   )r   dictssloptsr+   r,   superr3   )r1   r   r-   sslr2   	__class__s        r    r3   SSLTransport.__init__  s@    (d33s(	="1	=5;	=r"   )r   c                    U R                   " U R                  40 U R                  D6U l        U R                  R                  U R                  5        U R                  R                  5         U R                  R                  U l        g)z!Wrap the socket in an SSL object.N)_wrap_socketr)   r   rR   r-   do_handshaker   _quick_recvrL   s    r    rs   SSLTransport._setup_transport  sY    %%dii@4<<@			T112		 99>>r"   c                 \    U(       a  U R                   " X40 UD6$ U R                  " U40 UD6$ r   )_wrap_context_wrap_socket_sni)r1   r)   contextr   s       r    r   SSLTransport._wrap_socket  s1    %%d?w??$$T5W55r"   c                 `    [         R                  " S0 UD6nX5l        UR                  " U40 UD6$ )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)r1   r)   r   r   ctx_optionsctxs         r    r   SSLTransport._wrap_context  s1    * ((7;7+t/w//r"   Fc                    UUUUU	S.nUc'  U(       a  [         R                  O[         R                  n[         R                  " U5      nUb  UR	                  X25        Ub  UR                  U5        U
b  UR                  U
5         [         R                  =(       a    U	SLUl        Ub  X]l
        Ucj  UR                  [         R                  :w  aL  U(       a  [         R                  R                  O[         R                  R                  nUR                  U5        UR                   " S0 UD6nU$ ! [         a     Nf = f)um  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   )r1   r)   keyfilecertfiler   	cert_reqsca_certsr   r   r   ciphersssl_versionoptsr   purposes                  r    r   SSLTransport._wrap_socket_sni  s2   H &'>$8.
   '',,  ..-##H6))(3(	;t ; "  "+ 3 3s}} D  ''[[,, 
 &&w/""*T*#  		s    D0 0
D=<D=c                 ^    U R                   b   U R                   R                  5       U l         gg)z/Unwrap a SSL socket, so we can call shutdown().N)r)   unwraprL   s    r    r    SSLTransport._shutdown_transport2  s%    99 		((*DI !r"   c                    U R                   nU R                  n [        U5      U:  a<   U" U[        U5      -
  5      nU(       d  [        S5      eXV-  n[        U5      U:  a  M<  US U XQS  sol        U$ ! [         aI  nUR                  U;   a3  U(       a&  U R
                  (       a  [        R                  " 5       e S nAM  e S nAff = f!   XPl        e = f)N%Server unexpectedly closed connectionr   r,   ra   rJ   rU   r*   r=   rT   	r1   r   r   _errnosrecvrbufr   rX   results	            r    r   SSLTransport._read7  s    
   	d)a-	QT]+A !"IJJ	 d)a-" %)!Hd2h!!   yyG+"t'B'B"(.."22 	 $9   C A5 %C 5
C?=C<C CCC 	Cc                     U R                   R                  nU(       a)   U" U5      nU(       d  [        S5      eXS nU(       a  M(  gg! [         a    Sn N/f = f)z+Write a string out to the SSL socket fully.r   zSocket closedN)r)   r   
ValueErrorrJ   )r1   r   r   r   s       r    rt   SSLTransport._writeS  sX    		!H o.."A a  
 s   A AA)r   r,   r)   r   )NNr   )
NNFNNFTNNN)r@   r   r   r   r   r3   r   rs   r   r   r   r   rU   ENOENTEAGAINEINTRr   rt   r   __classcell__)r   s   @r    r   r   g  sl     D=
I*6
02 =A6:@EDH37	vp+
  %||U\\5;;?8 r"   r   c                   X    \ rS rSrSrS rS\R                  \R                  44S jr	Sr
g)TCPTransportid  zvTransport that deals directly with TCP socket.

All parameters are :class:`~amqp.transport._AbstractTransport` class.
c                     U R                   R                  U l        [        U l        U R                   R
                  U l        g r   )r)   sendallrt   r+   r,   r   r   rL   s    r    rs   TCPTransport._setup_transportj  s-     ii''(99>>r"   Fc                    U R                   nU R                  n [        U5      U:  a<   U" U[        U5      -
  5      nU(       d  [        S5      eXV-  n[        U5      U:  a  M<  USU XQS sol        U$ ! [         aI  nUR                  U;   a3  U(       a&  U R
                  (       a  [        R                  " 5       e SnAM  e SnAff = f!   XPl        e = f)z%Read exactly n bytes from the socket.Nr   r   r   s	            r    r   TCPTransport._readq  s      	d)a-QT]+A !"IJJ	 d)a-  %)!Hd2h!!  yyG+"t'B'B"(.."22 	 $r  )r   r,   rt   N)r@   r   r   r   r   rs   rU   r	  r
  r   r   r   r"   r    r  r  d  s%    
*  %u||U[[.I r"   r  c                 >    U(       a  [         O[        nU" U 4XS.UD6$ )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   r2   	transports        r    	Transportr    s"    8 !$ITN?NvNNr"   r'   )%r   rU   r   rer=   r   
contextlibr   r   structr   r   
exceptionsr   platformr	   r
   utilsr   r	  r
  r  rV   r   	AMQP_PORTbytesr+   r   ru   compiler   r   r!   r$   r   r  r  r   r"   r    <module>r     s      	 	  
 %   ' - LL%++u||U5F5FG	w /  zz:;    ) m m`	z% zz#% #LOr"   