o
    iiB                     @   s*  d dl mZ d dlZee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 d dlmZ d d	lmZmZ d d
lmZmZmZmZ d dlmZ d dlmZm Z m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z( G dd deZ)e)Z*G dd deZ+dd Z,G dd deZ-dS )    )absolute_importN)time)md5)dequeOrderedDict)chain)reactor)
deferLater)DeferredCancelledError)ProtocolFactoryconnectionDoneClientFactory)Failure)EventManagerAddress
ServerBaseFault)process_contexts)InternalError)log_and_let_goc                   @   s    e Zd ZdZdd Zdd ZdS )!TwistedMessagePackProtocolFactoryNc                 C   s"   t |tsJ || _t| | _d S N)
isinstancer   tptr   event_manager)selfr    r   \/var/www/html/LicenciasMIG/venv/lib/python3.10/site-packages/spyne/server/twisted/msgpack.py__init__2   s   z*TwistedMessagePackProtocolFactory.__init__c                 C   s$   t | j| d}| jd ur| j|_|S )N)factory)TwistedMessagePackProtocolr   IDLE_TIMEOUT_SEC)r   addressretvalr   r   r   buildProtocol8   s   
z/TwistedMessagePackProtocolFactory.buildProtocol)__name__
__module____qualname__r#   r    r&   r   r   r   r   r   /   s    r   c                   @   s   e Zd ZdddZdd ZdS )'TwistedMessagePackProtocolClientFactory    c                 C   s0   t |tsJ d| || _|| _t| | _d S )Nz%r is not a ServerBase instance)r   r   r   max_buffer_sizer   r   )r   r   r,   r   r   r   r    D   s   z0TwistedMessagePackProtocolClientFactory.__init__c                 C   s   t | j| j| dS )N)r,   r!   )r"   r   r,   )r   r$   r   r   r   r&   L   s   z5TwistedMessagePackProtocolClientFactory.buildProtocolN)r+   )r'   r(   r)   r    r&   r   r   r   r   r*   C   s    
r*   c                  G   s   | S r   r   )argsr   r   r   _chaQ   s   r.   c                   @   s   e Zd ZdZdZedZ		d8ddZed	d
 Z	dd Z
dd ZefddZdd Zdd Zdd Zdd Zdd Zd9ddZd9ddZedd  Zed!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Z d:d6d7Z!dS );r"   r   zidle timeoutinfr+      Nc                 C   s   ddl m} t||sJ d|t||| _tjd|d| _|| _	|| _
|| _|| _d| _d| _d| _d| _d| _t | _t | _t | _d| _dS )	aJ  Twisted protocol implementation for Spyne's MessagePack transport.

        :param tpt: Spyne transport. It's an app-wide instance.
        :param max_buffer_size: Max. encoded message size.
        :param out_chunk_size: Split
        :param factory: Twisted protocol factory

        Supported events:
            * ``outresp_flushed(ctx, ctxid, data)``
                Called right after response data is flushed to the socket.
                    * ctx: Always None
                    * ctxid: Integer equal to ``id(ctx)``
                    * data: Flushed bytes object

        r   )MessagePackTransportBasezExpected {!r} got {!r}T)rawr,    NF)spyne.server.msgpackr1   r   formattype	spyne_tptmsgpackUnpacker_bufferout_chunk_sizeout_chunk_delay_secmax_in_queue_sizer!   sessid	_delaying
sent_bytes
recv_bytes
idle_timerr   
out_chunksr   inreq_queueinactive_queuedisconnecting)r   r   r,   r;   r<   r=   r!   r1   r   r   r   r    Z   s*   
z#TwistedMessagePackProtocol.__init__c                 c   s`    t | tjr	 | |}|sn|V  q|   dS tdt| |D ]}| |||  V  q"dS )z'Yield successive n-sized chunks from l.Tr   N)r   ioBufferedIOBasereadcloserangelen)lndatair   r   r   
gen_chunks   s   
z%TwistedMessagePackProtocol.gen_chunksc                 G   s6   t t| j t g|R  }tt|d	 S )z)It's up to you to use this in a subclass.utf8)
r.   r   from_twisted_address	transportgetPeerr   r   reprencode	hexdigest)r   r-   r%   r   r   r   
gen_sessid   s   z%TwistedMessagePackProtocol.gen_sessidc                 C   s~   t dt|  d| _d | _d| _d| _d | _t | _	t
 | _t | _t | _d| _|   | jd ur=| jjd|  d S d S )Nz%08x connection mader3   r   Fconnection_made)loggerdebugidr>   r?   r@   rA   rB   r   rC   r   rD   rE   dictactive_queuerF   _reset_idle_timerr!   r   
fire_eventr   r   r   r   connectionMade   s   
z)TwistedMessagePackProtocol.connectionMadec                 C   sX   |t u rtdt|  n	tdt| | d| _| jd ur&| jjd|  |   d S )Nz%08x connection donez%08x connection lost: %sFconnection_lost)	r   r[   r\   r]   rF   r!   r   ra   _cancel_idle_timerr   reasonr   r   r   connectionLost   s   
z)TwistedMessagePackProtocol.connectionLostc                 C   sT   | j d ur(| j js#z| j   W n ty"   | j `| j `| j `Y nw d | _ d S d S r   )rB   calledcancelAttributeErrorfuncr-   kwrb   r   r   r   re      s   


z-TwistedMessagePackProtocol._cancel_idle_timerc                 C   sz   | j | |  jt|7  _|   | j D ]$}z| | W n ty3 } ztd||  d }~ww | j	r: d S qd S )Nz*Error %r while processing incoming data %r)
r:   feedrA   rL   r`   process_incoming_message	Exceptionr[   errorrF   )r   rO   msger   r   r   dataReceived   s"   
z'TwistedMessagePackProtocol.dataReceivedc                 C   sj   | j d ur| j }d | _ |js|  | jd ur1| jdkr3tt| j| j| j| j	| j
| _ d S d S d S Nr   )rB   ri   rj   r#   r	   r   loseConnectionIDLE_TIMEOUT_MSG
addErrback_err_idle_cancelled!_err_idle_cancelled_unknown_error)r   tr   r   r   r`      s   
z,TwistedMessagePackProtocol._reset_idle_timerc                 C   s   | t d S r   )trapr   r   errr   r   r   ry      s   z.TwistedMessagePackProtocol._err_idle_cancelledc                 C   s   t d| j|  d | _d S )Nz)Sessid %s error cancelling idle timer: %s)r[   rq   r>   getTracebackrB   r}   r   r   r   rz      s   

z<TwistedMessagePackProtocol._err_idle_cancelled_unknown_errorc                 C   s&   d| _ d | _td| | j  d S )NTzAborting connection because %s)rF   rB   r[   r\   rT   abortConnectionrf   r   r   r   rv      s   z)TwistedMessagePackProtocol.loseConnectionc                 C   sX   | j |\}}||_t| j |j_| |j_| j	|j_	| j
||f |   d S r   )r7   produce_contextsoob_ctxr   rS   rT   rU   remote_addrprotocolr>   rE   appendprocess_inactive)r   rr   oobp_ctxothersr   r   r   ro      s   
z3TwistedMessagePackProtocol.process_incoming_messagec                 C   
   t | jS r   )rL   rD   rb   r   r   r   num_active_contexts     
z.TwistedMessagePackProtocol.num_active_contextsc                 C   r   r   )rL   rE   rb   r   r   r   num_inactive_contexts  r   z0TwistedMessagePackProtocol.num_inactive_contextsc                 C   s  | j  }t|}| jdkr5| jdkr4| j \}}|| jt	|< d | j
t	|< | || | jdksnB| j| jk rf| jdkrf| j \}}|| jt	|< d | j
t	|< | || | j| jk rf| jdks@| j| jkrwtd| | d td|| j| j d S )Nr   z2%s Too many inactive contexts. Closing connection.zToo many inactive contextsz%s active %d inactive %d)rT   rU   r   rS   r=   r   rE   popleftr_   r]   rD   r   r   MAX_INACTIVE_CONTEXTSr[   rq   rv   r\   )r   peeraddr_strr   r   r   r   r   r   
  s4   







z+TwistedMessagePackProtocol.process_inactivec                 C   s   | j | d u s	J || j |< t| j  D ](\}}|d u r n| | | jjdd || | j |= | j|   | j|= q| 	  d S )Noutresp_flushed)
rD   listitems	out_writer7   r   ra   r_   rJ   r   )r   ctxidrO   kvr   r   r   enqueue_outresp_data'  s   



z/TwistedMessagePackProtocol.enqueue_outresp_datac                 C   s   | j dkr0t|tjr| }|d | j|  n
t	|}| j| |  j
|7  _
d S t|tjr;|d | || j }| j| ttd| j d S ru   )r;   r   rG   rH   tellseekrT   writerI   rL   r@   rQ   rC   r   r	   r   _write_single_chunk)r   reqdatanbyteschunksr   r   r   r   8  s   


z$TwistedMessagePackProtocol.out_writec                 C   s   t t| j| jS r   )r	   r   r<   r   rb   r   r   r   _wait_for_next_chunkL  s   z/TwistedMessagePackProtocol._wait_for_next_chunkc                 C   s   z
t t| j}W n ty   d }| j  Y nw |d u r+d | _td| j	 d S | j
| |  jt|7  _| jrQ| jsQ|  | _td| j	t| d S td| j	 | j  d S )Nz%s no more chunks...zE%s One chunk of %d bytes written. Delaying before next chunk write...z6%s Disconnection detected, discarding remaining chunks)nextr   from_iterablerC   StopIterationclearr?   r[   r\   r>   rT   r   r@   rL   	connectedrF   r   )r   chunkr   r   r   r   P  s(   

z.TwistedMessagePackProtocol._write_single_chunkc           
   
   C   s  | j | t|tr| j j}n| j j}|jd }t|tr$t|	 }t
|jdd }|d u r7|t|f}n|t||f}|jd urM|jj| d S |jd uret|}t||j_| t|| zt| |||d W d S  ty }	 ztd|	 t|	 W Y d }	~	d S d }	~	ww )Nr   tag)rq   z%Exception ignored from aux method: %r)r7   get_out_stringr   r   OUT_RESPONSE_SERVER_ERROROUT_RESPONSE_CLIENT_ERRORout_documentr^   r   valuesgetattrrT   r8   packbr   dcallbackrL   resp_lengthr   r]   r   rp   r[   rq   	exception)
r   r   r   excrq   rO   r   
out_object
out_stringrs   r   r   r   handle_errork  s2   






z'TwistedMessagePackProtocol.handle_errorc                 C   s$   | | j||| j||ttS r   )addCallback_cb_deferredrx   _eb_deferredr   r[   )r   r   r   r   r   r   r   _register_callbacks  s
   z.TwistedMessagePackProtocol._register_callbacksc                 C   s   |j r| |||j  d S | j| |j r&t|j  | |||j  d S | j| |jr9| |||j d S |j}t	|t
rJ| ||| d S |jd }t	|t
r]| ||| d S | j|j||dd d S )Nr   T)nowrap)in_errorr   r7   get_in_objectr[   rq   get_out_object	out_errorr   r   r
   r   r   )r   r   r   retr   r   r   r     s&   


z+TwistedMessagePackProtocol.process_contextsc              
   C   s   t |tsJ t |jtr|j|_nt|j|_t|dds%t|	  z| 
|||j W d S  tyB } zt|  d }~ww )NloggedF)r   r   valuer   r   r   r   r[   rq   r   r   rp   r   )r   failr   r   rs   r   r   r   r     s   

z'TwistedMessagePackProtocol._eb_deferredFc              
   C   s&  |s|j  r|g|_nt|j jjdkr||_n|g|_|jd ur5t|jjt	s+J |jj
|j d S zOz"| j| | j| d|j}t||j_| t|| W n& ty~ } zt| td| | ||t| W Y d }~nd }~ww W |  n|  w t| j|| d S )Nr0       z%r)
descriptoris_out_barer   rL   out_message
_type_infor   r   r   r
   r   r7   r   packjoinr   rT   r   r   r]   rp   r[   r   rq   r   r   rJ   r   )r   r   r   r   r   r   rs   r   r   r   r     s2   



z'TwistedMessagePackProtocol._cb_deferred)r+   r   r0   r   Nr   )F)"r'   r(   r)   r#   rw   floatr   r    staticmethodrQ   rY   rc   r   rh   re   rt   r`   ry   rz   rv   ro   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   U   sB    
)





$r"   ).
__future__r   logging	getLoggerr'   r[   rG   r8   r   hashlibr   collectionsr   r   	itertoolsr   twisted.internetr   twisted.internet.taskr	   twisted.internet.deferr
   r   twisted.internet.protocolr   r   r   r   twisted.python.failurer   spyner   r   r   r   spyne.auxprocr   spyne.errorr   spyne.server.twistedr   r   'TwistedMessagePackProtocolServerFactoryr*   r.   r"   r   r   r   r   <module>   s.   
