o
    j                  
   @   s$  d dl mZ d dlZeeZd dlZd dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ zd d
lmZ W n eya Z z
dd ZW Y dZ[ndZ[ww dZdd ZG dd deZG dd deZG dd deZ G dd deZ!G dd de!Z"dS )    )absolute_importN)mmap)OrderedDict)MethodContextTransportContextAddress)process_contexts)ValidationErrorInternalError)
ServerBase)binary_type)Deferredc                  O   s   t N)e)___ r   T/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/server/msgpack.pyr   '   s    r   
   c                 C   s   d }|d }t |tttfst|dt|dkr7|d }t |ts't|d| D ]\}}t	|||< q+t
| t
j}|g|_||j_|S )N   zBody must be a bytestream.   zHeader must be a dict.)
isinstancer   r   
memoryviewr	   lendictitemsmsgpackunpackbMessagePackMethodContextSERVER	in_string	transport	in_header)protmsgheaderbodykvctxr   r   r   _process_v1_msg-   s   


r*   c                       s$   e Zd Z fddZdd Z  ZS )MessagePackTransportContextc                    s0   t t| || d | _d | _t | _d | _d S r   )superr+   __init__r"   protocolr   inreq_queuerequest_len)selfparentr!   	__class__r   r   r-   B   s
   
z$MessagePackTransportContext.__init__c                 C   s$   | j d ur| j j }t|S d S r   )r.   r!   getPeerr   from_twisted_address)r1   peerr   r   r   get_peerJ   s   

z$MessagePackTransportContext.get_peer)__name__
__module____qualname__r-   r8   __classcell__r   r   r3   r   r+   A   s    r+   c                   @   s    e Zd ZdZdd Zdd ZdS )MessagePackOobMethodContextdc                 C   s   t d ur
t  | _d S d | _d S r   )r   r>   r1   r   r   r   r-   S   s   
z$MessagePackOobMethodContext.__init__c                 C   s(   | j d ur| j js| j   d S d S d S r   )r>   calledcancelr?   r   r   r   closeY   s   z!MessagePackOobMethodContext.closeN)r9   r:   r;   	__slots__r-   rB   r   r   r   r   r=   P   s    r=   c                       s,   e Zd ZeZ fddZ fddZ  ZS )r   c                    s   d | _ tt| || d S r   )oob_ctxr,   r   r-   )r1   r!   wayr3   r   r   r-   a   s   z!MessagePackMethodContext.__init__c                    sB   t t|   | jd urd | j_d | _| jd ur| j  d S d S r   )r,   r   rB   r!   r.   rD   r?   r3   r   r   rB   f   s   

zMessagePackMethodContext.close)r9   r:   r;   r+   r   r-   rB   r<   r   r   r3   r   r   ^   s    r   c                       sT   e Zd ZdZdZdZdZ fddZdd Zdd Z	dd	 Z
d
d Zdd Z  ZS )MessagePackTransportBaseNc                    s    t t| | | jti| _d S r   )r,   rF   r-   
IN_REQUESTr*   _version_map)r1   appr3   r   r   r-   x   s   
z!MessagePackTransportBase.__init__c                 C   s   t |ttfstd| t|dt|dks%td| tt|dt |d ts9td| t|d d| j	|d d}|du rStd| t|d d	t|d
 }|t
7 }|| |}| |}|d |d
d }}||j_||fS )zProduce contexts based on incoming message.

        :param msg: Parsed request in this format: `[IN_REQUEST, body, header]`
        zIncoming request: %rzRequest must be a listr   z2Request must have at least two elements. It has %rr   z-Request version must be an integer. It was %rNzInvalid incoming request: %rzUnknown request type %rr   )r   listtupleloggerdebugr	   r   intrH   getMSGPACK_SHELL_OVERHEADgenerate_contextsr!   r0   )r1   r$   	processormsgleninitial_ctxcontextsp_ctxothersr   r   r   produce_contexts   s(   


z)MessagePackTransportBase.produce_contextsc              
   C   s   |d |dd  }}|j r| |||j S | | |j r,t|j  | |||j S | | |jr<| |||jS z| | W d S  tyh } zt	| t
d|_| |||jW  Y d }~S d }~ww )Nr   r   zSerialization Error.)in_errorhandle_errorget_in_objectrL   errorget_out_object	out_errorget_out_string	Exception	exceptionr
   )r1   rU   rV   rW   r   r   r   r   r      s$   



z)MessagePackTransportBase.process_contextsc              
   C   sR   |  | zt| |||d W d S  ty( } zt| W Y d }~d S d }~ww )N)r\   )r_   r   r`   rL   ra   )r1   rV   rW   r\   r   r   r   r   rZ      s   
z%MessagePackTransportBase.handle_errorc                 C   s   t t|S r   )r   dumpsstr)r1   r\   r   r   r   handle_transport_error   s   z/MessagePackTransportBase.handle_transport_errorc                 C   s    t | jd|jgf|_d S )N    )r   packbOUT_RESPONSE_NO_ERRORjoin
out_string)r1   r)   r   r   r   pack   s   
zMessagePackTransportBase.pack)r9   r:   r;   rg   OUT_RESPONSE_CLIENT_ERROROUT_RESPONSE_SERVER_ERRORrG   r-   rX   r   rZ   rd   rj   r<   r   r   r3   r   rF   p   s    (	rF   c                   @   s    e Zd ZdZdZdZdZdZdS )MessagePackServerBasezContains the transport protocol logic but not the transport itself.

    Subclasses should implement logic to move bitstreams in and out of this
    class.r   r   r   N)r9   r:   r;   __doc__rg   rk   rl   rG   r   r   r   r   rm      s    rm   )#
__future__r   logging	getLoggerr9   rL   r   r   collectionsr   spyner   r   r   spyne.auxprocr   spyne.errorr	   r
   spyne.serverr   spyne.util.sixr   twisted.internet.deferr   ImportErrorr   rP   r*   r+   objectr=   r   rF   rm   r   r   r   r   <module>   s0   
_