o
    vvXjåB  ã                   @   s$  d Z ddlmZmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ dd	lmZmZmZmZmZ dd
lmZmZ ddlmZ ddlmZ ddlmZ ejd dkr[endZdZdZ dZ!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(d d!„ Z)ej*e)iZ+G d"d#„ d#e,ƒZ-dS )$zeConvert between bytestreams and higher-level AMQP types.

2007-11-05 Barry Pederson <bp@barryp.org>

é    )Úabsolute_importÚunicode_literalsN)Údatetime)ÚDecimal)ÚBytesIOé   )ÚFrameSyntaxError)Ú	int_typesÚitemsÚlong_tÚstringÚstring_t)ÚpackÚunpack_from)ÚBasic)Úbytes_to_str)Ústr_to_bytesé   z*    Table type {0!r} not handled by amqp.
zCTable type {0!r} for key {1!r} not handled by amqp. [value: {2!r}]
z9    Table type {0!r} not handled by amqp. [value: {1!r}]
c                 C   sX  t rt | | ƒn| | }|d7 }|dkrEtd| |ƒ\}|d7 }zt| ||| … ƒ}W n ty<   | ||| … }Y nw ||7 }||fS |dkrftd| |ƒ\}|d7 }t| ||| … ƒ}||7 }||fS |dkr…td| |ƒ\}|d7 }| ||| … }||7 }||fS |dkr˜td| |ƒ\}|d7 }||fS |d	kr«td
| |ƒ\}|d7 }||fS |dkr¾td| |ƒ\}|d7 }||fS |dkrÑtd| |ƒ\}|d7 }||fS |dkrätd| |ƒ\}|d7 }||fS |dkr÷td| |ƒ\}|d7 }||fS |dk�rtd| |ƒ\}|d7 }||fS |dk�rtd| |ƒ\}|d7 }||fS |dk�r3td| |ƒ\}|d7 }||fS |dk�rGtd| |ƒ\}|d7 }||fS |dk�rptd| |ƒ\}|d7 }td| |ƒ\}|d7 }t|ƒtd| ƒ }||fS |dk�r¶td| |ƒ\}|d7 }|| }	i }||	k �r²td| |ƒ\}
|d7 }t| |||
 … ƒ}||
7 }t| |ƒ\||< }||	k �s‹||fS |dk�rætd| |ƒ\}|d7 }|| }	g }||	k �rât| |ƒ\}}| |¡ ||	k �sÑ||fS |d k�rþtd| |ƒ\}t|ƒ}|d7 }||fS |d!k�rtd| |ƒ\}|d7 }t 	|¡}||fS |d"k�r"d }||fS t
d# |t|ƒ¡ƒ‚)$Nr   ÚSú>Ié   Úsú>BÚxÚbÚBz>bÚUz>hé   Úuú>HÚIz>iÚiÚLz>qé   Úlú>QÚfú>fÚdz>dÚDé
   ÚFÚAÚtÚTÚVz%Unknown value in table: {0!r} ({1!r}))Úftype_tr   Úpstr_tÚUnicodeDecodeErrorr   Ú
_read_itemÚappendÚboolr   Úutcfromtimestampr   ÚformatÚtype)ÚbufÚoffsetÚftypeÚslenÚvalÚblenr(   ÚnÚtlenÚlimitÚkeylenÚkeyÚalenÚv© rF   úO/var/www/html/myproject/venv/lib/python3.10/site-packages/amqp/serialization.pyr3   %   sà   ÿb \¦V¬R°N´J¸F¼BÀ>
Ä:
È6
Ì2
Ð.
Ô'
Û

û 
ç


þ
ð
õ

úýÿÿr3   c                 C   sN  d }}g }|j }t| ƒ} | D �]’}|dkr8|s(t|||d … ƒ}|d7 }d}|d@ dk}|dL }|d8 }�nf|dkrMd }}td||ƒ\}|d7 }�nQ|dkrbd }}td||ƒ\}|d	7 }�n<|d
krwd }}td||ƒ\}|d7 }�n'|dkrŒd }}td||ƒ\}|d7 }�n|dkr d }}td||ƒ\}|d7 }nþ|dkrÄd }}td||ƒ\}	|d7 }||||	 …  dd¡}||	7 }nÚ|dkrèd }}td||ƒ\}	|d7 }||||	 …  dd¡}||	7 }n¶|dk�rtd||ƒ\}
|d7 }||||
 … }||
7 }n™|dk�rLd }}td||ƒ\}|d7 }|| }i }||k �rKtd||ƒ\}|d7 }t|||| … ƒ}||7 }t||ƒ\||< }||k �s$nR|dk�r}d }}td||ƒ\}|d7 }|| }g }||k �r|t||ƒ\}}|  |¡ ||k �skn!|dk�r—d }}td||ƒ\}|d7 }t |¡}ntt	 
|¡ƒ‚||ƒ q||fS )zÂDeserialize amqp format.

    bit = b
    octet = o
    short = B
    long = l
    long long = L
    float = f
    shortstr = s
    longstr = S
    table = F
    array = A
    timestamp = T
    r   r   r   r#   Úor   r   r   r   r$   r   r   r"   r%   r&   r'   r   úutf-8Úsurrogatepassr   r   r+   r,   r.   )r4   r1   Úordr   Údecoder3   r   r6   r   ÚILLEGAL_TABLE_TYPEr7   )r7   r9   r:   ÚbitcountÚbitsÚvaluesr4   Úpr=   r<   r>   r@   rA   rB   rC   rD   ÚavalrF   rF   rG   Úloads—   s¦   








û€



þ€

rS   c                 C   s0   | r|t dt| ƒ g| ¢R Ž ƒ g | d d …< dS )Nr   r   )r   Úlen)rO   ÚwriterF   rF   rG   Ú
_flushbitsú   s   rV   c           
   	   C   sV  d}g }t ƒ }|j}t| ƒ} t|ƒD �]\}}| | }|dkrA|r#dnd}|d }	|	dkr2| d¡ |d  ||	> O  < |d7 }q|dkrRt||ƒ}|td|ƒƒ q|dkret||ƒ}|tdt|ƒƒƒ q|d	krvt||ƒ}|td
|ƒƒ q|dkr‡t||ƒ}|td|ƒƒ q|dkr˜t||ƒ}|td|ƒƒ q|dkr¾|pŸd}t||ƒ}t|t	ƒr°| 
dd¡}|tdt|ƒƒƒ ||ƒ q|dksÆ|dkrè|pÉd}t||ƒ}t|t	ƒrÚ| 
dd¡}|td
t|ƒƒƒ ||ƒ q|dkrút||ƒ}t|põi ||ƒ q|dk�rt||ƒ}t|�p	g ||ƒ q|dk�r!|tdtt | ¡ ¡ƒƒƒ qt||ƒ | ¡ S )zéSerialize AMQP arguments.

    Notes:
        bit = b
        octet = o
        short = B
        long = l
        long long = L
        shortstr = s
        longstr = S
        byte array = x
        table = F
        array = A
    r   r   r   r#   éÿÿÿÿrH   r   r   r$   r   r"   r%   r&   r'   r   Ú rI   rJ   r   r   r+   r,   r.   )r   rU   r1   Ú	enumerater4   rV   r   ÚintÚ
isinstancer   ÚencoderT   Ú_write_tableÚ_write_arrayr   ÚcalendarÚtimegmÚutctimetupleÚgetvalue)
r7   rP   rN   rO   ÚoutrU   r!   r=   rQ   ÚshiftrF   rF   rG   Údumps  sl   
















€
re   c              
   C   s¨   t ƒ }|j}t| ƒD ]6\}}t|tƒr| dd¡}|tdt|ƒƒƒ ||ƒ zt|||ƒ W q
 t	y@   t
t t|ƒ||¡ƒ‚w | ¡ }|tdt|ƒƒƒ ||ƒ d S )NrI   rJ   r   r   )r   rU   r
   r[   r   r\   r   rT   Ú_write_itemÚ
ValueErrorr   ÚILLEGAL_TABLE_TYPE_WITH_KEYr7   r8   rb   )r(   rU   rO   rc   ÚtwriteÚkrE   Ú
table_datarF   rF   rG   r]   J  s"   
ÿÿr]   c              	   C   sn   t ƒ }|j}| D ]}zt|||ƒ W q ty#   tt t|ƒ|¡ƒ‚w | ¡ }|t	dt
|ƒƒƒ ||ƒ d S )Nr   )r   rU   rf   rg   r   ÚILLEGAL_TABLE_TYPE_WITH_VALUEr7   r8   rb   r   rT   )r$   rU   rO   rc   ÚawriterE   Ú
array_datarF   rF   rG   r^   \  s   ÿÿr^   c              	   C   s¨  t | ttfƒr"t | tƒr|  dd¡} |tddt| ƒƒƒ || ƒ d S t | tƒr3|tddt| ƒƒƒ d S t | t	ƒrB|tdd| ƒƒ d S t | t
ƒrc| d	ksO| d
k rY|tdd| ƒƒ d S |tdd| ƒƒ d S t | tƒr�|  ¡ \}}}d} |D ]}| d | } qs|r�|  } |tdd| | ƒƒ d S t | tƒr£|tddtt |  ¡ ¡ƒƒƒ d S t | tƒr´|dƒ t| ||ƒ d S t | ttfƒrÇ|dƒ t| ||ƒ d S | d u rÑ|dƒ d S tƒ ‚)NrI   rJ   z>cIó   Sz>cBó   tz>cdó   diÿÿÿi  €z>cqó   Lz>ció   Ir   r*   z>cBió   Dz>cQó   Tó   Fó   Aó   V)r[   r   Úbytesr   r\   r   rT   r5   rZ   Úfloatr	   r   Úas_tupler   r   r_   r`   ra   Údictr]   ÚlistÚtupler^   rg   )rE   rU   rO   ÚsignÚdigitsÚexponentr(   rF   rF   rG   rf   j  sD   





ÿ
rf   c                 C   s   i }t d| |ƒ\}|d7 }|d@ r,t d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d@ rKt d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d	@ r\td
| |ƒ\}}|\|d< |d@ rmt d| |ƒ\|d< |d7 }|d@ r~t d| |ƒ\|d< |d7 }|d@ r�t d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d@ r¼t d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d@ rÛt d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d@ rút d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d@ �rt d| |ƒ\|d< |d7 }|d@ �r,t d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d@ �rLt d| |ƒ\}|d7 }t| ||| … ƒ|d< ||7 }|d@ �rlt d| |ƒ\}|d7 }t| ||| … ƒ|d < ||7 }|d!@ �rŒt d| |ƒ\}|d7 }t| ||| … ƒ|d"< ||7 }||fS )#zDecode basic properties.r   r   i €  r   r   Úcontent_typei @  Úcontent_encodingi    r+   Úapplication_headersi   Údelivery_modei   Úpriorityi   Úcorrelation_idi   Úreply_toé   Ú
expirationé€   Ú
message_idé@   r%   Ú	timestampr#   é    r8   é   Úuser_idÚapp_idr   Ú
cluster_id)r   r1   rS   )r9   r:   Ú
propertiesÚflagsr<   Ú_frF   rF   rG   Údecode_properties_basic�  s„   





r—   c                   @   sN   e Zd ZdZdZdgZddd„Zdd„ Zdd	„ Zd
d„ Z	ddd„Z
dd„ ZdS )ÚGenericContentzdAbstract base class for AMQP content.

    Subclasses should override the PROPERTIES attribute.
    N)Údummyr   c                 K   s.   || _ || _|| _g | _d| _d| _d| _d S )Nr   F)Úframe_methodÚ
frame_argsr”   Ú_pending_chunksÚbody_receivedÚ	body_sizeÚready)Úselfrš   r›   ÚpropsrF   rF   rG   Ú__init__æ  s   
zGenericContent.__init__c                 C   s,   |dkrt dƒ‚|| jv r| j| S t |ƒ‚)NÚ__setstate__)ÚAttributeErrorr”   )r    ÚnamerF   rF   rG   Ú__getattr__ð  s
   

zGenericContent.__getattr__c                 C   s   t | ||ƒ\}}|| _|S )zõLoad AMQP properties.

        Given the raw bytes containing the property-flags and property-list
        from a content-frame-header, parse and insert into a dictionary
        stored in this object as an attribute named 'properties'.
        )ÚPROPERTY_CLASSESr”   )r    Úclass_idr9   r:   r¡   rF   rF   rG   Ú_load_propertiesû  s   zGenericContent._load_propertiesc                 C   sØ   d}d}g }g g }}| j }| jD ]5\}}| |d¡}	|	durB|dkr,| |¡ d}d}|d|> O }|dkrB| t|ƒ¡ | |	¡ |d8 }q| |¡ tƒ }
|
j}|D ]	}|td|ƒƒ qT|td 	|¡|ƒƒ |
 
¡ S )zìSerialize AMQP properties.

        Serialize the 'properties' attribute (a dictionary) into
        the raw bytes making up a set of property flags and a
        property list, suitable for putting into a content frame header.
        é   r   Nr   Úbitr   ó    )r”   Ú
PROPERTIESÚgetr4   r   r   rU   r   re   Újoinrb   )r    rd   Ú	flag_bitsr•   ÚsformatÚsvaluesr¡   rC   Úproptyper=   ÚresultrU   rF   rF   rG   Ú_serialize_properties  s0   




z$GenericContent._serialize_propertiesr   c                 C   s8   t d||ƒ\}| _|d7 }|  |||¡ | jsd| _|S )Nz>HxxQé   T)r   rž   r©   rŸ   )r    r9   r:   r¨   rF   rF   rG   Úinbound_header*  s   zGenericContent.inbound_headerc                 C   sl   | j }|  jt|ƒ7  _| j| jkr/|r'| |¡ tƒ  |¡| _g |d d …< n|| _d| _d S | |¡ d S )NT)	rœ   r�   rT   rž   r4   ry   r¯   ÚbodyrŸ   )r    r9   ÚchunksrF   rF   rG   Úinbound_body2  s   

zGenericContent.inbound_body)NN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCLASS_IDr­   r¢   r¦   r©   rµ   r·   rº   rF   rF   rF   rG   r˜   Ý  s    


#r˜   ).r¾   Ú
__future__r   r   r_   Úsysr   Údecimalr   Úior   Ú
exceptionsr   Úfiver	   r
   r   r   r   Úplatformr   r   Úspecr   Úutilsr   r1   r   Úversion_infoÚchrr0   rM   rh   rl   r3   rS   rV   re   r]   r^   rf   r—   r¿   r§   Úobjectr˜   rF   rF   rF   rG   Ú<module>   s8    rcI&Iÿ