o
    Œ¨Êh
C  ã                   @   sØ   d 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m	Z	 ddl
mZ dd	lmZ dd
lmZ ddlm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 ƒZdS )!zeConvert between bytestreams and higher-level AMQP types.

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

é    N)Údatetime)ÚDecimal)ÚBytesIO)ÚpackÚunpack_fromé   )ÚFrameSyntaxError)ÚBasic)Úbytes_to_str)Ústr_to_bytesz*    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   sL  t | | ƒ}|d7 }|dkr?td| |ƒ\}|d7 }zt| ||| … ƒ}W n ty6   | ||| … }Y nw ||7 }||fS |dkr`t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�r-td| |ƒ\}|d7 }||fS |dk�rAtd| |ƒ\}|d7 }||fS |dk�rjt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: {!r} ({!r}))Úchrr   Úpstr_tÚUnicodeDecodeErrorr   Ú
_read_itemÚappendÚboolr   Úutcfromtimestampr   ÚformatÚtype)ÚbufÚoffsetÚftypeÚslenÚvalÚblenr    ÚnÚtlenÚlimitÚkeylenÚkeyÚalenÚv© r>   úD/var/www/html/env/lib/python3.10/site-packages/amqp/serialization.pyr+       sà   ÿb \¦V¬R°N´J¸F¼BÀ>
Ä:
È6
Ì2
Ð.
Ô'
Û

û 
ç


þ
ð
õ

úýÿÿr+   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&   )r,   r)   Úordr   Údecoder+   r   r.   r   ÚILLEGAL_TABLE_TYPEr/   )r/   r1   r2   ÚbitcountÚbitsÚvaluesr,   Úpr5   r4   r6   r8   r9   r:   r;   r<   Úavalr>   r>   r?   Úloads’   s¦   








û€



þ€

rK   c                 C   s0   | r|t dt| ƒ g| ¢R Ž ƒ g | d d …< dS )Nr   r   )r   Úlen)rG   Úwriter>   r>   r?   Ú
_flushbitsõ   s   rN   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   éÿÿÿÿr@   r   r   r   r   r   r   r   r   r   Ú rA   rB   r   r   r#   r$   r&   )r   rM   r)   Ú	enumerater,   rN   r   ÚintÚ
isinstanceÚstrÚencoderL   Ú_write_tableÚ_write_arrayÚcalendarÚtimegmÚutctimetupleÚgetvalue)
r/   rH   rF   rG   ÚoutrM   r   r5   rI   Úshiftr>   r>   r?   Údumpsü   sl   
















€
r^   c              
   C   s¨   t ƒ }|j}|  ¡ 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 )NrA   rB   r   r   )r   rM   ÚitemsrS   rT   rU   r   rL   Ú_write_itemÚ
ValueErrorr   ÚILLEGAL_TABLE_TYPE_WITH_KEYr/   r0   r[   )r    rM   rG   r\   ÚtwriteÚkr=   Ú
table_datar>   r>   r?   rV   E  s"   
ÿÿrV   c              	   C   sn   t ƒ }|j}| D ]}zt|||ƒ W q ty#   tt t|ƒ|¡ƒ‚w | ¡ }|t	dt
|ƒƒƒ ||ƒ d S )Nr   )r   rM   r`   ra   r   ÚILLEGAL_TABLE_TYPE_WITH_VALUEr/   r0   r[   r   rL   )Úlist_rM   rG   r\   Úawriter=   Ú
array_datar>   r>   r?   rW   W  s   ÿÿrW   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ƒ ‚)NrA   rB   z>cIó   Sz>cBó   tz>cdó   diÿÿÿi  €z>cqó   Lz>ció   Ir   r"   z>cBió   Dz>cQó   Tó   Fó   Aó   V)rS   rT   ÚbytesrU   r   rL   r-   rR   Úfloatr   Úas_tupler   rX   rY   rZ   ÚdictrV   ÚlistÚtuplerW   ra   )r=   rM   rG   ÚsignÚdigitsÚexponentr    r>   r>   r?   r`   e  sD   





ÿ
r`   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   é    r0   é   Úuser_idÚapp_idr   Ú
cluster_id)r   r)   rK   )r1   r2   Ú
propertiesÚflagsr4   Ú_fr>   r>   r?   Údecode_properties_basic‹  s„   





r’   c                   @   sR   e Zd ZdZdZdgZddd„Z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–   Úpropsr>   r>   r?   Ú__init__á  s   
zGenericContent.__init__)	r•   r–   r�   r—   r˜   r™   rš   Ú__dict__Ú__weakref__c                 C   s,   |dkrt dƒ‚|| jv r| j| S t |ƒ‚)NÚ__setstate__)ÚAttributeErrorr�   )r›   Únamer>   r>   r?   Ú__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_idr1   r2   rœ   r>   r>   r?   Ú_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Úgetr,   r   r   rM   r   r^   Újoinr[   )r›   r]   Ú	flag_bitsr�   ÚsformatÚsvaluesrœ   r;   Úproptyper5   ÚresultrM   r>   r>   r?   Ú_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›   r1   r2   r¥   r>   r>   r?   Úinbound_header2  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˜   rL   r™   r,   rt   r¬   Úbodyrš   )r›   r1   Úchunksr>   r>   r?   Úinbound_body:  s   

zGenericContent.inbound_body)NN)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCLASS_IDrª   r�   Ú	__slots__r£   r¦   r²   r´   r·   r>   r>   r>   r?   r“   Ø  s    


#r“   ) r»   rX   r   Údecimalr   Úior   Ústructr   r   Ú
exceptionsr   Úspecr	   Úutilsr
   r)   r   rE   rb   rf   r+   rK   rN   r^   rV   rW   r`   r’   r¼   r¤   r“   r>   r>   r>   r?   Ú<module>   s0    rcI&Iÿ