o
    @BiY                     @   s  d dl m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
 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mZmZ d dlmZ dZG dd deZeG dd deZeG dd deZG dd deZeG dd deZeG dd deZ dS )    )absolute_importN)Factory)Int32StringReceiver)ConnectionDone)CancelledError)public)peer2strtransport_channel_id)_LazyHexFormatter)ProtocolErrorSerializationErrorTransportLostInvalidUriError)PayloadExceededError)WampRawSocketServerProtocolWampRawSocketClientProtocolWampRawSocketServerFactoryWampRawSocketClientFactoryc                   @   sh   e Zd ZdZe 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dd Zdd ZdS )WampRawSocketProtocolzE
    Base class for Twisted-based WAMP-over-RawSocket protocols.
    c                 C   
   d| _ d S N   _max_message_sizeself r   Z/var/www/html/Trade-python/venv/lib/python3.10/site-packages/autobahn/twisted/rawsocket.py__init__:   s   
zWampRawSocketProtocol.__init__c                 C   s   d || j}t|)NzqRawSocket connection: length of received message exceeded (message was {} bytes, but current maximum is {} bytes))format
MAX_LENGTHr   )r   lengthemsgr   r   r   lengthLimitExceeded>   s   z)WampRawSocketProtocol.lengthLimitExceededc                 C   sr   | j jd| jjd z| j }W n ty   d| _Y nw t|| _t	
 | _d | _d | _d| _d| _d | _d S )Nz{klass}.connectionMade())klass?F    )logdebug	__class____name__	transportgetPeerAttributeErrorpeerr   txaiocreate_future	is_closed_session_serializer_handshake_complete_handshake_bytes_max_len_send)r   r.   r   r   r   connectionMadeD   s   



z$WampRawSocketProtocol.connectionMadec              
   C   sr   z| j  | _| j|  W n" ty0 } z| jjd| jj|d | 	  W Y d }~d S d }~ww | j
d d S )NzX{klass}._on_handshake_complete(): ApplicationSession constructor / onOpen raised ({err})r$   errzApplicationSession started.)factory_factoryr2   onOpen	Exceptionr'   warnr)   r*   abortr(   )r   er   r   r   _on_handshake_completej   s   z,WampRawSocketProtocol._on_handshake_completec              
   C   s   | j jd| jj|d t| j|  zt|jt	}| j
r"| j
| W n ty@ } z| j jd| jj|d W Y d }~nd }~ww d | _
d S )Nz({klass}.connectionLost(reason="{reason}")r$   reasonzC{klass}.connectionLost(): ApplicationSession.onClose raised "{err}"r8   )r'   r(   r)   r*   r/   resolver1   
isinstancevaluer   r2   onCloser=   r>   )r   rB   wasCleanr@   r   r   r   connectionLostv   s   
z$WampRawSocketProtocol.connectionLostc              
   C   s  | j jd| jjt|d z| j|D ]}| j jd| jj|d | j| qW d S  t	yH } z| j j
d| jj|d W Y d }~d S d }~w tyi } z| j jd| jj|d |   W Y d }~d S d }~w ty } z| j jd| jj|d |   W Y d }~d S d }~w ty } z| j jd	| jj|d |   W Y d }~d S d }~w ty } z| j jd
| jj|d |   W Y d }~d S d }~w ty } z| j jd| jj|d |   W Y d }~d S d }~ww )Nz,{klass}.stringReceived(): RX {octets} octetsr$   octetsz.{klass}.stringReceived: RX WAMP message: {msg})r$   msgzM{klass}.stringReceived: WAMP CancelledError - connection will continue!
{err}r8   zI{klass}.stringReceived: WAMP InvalidUriError - aborting connection!
{err}zG{klass}.stringReceived: WAMP ProtocolError - aborting connection!
{err}zN{klass}.stringReceived: WAMP PayloadExceededError - aborting connection!
{err}zL{klass}.stringReceived: WAMP SerializationError - aborting connection!
{err}zC{klass}.stringReceived: WAMP Exception - aborting connection!
{err})r'   tracer)   r*   r
   r3   unserializer2   	onMessager   r(   r   r>   r?   r   r   r   r=   )r   payloadrK   r@   r   r   r   stringReceived   sh   z$WampRawSocketProtocol.stringReceivedc              
   C   s   |   re| jjd| jj|| jd z
| j|\}}W n ty. } ztd|d}~ww t	|}d| j
  k r>|k rQn nd|| j
}| j| t|| | | jjd| jjt|d dS t )	zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        zB{klass}.send() (serializer={serializer}): TX WAMP message: "{msg}")r$   rK   
serializerzIWampRawSocketProtocol: unable to serialize WAMP application payload ({0})Nr   zQtried to send RawSocket message with size {} exceeding payload limit of {} octetsz"{klass}.send(): TX {octets} octetsrI   )isOpenr'   rL   r)   r*   r3   	serializer   r   lenr6   r>   r   
sendStringr
   r   )r   rK   rO   _r@   payload_lenr"   r   r   r   send   s,   

zWampRawSocketProtocol.sendc                 C   s
   | j duS )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        N)r2   r   r   r   r   rR      s   
zWampRawSocketProtocol.isOpenc                 C   s   |   r| j  dS t )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)rR   r+   loseConnectionr   r   r   r   r   close   s   zWampRawSocketProtocol.closec                 C   s6   |   rt| jdr| j  dS | j  dS t )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        abortConnectionN)rR   hasattrr+   r[   rY   r   r   r   r   r   r?      s
   zWampRawSocketProtocol.abortN)r*   
__module____qualname____doc__r/   make_loggerr'   r   r#   r7   rA   rH   rP   rX   rR   rZ   r?   r   r   r   r   r   4   s    &,	r   c                   @   s"   e Zd ZdZdd ZdddZdS )	r   z
    Twisted-based WAMP-over-RawSocket server protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s  | j rt| | d S dt| j }|  j|d | 7  _t| jdkr| jjdt| jd t| jdd dkrK| jj	dt| jd d | 
  d	d
t| jdd	 d?   | _| jjd| jd t| jdd	 d@ }|| jjv rt| jj| | _| jjd|d n| jj	d|| jj d | 
  ttt| jd	}d	| | _tt|d
 d> | jjB g}| jd | j| | jd d| _ |   | jjd| jd ||d  }|r| | d S d S )N   zBWampRawSocketServerProtocol: opening handshake received - {octets})rJ   r         zpWampRawSocketServerProtocol: invalid magic byte (octet 1) in opening handshake: was 0x{magic}, but expected 0x7fmagic   	   z^WampRawSocketServerProtocol: client requests us to send out most {max_bytes} bytes per message)	max_bytes   zJWampRawSocketServerProtocol: client wants to use serializer '{serializer}'rQ   zWampRawSocketServerProtocol: opening handshake - no suitable serializer found (client requested {serializer}, and we have {serializers}rQ   serializers        TzFWampRawSocketServerProtocol: opening handshake completed: {serializer})r4   r   dataReceivedrT   r5   r'   r(   r
   ordr>   r?   r6   r:   _serializerscopyr3   keysintmathceilr   r    bytes	bytearrayRAWSOCKET_SERIALIZER_IDr+   writerA   )r   data	remainingser_idreply_max_len_expreply_octet2r   r   r   ro      sf    

z(WampRawSocketServerProtocol.dataReceived
tls-uniquec                 C      t | jd|dS )W
        Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id`
        T	is_serverchannel_id_typer	   r+   r   r   r   r   r   get_channel_id?     z*WampRawSocketServerProtocol.get_channel_idNr   )r*   r]   r^   r_   ro   r   r   r   r   r   r      s    Or   c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )r   z
    Twisted-based WAMP-over-RawSocket client protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s   t |  t| jj| _ttt| j	d}d| | _
tt|d d> | jjB g}| jd | j| | jd d S )Nrf   rg   ra   rm   rn   )r   r7   rr   r:   r3   rt   ru   rv   r'   r   r    rw   rx   ry   r+   rz   )r   request_max_len_exprequest_octet2r   r   r   r7   P  s   

z*WampRawSocketClientProtocol.connectionMadec                 C   sJ  | j rt| | d S dt| j }|  j|d | 7  _t| jdkr| jjdt| jd t| jdd dkrK| jjdt| jd d | 	  d	d
t| jdd	 d?   | _
| jjd| j
d t| jdd	 d@ }|| jjkr| jjd|| jjd | 	  d| _ |   | jjd| jd ||d  }|r| | d S d S )Nra   zEWampRawSocketClientProtocol: opening handshake received - {handshake})	handshaker   rb   rc   zpWampRawSocketClientProtocol: invalid magic byte (octet 1) in opening handshake: was 0x{magic}, but expected 0x7frd   rf   rg   zXWampRawSocketClientProtocol: server requests us to send out most {max} bytes per message)maxri   zWampRawSocketClientProtocol: opening handshake - no suitable serializer found (server replied {serializer}, and we requested {serializers})rk   TzXWampRawSocketClientProtocol: opening handshake completed (using serializer {serializer})rj   )r4   r   ro   rT   r5   r'   r(   r
   rp   r?   r6   r3   ry   errorrA   )r   r{   r|   r}   r   r   r   ro   c  sL    z(WampRawSocketClientProtocol.dataReceivedr   c                 C   r   )r   Fr   r   r   r   r   r   r     r   z*WampRawSocketClientProtocol.get_channel_idNr   )r*   r]   r^   r_   r7   ro   r   r   r   r   r   r   F  s
    8r   c                   @   s:   e Zd ZdZe Zdd Zdd ZdddZ	d	d
 Z
dS )WampRawSocketFactoryzE
    Base class for Twisted-based WAMP-over-RawSocket factories.
    c                    s(   t  r | _n fdd| _d| _dS )z

        :param factory: A callable that produces instances that implement
            :class:`autobahn.wamp.interfaces.ITransportHandler`
        :type factory: callable
        c                      s    S Nr   r   r:   r   r   <lambda>  s    z/WampRawSocketFactory.__init__.<locals>.<lambda>r   N)callabler;   r   )r   r:   r   r   r   r     s   
zWampRawSocketFactory.__init__c                 C   r   r   r   r   r   r   r   resetProtocolOptions  s   
z)WampRawSocketFactory.resetProtocolOptionsNc                 C   sb   | j jd| jj|d |d u st|tkr|dkr|dksJ |d ur-|| jkr/|| _d S d S d S )NzI{klass}.setProtocolOptions(maxMessagePayloadSize={maxMessagePayloadSize}))r$   maxMessagePayloadSizei   r   )r'   r(   r)   r*   typert   r   )r   r   r   r   r   setProtocolOptions  s   (
z'WampRawSocketFactory.setProtocolOptionsc                 C   sV   | j jd| jj|d |  }| |_| j|_| j|_| j jd| jj||j|jd |S )Nz"{klass}.buildProtocol(addr={addr}))r$   addrzf{klass}.buildProtocol() -> proto={proto}, max_message_size={max_message_size}, MAX_LENGTH={MAX_LENGTH})r$   protomax_message_sizer    )r'   r(   r)   r*   protocolr:   r   r    )r   r   pr   r   r   buildProtocol  s   z"WampRawSocketFactory.buildProtocolr   )r*   r]   r^   r_   r/   r`   r'   r   r   r   r   r   r   r   r   r     s    
r   c                   @      e Zd ZdZeZdddZdS )r   zD
    Twisted-based WAMP-over-RawSocket server protocol factory.
    Nc                 C   sD  t | | |du rg }zddlm} ||dd ||  W n	 ty+   Y nw zddlm} ||dd ||  W n	 tyK   Y nw zddlm} ||dd ||  W n	 tyk   Y nw zddlm} ||dd ||  W n	 ty   Y nw |st	d	i | _
|D ]}|| j
|j< qdS )
a  

        :param factory: A callable that produces instances that implement
            :class:`autobahn.wamp.interfaces.ITransportHandler`
        :type factory: callable

        :param serializers: A list of WAMP serializers to use (or ``None``
            for all available serializers).
        :type serializers: list of objects implementing
            :class:`autobahn.wamp.interfaces.ISerializer`
        Nr   CBORSerializerT)batchedMsgPackSerializerUBJSONSerializerJsonSerializerz%could not import any WAMP serializers)r   r   autobahn.wamp.serializerr   appendImportErrorr   r   r   r=   rq   ry   )r   r:   rl   r   r   r   r   serr   r   r   r     sJ   z#WampRawSocketServerFactory.__init__r   )r*   r]   r^   r_   r   r   r   r   r   r   r   r         r   c                   @   r   )r   zD
    Twisted-based WAMP-over-RawSocket client protocol factory.
    Nc                 C   s   t | | |du rzddlm} | }W n	 ty   Y nw |du r8zddlm} | }W n	 ty7   Y nw |du rQzddlm} | }W n	 tyP   Y nw |du rjzddlm} | }W n	 tyi   Y nw |du rrtd|| _	dS )a  

        :param factory: A callable that produces instances that implement
            :class:`autobahn.wamp.interfaces.ITransportHandler`
        :type factory: callable

        :param serializer: The WAMP serializer to use (or ``None`` for
           "best" serializer, chosen as the first serializer available from
           this list: CBOR, MessagePack, UBJSON, JSON).
        :type serializer: object implementing :class:`autobahn.wamp.interfaces.ISerializer`
        Nr   r   r   r   r   z$could not import any WAMP serializer)
r   r   r   r   r   r   r   r   r=   r3   )r   r:   rQ   r   r   r   r   r   r   r   r     s@   




z#WampRawSocketClientFactory.__init__r   )r*   r]   r^   r_   r   r   r   r   r   r   r   r     r   r   )!
__future__r   rr   ru   r/   twisted.internet.protocolr   twisted.protocols.basicr   twisted.internet.errorr   twisted.internet.deferr   autobahn.utilr   autobahn.twisted.utilr   r	   r
   autobahn.wamp.exceptionr   r   r   r   autobahn.exceptionr   __all__r   r   r   r   r   r   r   r   r   r   <module>   s2    3_[*@