Ë
    šQj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/html/truck-me/venv/lib/python3.12/site-packages/amqp/transport.pyÚto_host_portr!   (   s   € à€DÜ×Ñ˜4Ó €AÙØ�w‰w�q‹zˆØ�7‰7�1Œ:Ü�q—w‘w˜q“z“?ˆDð
 �ˆ:Ðð �$‰;ØŸ™ S¨!Ó,‰JˆD�$Ü�t“9ˆDØ�ˆ:Ðó    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ÑˆŒ	�4”9Ø.ˆÔØ(ˆÔØ*ˆÔØ.ˆÕ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ö   € Ø�9Š9Ø—Y‘Y×*Ñ*Ó,¨QÑ/Ð0°°$·)±)×2GÑ2GÓ2IÈ!Ñ2LÐ1MÐNˆCð$ØŸ™×.Ñ.Ó0°Ñ3Ð4°A°d·i±i×6KÑ6KÓ6MÈaÑ6PÐ5QÐR�ð ”t˜D“z×*Ñ*Ð+¨2¨c¨U°$°s°e¸4ÄÀ4ÃÈ¸}ÈAÐNÐNà”t˜D“z×*Ñ*Ð+Ð+?ÄÀ4ÃÈ¸}ÈAÐNÐNøô	 —L‘Lò $Ø ˜s�m•ûð$ú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˜   € ð	à�~Š~ØØ�M‰M˜$Ÿ)™) T§Y¡Y°×0DÑ0DÔEØ×ÑØ×$Ñ$ d×&7Ñ&7¸×9KÑ9Kôð "ˆD�NøÜœÐ"ò 	à�yŠy §¢Ø—	‘	—‘Ô!Ø �”	Øð	ú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à—9‘9ˆDØ—?‘?Ó$ˆDØ�wŠØ—‘ Ô(ð*Ø—i‘i“ð ˜d’?Ø—O‘O DÕ)ð #øô ò Ø¤# c£(Ñ*ä Ÿ.™.Ó*Ð*Ø5¼¸S»ÑAä Ÿ.™.Ó*Ð*ØûÜò Ø—9‘9¤× 1Ñ 1Ò1Ü Ÿ.™.Ó*Ð*Øûðûð
 ˜d’?Ø—O‘O DÕ)ð #ü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ó
ˆô   Ó(ò 	‰FˆAˆsØ14Ñ.ˆB�˜% ¨BðÜ"ŸM™M¨"¨h¸Ó>�”	ðÜ §	¡	¨4Ô0ð —	‘	×$Ñ$ WÔ-Ø—	‘	×!Ñ! "Ô%ñ ñ#	øô +ò Ùðûô —<‘<ò Ø—9’9Ø—I‘I—O‘OÔ%Ø �”	Ø�q‘5œC ›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×.Ñ.´×0CÑ0CÀQÔGØ× Ñ  Ô1ô $*×#5Ñ#5°}Ð"EÜ#)×#5Ñ#5°|Ð"Dð"Fò 	ÑˆG�XàÑ#Ü˜(“m�Ü˜H s™N¨gÑ5Ó6�Ø—	‘	×$Ñ$Ü×%Ñ% wÜ˜˜s DÓ)õð	ð 	×ÑÔà�‰Ô(Õ)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£   € ØˆÜ!ò 	7ˆCØˆDØÐ(Ò(ðÞ?ô œ Ô%Üœv sÓ+�âØÔ1Ñ1Ü%<¸SÑ%A�H˜T’NÜœV SÕ)Ø%)§_¡_Ü¤¬°Ó!5ó&7�H˜T’Nð	7ð" ˆøô #ò à’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í   sU   € Ø×0Ñ0°·±Ó;ˆÙØ�O‰O˜OÔ,Ø Ÿ™Ó(ò 	4‰HˆC�Ø�I‰I× Ñ ¤¨#¨sÕ3ñ	4r"   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—   € Ø�9‰9Ð ðØ×(Ñ(Ô*ðØ—	‘	×"Ñ"¤6×#3Ñ#3Ô4ðØ—	‘	—‘Ô!ð ˆDŒIØˆ�øô! ò Ùðûô ò Ùðûô
 ò Ùðú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Ò  € ð �z‰zˆÜ(Ðð,	Ù  4›=ˆLØ Ñ-ÐÙ(.¨v°|Ó(DÑ%ˆJ˜ ð ”nÒ$Ùœ^Ó,�ðÙ  ¬Ñ!6Ó7�Eð Ÿ(™( E¨5 >Ó2‘á˜t›*�Ø Ñ(ÐÜ™D ›G›ˆIð2 ˜ÒØ˜w¨Ð/Ð/ä!Ø% i°Ð%5Ð5JÐKóMð MøôM Ÿ™¬´Ð:ò ð &¨Ñ.Ð%Øð	ûô �~‰~ò 	Ø 1°D×4EÑ4EÑ EˆDÔØÜœÐ"ò 	ä˜3¤§¡Ô-´"·'±'¸T²/Ø—I‘I¤×!2Ñ!2Ò2ð
 %6¸×8IÑ8IÑ$I�Ô!Ü—n‘nÓ&Ð&ä˜#œxÔ(¨[¼CÀ»HÑ-Dð %6¸×8IÑ8IÑ$I�Ô!Ü—n‘nÓ&Ð&à�y‰y¤Ñ(Ø!&�”Øûð'	ú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   € ð	Ø�K‰K˜�NøÜ�~‰~ò 	ØÜò 	Ø�y‰y¤Ñ(Ø!&�”Øûð	ú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~   „ ñð> .2Ø26Ø>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Ô3‘s¸ˆŒÜ(ˆÔÜ‰ÑØñ	=Ø"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×%Ñ% d§i¡iÑ@°4·<±<Ñ@ˆŒ	à�	‰	×Ñ˜T×1Ñ1Ô2Ø�	‰	×ÑÔ ØŸ9™9Ÿ>™>ˆÕ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×%Ñ% d¨GÑ?°wÑ?Ð?Ø$ˆt×$Ñ$ TÑ5¨WÑ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Ø.ñ
ˆð Ðñ ô ×'Ò'ä×,Ñ,ð ô —.‘. Ó-ˆàÐØ×#Ñ# H¨gÔ6ØÐØ×)Ñ)¨(Ô3ØÐØ×Ñ Ô(ð	ä—‘Ò; °tÐ ;ð Ô"ð Ð Ø"+ˆGÔàÐ × 3Ñ 3´s·}±}Ò 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%   € à�9‰9Ð ØŸ	™	×(Ñ(Ó*ˆD�Ið !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“-ð" %)¨¨! H¨d°1°2¨hÐ!ˆ�Ô!Øˆøô ò ð —y‘y GÑ+Ù" 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ó
0ð2 =AØ6:Ø@EØDHØ37ó	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-   € ð —i‘i×'Ñ'ˆŒÜ(ˆÔØŸ9™9Ÿ>™>ˆÕ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“-ð  %)¨¨! H¨d°1°2¨hÐ!ˆ�Ô!Øˆøô ò Ø—y‘y GÑ+Ù" 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¨?ÀÑNÀvÑ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Ë   ðÙ ó Û 	Û 	Û Û 
Ý %Ý ß å 'ß -Ý à�L‰L˜%Ÿ+™+ u§|¡|°U×5FÑ5FÐG€à€	á‹w€à€ð /Ð ð ˆr�z‰zÐ:Ó;€ð ØØØØñÐ ð  )ó ÷mñ mô`	zÐ%ô zôz#Ð%ô #ôLOr"   