U
    •uÄc^  ã                   @   s  d dl Z d dlZd dlm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 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 )é    N)ÚOptional)ÚFactory)ÚInt32StringReceiver)ÚConnectionDone)ÚCancelledError)ÚpublicÚ_LazyHexFormatter)Úcreate_transport_detailsÚtransport_channel_id)ÚTransportDetails)ÚProtocolErrorÚSerializationErrorÚTransportLostÚInvalidUriError)ÚPayloadExceededError)ÚWampRawSocketServerProtocolÚWampRawSocketClientProtocolÚWampRawSocketServerFactoryÚWampRawSocketClientFactoryc                   @   s    e Zd ZU dZe ¡ ZdZee	 e
d< dZee e
d< dd„ Zeee dœ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.
    NÚpeerÚ	is_serverc                 C   s   d| _ d | _d S ©Né   )Ú_max_message_sizeÚ_transport_details©Úself© r   ú^/var/www/html/CISBACKEND/school/venv/lib/python3.8/site-packages/autobahn/twisted/rawsocket.pyÚ__init__=   s    zWampRawSocketProtocol.__init__)Úreturnc                 C   s   | j S )zZ
        Implements :func:`autobahn.wamp.interfaces.ITransport.transport_details`
        )r   r   r   r   r   Útransport_detailsB   s    z'WampRawSocketProtocol.transport_detailsc                 C   s   d  || j¡}t|ƒ‚d S )NzqRawSocket connection: length of received message exceeded (message was {} bytes, but current maximum is {} bytes))ÚformatÚ
MAX_LENGTHr   )r   ÚlengthÚemsgr   r   r   ÚlengthLimitExceededI   s    z)WampRawSocketProtocol.lengthLimitExceededc                 C   sP   t | j| jƒ| _tj| j_| jj| _t 	¡ | _
d | _d | _d| _d| _d | _d S )NFó    )r	   Ú	transportr   r   r   ZCHANNEL_FRAMING_RAWSOCKETZchannel_framingr   ÚtxaioÚcreate_futureÚ	is_closedÚ_sessionÚ_serializerÚ_handshake_completeÚ_handshake_bytesÚ_max_len_sendr   r   r   r   ÚconnectionMadeO   s    


z$WampRawSocketProtocol.connectionMadec              
   C   sÀ   z`| j jr(dt| j| j jdƒi}|| j _| j ¡ | _| j	j
d| j| jj| jjd� | j | ¡}W n@ tk
r  } z"| j	jd| jj|d� |  ¡  W 5 d }~X Y nX | j	j
d| jj| j|d� d S )Nz
tls-uniquez2{klass}._on_handshake_complete(): calling {method})ÚsessionÚklassÚmethodzX{klass}._on_handshake_complete(): ApplicationSession constructor / onOpen raised ({err})©r4   Úerrz@{klass}._on_handshake_complete(): {session} started (res={res}).)r4   r3   Úres)r   Z	is_securer
   r)   r   Ú
channel_idÚfactoryÚ_factoryr-   ÚlogÚdebugÚ	__class__Ú__name__ZonOpenÚ	ExceptionÚwarnÚabort)r   r9   r8   Úer   r   r   Ú_on_handshake_completes   s,     ÿ ÿ ÿ ÿz,WampRawSocketProtocol._on_handshake_completec              
   C   sŠ   | j jd| jj|d� t | j| ¡ z"t|jt	ƒ}| j
rD| j
 |¡ W n8 tk
r~ } z| j jd| jj|d� W 5 d }~X Y nX d | _
d S )Nz({klass}.connectionLost(reason="{reason}")r4   ÚreasonzC{klass}.connectionLost(): ApplicationSession.onClose raised "{err}"r6   )r<   r=   r>   r?   r*   Úresolver,   Ú
isinstanceÚvaluer   r-   ZonCloser@   rA   )r   rE   ZwasCleanrC   r   r   r   ÚconnectionLostŒ   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 �n„ t	k
rŽ } z| j j
d| jj|d� W 5 d }~X Y �nL tk
rÎ } z"| j jd| jj|d� |  ¡  W 5 d }~X Y �n tk
�r } z"| j jd| jj|d� |  ¡  W 5 d }~X Y nÌ tk
�rN } z"| j jd	| jj|d� |  ¡  W 5 d }~X Y nŒ tk
�rŽ } z"| j jd
| jj|d� |  ¡  W 5 d }~X Y nL tk
�rØ } z,| j  ¡  | j jd| jj|d� |  ¡  W 5 d }~X Y nX d S )Nz,{klass}.stringReceived(): RX {octets} octets©r4   Úoctetsz.{klass}.stringReceived: RX WAMP message: {msg})r4   ÚmsgzM{klass}.stringReceived: WAMP CancelledError - connection will continue!
{err}r6   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   r.   Zunserializer-   Z	onMessager   r=   r   rA   rB   r   r   r   r@   Zfailure)r   ÚpayloadrL   rC   r   r   r   ÚstringReceived™   s^     ÿ ÿþþþþþ
þz$WampRawSocketProtocol.stringReceivedc              
   C   sÞ   |   ¡ rÔ| jjd| jj|| jd� z| j |¡\}}W n0 tk
rf } ztd |¡ƒ‚W 5 d}~X Y qÚX t	|ƒ}d| j
  k r†|k r®n n$d || j
¡}| j |¡ t|ƒ‚qÚ|  |¡ | jjd| jjt|ƒd� ntƒ ‚dS )	zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        zB{klass}.send() (serializer={serializer}): TX WAMP message: "{msg}")r4   rL   Ú
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} octetsrJ   )ÚisOpenr<   rM   r>   r?   r.   Ú	serializer   r#   Úlenr1   rA   r   Z
sendStringr   r   )r   rL   rN   Ú_rC   Zpayload_lenr&   r   r   r   ÚsendÆ   s0      ÿ  ÿ

 ÿzWampRawSocketProtocol.sendc                 C   s
   | j dk	S )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        N)r-   r   r   r   r   rQ   à   s    zWampRawSocketProtocol.isOpenc                 C   s   |   ¡ r| j ¡  ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)rQ   r)   ÚloseConnectionr   r   r   r   r   Úcloseæ   s    zWampRawSocketProtocol.closec                 C   s6   |   ¡ r,t| jdƒr | j ¡  q2| j ¡  ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        ÚabortConnectionN)rQ   Úhasattrr)   rX   rV   r   r   r   r   r   rB   ï   s
    zWampRawSocketProtocol.abort)r?   Ú
__module__Ú__qualname__Ú__doc__r*   Úmake_loggerr<   r   r   ÚstrÚ__annotations__r   Úboolr    Úpropertyr   r"   r'   r2   rD   rI   rO   rU   rQ   rW   rB   r   r   r   r   r   4   s    
$-	r   c                   @   s   e Zd ZdZ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 | |¡ �nÈdt| jƒ }|  j|d |… 7  _t| jƒdk�rÂ| jjdt| jƒd� t| jdd… ƒ}|dkr”| jj	d|d� |  
¡  n| j d	¡ d
dt| jdd
… ƒd?   | _| jjd| jd� t| jdd
… ƒd@ }|| jjk�rt | 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 )Né   zDWampRawSocketServerProtocol: opening handshake received - 0x{octets})rK   r   é   é   zmWampRawSocketServerProtocol: invalid magic byte (octet 1) in opening handshake: was {magic}, but expected 127©Úmagicz8WampRawSocketServerProtocol: correct magic byte receivedé   é	   z^WampRawSocketServerProtocol: client requests us to send out most {max_bytes} bytes per message)Z	max_bytesé   zJWampRawSocketServerProtocol: client wants to use serializer '{serializer}'©rP   z‡WampRawSocketServerProtocol: opening handshake - no suitable serializer found (client requested {serializer}, and we have {serializers}©rP   Úserializersó   ó     TzFWampRawSocketServerProtocol: opening handshake completed: {serializer})r/   r   ÚdataReceivedrS   r0   r<   r=   r   ÚordrA   rB   r1   r:   Ú_serializersÚcopyr.   ÚkeysÚintÚmathÚceilr   r$   ÚbytesÚ	bytearrayÚRAWSOCKET_SERIALIZER_IDr)   ÚwriterD   )r   ÚdataÚ	remainingZ_magicÚser_idZreply_max_len_expZreply_octet2r   r   r   ro     sh    þý
 þþ
ý
ÿþz(WampRawSocketServerProtocol.dataReceivedN)r?   rZ   r[   r\   ro   r   r   r   r   r   ý   s   r   c                   @   s    e Zd ZdZdd„ Z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 )Nrg   rh   rb   rm   rn   )r   r2   rr   r:   r.   rt   ru   rv   r<   r   r$   rw   rx   ry   r)   rz   )r   Zrequest_max_len_expZrequest_octet2r   r   r   r2   f  s    

ÿz*WampRawSocketClientProtocol.connectionMadec                 C   sL  | j rt | |¡ �n2dt| jƒ }|  j|d |… 7  _t| jƒdk�r,| jjdt| jƒd� t| jdd… ƒdkr˜| 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 … }|�rH|  |¡ d S )Nrb   zEWampRawSocketClientProtocol: opening handshake received - {handshake})Z	handshaker   rc   rd   zpWampRawSocketClientProtocol: invalid magic byte (octet 1) in opening handshake: was 0x{magic}, but expected 0x7fre   rg   rh   zXWampRawSocketClientProtocol: server requests us to send out most {max} bytes per message)Úmaxri   z‹WampRawSocketClientProtocol: opening handshake - no suitable serializer found (server replied {serializer}, and we requested {serializers})rk   TzXWampRawSocketClientProtocol: opening handshake completed (using serializer {serializer})rj   )r/   r   ro   rS   r0   r<   r=   r   rp   rB   r1   r.   ry   ÚerrorrD   )r   r{   r|   r}   r   r   r   ro   y  sJ    þþ þýþz(WampRawSocketClientProtocol.dataReceivedN)r?   rZ   r[   r\   r2   ro   r   r   r   r   r   \  s   r   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>Â  r(   z/WampRawSocketFactory.__init__.<locals>.<lambda>r   N)Úcallabler;   r   )r   r:   r   r�   r   r    ¸  s    zWampRawSocketFactory.__init__c                 C   s
   d| _ d S r   )r   r   r   r   r   ÚresetProtocolOptionsÇ  s    z)WampRawSocketFactory.resetProtocolOptionsNc                 C   sZ   | j jd| jj|d� |d ks>t|ƒtkr:|dkr:|dks>t‚|d k	rV|| jkrV|| _d S )NzI{klass}.setProtocolOptions(maxMessagePayloadSize={maxMessagePayloadSize}))r4   ÚmaxMessagePayloadSizei   r   )r<   r=   r>   r?   Útypert   ÚAssertionErrorr   )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}))r4   Úaddrzf{klass}.buildProtocol() -> proto={proto}, max_message_size={max_message_size}, MAX_LENGTH={MAX_LENGTH})r4   ÚprotoZmax_message_sizer$   )r<   r=   r>   r?   Úprotocolr:   r   r$   )r   r‰   Úpr   r   r   ÚbuildProtocolÑ  s       ÿz"WampRawSocketFactory.buildProtocol)N)r?   rZ   r[   r\   r*   r]   r<   r    r„   rˆ   r�   r   r   r   r   r€   ²  s   
r€   c                   @   s   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   sT  t  | |¡ |dk�r2g }z,ddlm} | |dd�¡ | |ƒ ¡ W n tk
rZ   Y nX z,ddlm} | |dd�¡ | |ƒ ¡ W n tk
rœ   Y nX z,ddlm} | |dd�¡ | |ƒ ¡ W n tk
rÞ   Y nX z,ddlm} | |dd�¡ | |ƒ ¡ W n tk
�r"   Y nX |�s2t	d	ƒ‚i | _
|D ]}|| j
|j< �q<d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)Z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•   Zserr   r   r   r    ä  s@    
z#WampRawSocketServerFactory.__init__)N)r?   rZ   r[   r\   r   r‹   r    r   r   r   r   r   Ü  s   r   c                   @   s   e Zd ZdZeZddd„ZdS )r   zD
    Twisted-based WAMP-over-RawSocket client protocol factory.
    Nc                 C   sü   t  | |¡ d| _|dkrFzddlm} |ƒ }W n tk
rD   Y nX |dkrzzddlm} |ƒ }W n tk
rx   Y nX |dkr®zddlm} |ƒ }W n tk
r¬   Y nX |dkrâzddlm} |ƒ }W n tk
rà   Y nX |dkròt	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`
        FNr   rŽ   r�   r’   r”   z$could not import any WAMP serializer)r€   r    Znoisyr–   r�   r˜   r‘   r“   r•   r@   r.   )r   r:   rP   r�   r‘   r“   r•   r   r   r   r    %  s:    



z#WampRawSocketClientFactory.__init__)N)r?   rZ   r[   r\   r   r‹   r    r   r   r   r   r     s   r   )#rr   ru   Útypingr   r*   Ztwisted.internet.protocolr   Ztwisted.protocols.basicr   Ztwisted.internet.errorr   Ztwisted.internet.deferr   Zautobahn.utilr   r   Zautobahn.twisted.utilr	   r
   Zautobahn.wamp.typesr   Zautobahn.wamp.exceptionr   r   r   r   Zautobahn.exceptionr   Ú__all__r   r   r   r€   r   r   r   r   r   r   Ú<module>   s0    J^U*@