U
    •uÄcKF  ã                   @   s‚  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZmZmZ dZd ZdZd	Zd
ZG dd„ de jƒZG dd„ deƒZdZdddd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%eG dd „ d e$e%e"ƒƒZ&eG d!d"„ d"e$e%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)ÚpublicÚ_LazyHexFormatterÚhltype)ÚProtocolErrorÚSerializationErrorÚTransportLost)ÚTransportDetails)Úget_serializersÚcreate_transport_detailsÚtransport_channel_id)ÚWampRawSocketServerProtocolÚWampRawSocketClientProtocolÚWampRawSocketServerFactoryÚWampRawSocketClientFactoryé   é   é   c                   @   s¶   e Zd ZU dZe e¡ZdZeZe	 
¡ ZdZee ed< dZee ed< eee dœdd„ƒZ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d„ Zdd„ ZdS )ÚPrefixProtocolz!Lé   NÚpeerÚ	is_server)Úreturnc                 C   s   | j S )zZ
        Implements :func:`autobahn.wamp.interfaces.ITransport.transport_details`
        )Ú_transport_details©Úself© r   úY/var/www/html/Manju/school/venv/lib/python3.8/site-packages/autobahn/asyncio/rawsocket.pyÚtransport_details?   s    z PrefixProtocol.transport_detailsc                 C   sV   | j jd| jd� || _t| j| jƒ| _tj| j_	| jj| _d| _
d | _t ¡ | _d S )Nz3RawSocker Asyncio: Connection made with peer {peer})r   ó    )ÚlogÚdebugr   Ú	transportr   r   r   r	   ZCHANNEL_FRAMING_RAWSOCKETZchannel_framingÚ_bufferÚ_headerÚtxaioÚcreate_futureÚ_wait_closed©r   r"   r   r   r   Úconnection_madeF   s    

zPrefixProtocol.connection_madec                 C   s*   t | dƒr| jS t ¡ }| d¡ |S d S )Nr'   T)Úhasattrr'   r%   r&   Ú
set_result)r   Úfr   r   r   Ú	is_closedX   s
    

zPrefixProtocol.is_closedc                 C   s,   | j  d¡ d | _| j d¡ |  |¡ d S )Nz"RawSocker Asyncio: Connection lostT)r    r!   r"   r'   r+   Ú_on_connection_lost©r   Úexcr   r   r   Úconnection_losta   s    zPrefixProtocol.connection_lostc                 C   s   d S ©Nr   r/   r   r   r   r.   g   s    z"PrefixProtocol._on_connection_lostc                 C   s   | j  |¡ | j ¡  d S r2   )r    Úerrorr"   Úclose)r   Úmsgr   r   r   Úprotocol_errorj   s    zPrefixProtocol.protocol_errorc                 C   sH   t |ƒ}|| jkrtdƒ‚t | jt |ƒ¡}| j |¡ | j |¡ d S )NzData too big)ÚlenÚmax_length_sendÚ
ValueErrorÚstructÚpackÚprefix_formatr"   Úwrite)r   ÚdataÚlÚheaderr   r   r   Ú
sendStringn   s    
zPrefixProtocol.sendStringc                 C   s
   t ƒ ‚d S r2   ©ÚNotImplementedError©r   r>   r   r   r   Úpingv   s    zPrefixProtocol.pingc                 C   s
   t ƒ ‚d S r2   rB   rD   r   r   r   Úpongy   s    zPrefixProtocol.pongc                 C   s`  |  j |7  _ d}t| j ƒ}|| jk�rL| jr:| j\}}nt| j ||| j … }t|dd… ƒd@ }|tkrx|  d¡ d S t | j	d|dd …  ¡d }|| j
kr®|  d¡ d S || j |k�r<d | _|| j7 }|| j8 }| j ||| … }||7 }||8 }|tk�r|  |¡ n*|tk�r&|  |¡ n|tk�rJ|  |¡ q||f| _�qLq| j |d … | _ d S )Nr   r   é   zInvalid frame typeó    zFrame too big)r#   r7   Úprefix_lengthr$   ÚordÚFRAME_TYPE_PONGr6   r:   Úunpackr<   Ú
max_lengthÚFRAME_TYPE_DATAÚstringReceivedÚFRAME_TYPE_PINGrE   rF   )r   r>   ÚposÚ	remainingZ
frame_typeZframe_lengthr@   r   r   r   Údata_received|   s>    









zPrefixProtocol.data_receivedc                 C   s
   t ƒ ‚d S r2   rB   rD   r   r   r   rO   ¤   s    zPrefixProtocol.stringReceived)Ú__name__Ú
__module__Ú__qualname__r<   r:   ÚcalcsizerI   rM   r8   r%   Úmake_loggerr    r   r   ÚstrÚ__annotations__r   ÚboolÚpropertyr	   r   r)   r-   r1   r.   r6   rA   rE   rF   rS   rO   r   r   r   r   r   5   s(   


(r   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚRawSocketProtocolc                 C   sX   d }|rHt t t |d¡¡ƒd }|dkr2tdƒ‚d|d  | _|| _nd| _d| _d S )Nr   é	   é   zMaximum length is 16Mr   )ÚintÚmathÚceilr    r9   rM   Ú_length_exp)r   Úmax_sizeÚexpr   r   r   Ú__init__ª   s    zRawSocketProtocol.__init__c                 C   s   t  | |¡ d| _d S )NF)r   r)   Ú_handshake_doner(   r   r   r   r)   ¶   s    z!RawSocketProtocol.connection_madec                 C   s
   t ƒ ‚d S r2   rB   r   r   r   r   Ú_on_handshake_completeº   s    z(RawSocketProtocol._on_handshake_completec                 C   st   t | jd d… ƒ}|d tkr&tdƒ‚|d d@ }|d d? }d|d  | _|d dksd|d dkrltd	ƒ‚||fS )
Né   r   zInvalid magic byte in handshaker   r_   r   r^   é   zReserved bytes must be zero)Ú	bytearrayr#   Ú
MAGIC_BYTEÚHandshakeErrorr8   )r   ÚbufÚserÚlexpr   r   r   Úparse_handshake½   s    z!RawSocketProtocol.parse_handshakec                 C   s
   t ƒ ‚d S r2   rB   r   r   r   r   Úprocess_handshakeÈ   s    z#RawSocketProtocol.process_handshakec              
   C   sÀ   | j jdt|ƒd� | jr&t | |¡S |  j|7  _t| jƒdkr¼z|  ¡  W n: t	k
rˆ } z|  
dj|d�¡ W Y ¢d S d }~X Y nX d| _|  ¡  | jdd … }d| _|r¼t | |¡ d S )Nz'RawSocker Asyncio: data received {data})r>   ri   zHandshake error : {err}©ÚerrTr   )r    r!   r   rg   r   rS   r#   r7   rr   rm   r6   Úformatrh   )r   r>   Úer   r   r   rS   Ë   s     zRawSocketProtocol.data_receivedN)	rT   rU   rV   rf   r)   rh   rq   rr   rS   r   r   r   r   r]   ¨   s   r]   zillegal (must not be used)zserializer unsupportedz#maximum message length unacceptablez*use of reserved bits (unsupported feature)z maximum connection count reached)r   r   r   rj   ri   c                   @   s   e Zd Zddd„ZdS )rm   r   c                 C   s&   t  | |s|n|dt |¡  ¡ d S )Nz : %s)Ú	Exceptionrf   ÚERRMAPÚget)r   r5   Úcoder   r   r   rf   ë   s    zHandshakeError.__init__N)r   )rT   rU   rV   rf   r   r   r   r   rm   ê   s   rm   c                   @   s4   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdd	„ Zd
S )ÚRawSocketClientProtocolFc                 C   s   dS )NTr   ©r   Úser_idr   r   r   Úcheck_serializeró   s    z(RawSocketClientProtocol.check_serializerc                 C   s>   |   ¡ \}}|dkrtd|ƒ‚| j|kr:td || j¡ƒ‚d S )Nr   zServer returned handshake errorz;Server returned different serializer {0} then requested {1})rq   rm   Úserializer_idru   )r   r}   rt   r   r   r   rr   ö   s    

 ÿz)RawSocketClientProtocol.process_handshakec                 C   s
   t ƒ ‚d S r2   rB   r   r   r   r   r   þ   s    z%RawSocketClientProtocol.serializer_idc                 C   sF   t  | |¡ ttt| jd> | jB ddgƒƒ}| |¡ | j 	d¡ d S )Nri   r   z(RawSocket Asyncio: Client handshake sent)
r]   r)   Úbytesrk   rl   rc   r   r=   r    r!   )r   r"   Zhsr   r   r   r)     s     þ
z'RawSocketClientProtocol.connection_madeN)	rT   rU   rV   r   r~   rr   r\   r   r)   r   r   r   r   r{   ï   s   
r{   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚRawSocketServerProtocolTc                 C   s
   t ƒ ‚d S r2   rB   r|   r   r   r   Úsupports_serializer  s    z+RawSocketServerProtocol.supports_serializerc                    sL   ‡ fdd„}ˆ   ¡ \}}ˆ  |¡s<|tdƒ tdj|d�ƒ‚|ˆ j|ƒ d S )Nc                    s0   | d> |d@ B }ˆ j  ttt|ddgƒƒ¡ d S )Nri   r_   r   )r"   r=   r€   rk   rl   )rp   r}   Zb2r   r   r   Úsend_response  s    z@RawSocketServerProtocol.process_handshake.<locals>.send_responser   z!Serializer unsupported : {ser_id})r}   )rq   r‚   ÚERR_SERIALIZER_UNSUPPORTEDrm   ru   rc   )r   rƒ   r}   Z_lexpr   r   r   rr     s    

z)RawSocketServerProtocol.process_handshakeN)rT   rU   rV   r   r‚   rr   r   r   r   r   r�     s   r�   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚWampRawSocketMixinGeneralc              
   C   sš   | j  d¡ zB| jjr4dt| j| jjdƒi}|| j_| j 	¡ | _
| j
 | ¡ W n: tk
rˆ } z| j jd|d� |  ¡  W 5 d }~X Y nX | j  d¡ d S )Nz)WampRawSocketProtocol: Handshake completez
tls-uniquezMWampRawSocketProtocol: ApplicationSession constructor / onOpen raised ({err})rs   zApplicationSession started.)r    r!   r   Z	is_securer   r"   r   Ú
channel_idÚfactoryÚ_factoryÚ_sessionZonOpenrw   ÚwarnÚabortÚinfo)r   r†   rv   r   r   r   rh   !  s     ÿz0WampRawSocketMixinGeneral._on_handshake_completec              
   C   s¾   | j jdt|ƒd� z2| j |¡D ] }| j jd|d� | j |¡ q"W nr tk
r€ } z| j jd|d� |  	¡  W 5 d }~X Y n: t
k
r¸ } z| j jd|d� |  	¡  W 5 d }~X Y nX d S )Nz*WampRawSocketProtocol: RX octets: {octets}©Úoctetsz-WampRawSocketProtocol: RX WAMP message: {msg})r5   zHWampRawSocketProtocol: WAMP Protocol Error ({err}) - aborting connectionrs   zHWampRawSocketProtocol: WAMP Internal Error ({err}) - aborting connection)r    r!   r   Ú_serializerZunserializer‰   Z	onMessager   rŠ   r‹   rw   )r   Úpayloadr5   rv   r   r   r   rO   7  s    z(WampRawSocketMixinGeneral.stringReceivedc              
   C   s�   |   ¡ r†| jjdt| jƒ|d� z| j |¡\}}W n0 tk
rd } ztd 	|¡ƒ‚W 5 d}~X Y qŒX |  
|¡ | jjdt|ƒd� ntƒ ‚dS )zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        z{func}: TX WAMP message: {msg})Úfuncr5   zIWampRawSocketProtocol: unable to serialize WAMP application payload ({0})Nz*WampRawSocketProtocol: TX octets: {octets}r�   )ÚisOpenr    r!   r   Úsendr�   Ú	serializerw   r   ru   rA   r   r   )r   r5   r�   Ú_rv   r   r   r   r“   F  s    ÿ
zWampRawSocketMixinGeneral.sendc                 C   s   t | dƒo| jdk	S )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        r‰   N)r*   r‰   r   r   r   r   r’   X  s    z WampRawSocketMixinGeneral.isOpenN)rT   rU   rV   rh   rO   r“   r’   r   r   r   r   r…     s   r…   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚWampRawSocketMixinAsynciozE
    Base class for asyncio-based WAMP-over-RawSocket protocols.
    c              
   C   sV   z|d k}| j  |¡ W n2 tk
rJ } z| jjd|d� W 5 d }~X Y nX d | _ d S )Nz@WampRawSocketProtocol: ApplicationSession.onClose raised ({err})rs   )r‰   ZonCloserw   r    rŠ   )r   r0   ZwasCleanrv   r   r   r   r.   e  s    "z-WampRawSocketMixinAsyncio._on_connection_lostc                 C   s   |   ¡ r| j ¡  ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)r’   r"   r4   r   r   r   r   r   r4   n  s    zWampRawSocketMixinAsyncio.closec                 C   s6   |   ¡ r,t| jdƒr | j ¡  q2| j ¡  ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        r‹   N)r’   r*   r"   r‹   r4   r   r   r   r   r   r‹   w  s
    zWampRawSocketMixinAsyncio.abortN)rT   rU   rV   Ú__doc__r.   r4   r‹   r   r   r   r   r–   `  s   		r–   c                   @   s   e Zd ZdZdd„ ZdS )r   z…
    asyncio-based WAMP-over-RawSocket server protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s^   || j jkr4t | j j| ¡| _| jjd|d� dS | jjd|| j j ¡ d� |  ¡  dS d S )NzDWampRawSocketProtocol: client wants to use serializer '{serializer}')Ú
serializerTz�WampRawSocketProtocol: opening handshake - no suitable serializer found (client requested {serializer}, and we have {serializers})r˜   ÚserializersF)r‡   Ú_serializersÚcopyr�   r    r!   Úkeysr‹   r|   r   r   r   r‚   �  s    þ
ýz/WampRawSocketServerProtocol.supports_serializerN)rT   rU   rV   r—   r‚   r   r   r   r   r   …  s   r   c                   @   s   e Zd ZdZedd„ ƒZdS )r   z…
    asyncio-based WAMP-over-RawSocket client protocol.

    Implements:

        * :class:`autobahn.wamp.interfaces.ITransport`
    c                 C   s"   t | dƒst | jj¡| _| jjS )Nr�   )r*   r›   r‡   r�   ÚRAWSOCKET_SERIALIZER_IDr   r   r   r   r   «  s    
z)WampRawSocketClientProtocol.serializer_idN)rT   rU   rV   r—   r\   r   r   r   r   r   r   ¡  s   r   c                   @   s$   e Zd ZdZe ¡ Zedd„ ƒZdS )ÚWampRawSocketFactoryzm
    Adapter class for asyncio-based WebSocket client and server factories.def dataReceived(self, data):
    c                 C   s   |   ¡ }| |_|S r2   )Úprotocolr‡   )r   Úprotor   r   r   Ú__call__¹  s    zWampRawSocketFactory.__call__N)	rT   rU   rV   r—   r%   rX   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
    asyncio-based WAMP-over-RawSocket server protocol factory.
    Nc                    sV   t ˆ ƒrˆ | _n‡ fdd„| _|dkrBdd„ tƒ D ƒ}|sBtdƒ‚dd„ |D ƒ| _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`
        c                      s   ˆ S r2   r   r   ©r‡   r   r   Ú<lambda>Ö  r   z5WampRawSocketServerFactory.__init__.<locals>.<lambda>Nc                 S   s   g | ]
}|ƒ ‘qS r   r   )Ú.0r˜   r   r   r   Ú
<listcomp>Û  s     z7WampRawSocketServerFactory.__init__.<locals>.<listcomp>z%could not import any WAMP serializersc                 S   s   i | ]}|j |“qS r   )r�   )r¤   ro   r   r   r   Ú
<dictcomp>à  s      z7WampRawSocketServerFactory.__init__.<locals>.<dictcomp>)Úcallablerˆ   r
   rw   rš   )r   r‡   r™   r   r¢   r   rf   Ç  s    z#WampRawSocketServerFactory.__init__)N)rT   rU   rV   r—   r   rŸ   rf   r   r   r   r   r   À  s   r   c                   @   s   e Zd ZdZeZddd„ZdS )r   z;
    asyncio-based WAMP-over-RawSocket client factory.
    Nc                    sT   t ˆ ƒrˆ | _n‡ fdd„| _|dkr:tƒ }|r:|d ƒ }|dkrJt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`
        c                      s   ˆ S r2   r   r   r¢   r   r   r£   ù  r   z5WampRawSocketClientFactory.__init__.<locals>.<lambda>Nr   z$could not import any WAMP serializer)r§   rˆ   r
   rw   r�   )r   r‡   r˜   r™   r   r¢   r   rf   ê  s    
z#WampRawSocketClientFactory.__init__)N)rT   rU   rV   r—   r   rŸ   rf   r   r   r   r   r   ã  s   r   )+Úasyncior:   ra   r›   Útypingr   r%   Zautobahn.utilr   r   r   Zautobahn.wamp.exceptionr   r   r   Zautobahn.wamp.typesr	   Zautobahn.asyncio.utilr
   r   r   Ú__all__rN   rP   rK   rl   ÚProtocolr   r]   r„   rx   rw   rm   r{   r�   Úobjectr…   r–   r   r   rž   r   r   r   r   r   r   Ú<module>   sJ   s7û	A%"