U
    •uÄc²t  ã                   @   s²   d dl Z d dlmZ d dlmZmZmZmZmZ dZ	G dd„ de
ƒZeG dd„ deeƒƒZeG d	d
„ d
eeƒƒZeG dd„ deeƒƒZeG dd„ deeƒƒZG dd„ deeƒZdS )é    N)Úpublic)ÚPerMessageCompressOfferÚPerMessageCompressOfferAcceptÚPerMessageCompressResponseÚ PerMessageCompressResponseAcceptÚPerMessageCompress)ÚPerMessageDeflateMixinÚPerMessageDeflateOfferÚPerMessageDeflateOfferAcceptÚPerMessageDeflateResponseÚPerMessageDeflateResponseAcceptÚPerMessageDeflatec                	   @   s<   e Zd ZdZdZddddddd	gZd
ddddddddg	ZdS )r   z)
    Mixin class for this extension.
    zpermessage-deflateé	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚEXTENSION_NAMEÚWINDOW_SIZE_PERMISSIBLE_VALUESÚMEM_LEVEL_PERMISSIBLE_VALUES© r$   r$   úb/var/www/html/pearl/school/venv/lib/python3.8/site-packages/autobahn/websocket/compress_deflate.pyr   .   s
   r   c                   @   s>   e Zd ZdZedd„ ƒZddd„Zd	d
„ Zdd„ Zdd„ Z	dS )r	   zw
    Set of extension parameters for `permessage-deflate` WebSocket extension
    offered by a client to a server.
    c           	   	   C   s”  d}d}d}d}|D �]j}t || ƒdkr<td|| jf ƒ‚|| d }|dkr²|dk	r¬zt|ƒ}W n    td||| jf ƒ‚Y q°X |tjkr¦td||| jf ƒ‚q°d}nd}q|dkrÞ|dk	rØtd||| jf ƒ‚nd}q|d	k�r>zt|ƒ}W n    td||| jf ƒ‚Y n(X |tjk�r8td||| jf ƒ‚n|}q|d
k�rn|dk	�rhtd||| jf ƒ‚nd}qtd|| jf ƒ‚q| ||||ƒ}|S )a_  
        Parses a WebSocket extension offer for `permessage-deflate` provided by a client to a server.

        :param params: Output from :func:`autobahn.websocket.WebSocketProtocol._parseExtensionsHeader`.
        :type params: list

        :returns: A new instance of :class:`autobahn.compress.PerMessageDeflateOffer`.
        :rtype: obj
        FTr   r   úBmultiple occurrence of extension parameter '%s' for extension '%s'Úclient_max_window_bitsúKillegal extension parameter value '%s' for parameter '%s' of extension '%s'Úclient_no_context_takeoverÚserver_max_window_bitsÚserver_no_context_takeoverú3illegal extension parameter '%s' for extension '%s'©ÚlenÚ	Exceptionr!   Úintr   r"   )	ÚclsÚparamsÚaccept_max_window_bitsÚaccept_no_context_takeoverÚrequest_max_window_bitsÚrequest_no_context_takeoverÚpÚvalÚofferr$   r$   r%   ÚparseL   sR    
	



ýzPerMessageDeflateOffer.parseTFr   c                 C   s”   t |ƒtkrtdt |ƒ ƒ‚|| _t |ƒtkr>tdt |ƒ ƒ‚|| _t |ƒtkr`tdt |ƒ ƒ‚|| _|dkrŠ|| jkrŠtd|| jf ƒ‚|| _dS )a¬  

        :param accept_no_context_takeover: When ``True``, the client accepts the "no context takeover" feature.
        :type accept_no_context_takeover: bool
        :param accept_max_window_bits: When ``True``, the client accepts setting "max window size".
        :type accept_max_window_bits: bool
        :param request_no_context_takeover: When ``True``, the client request the "no context takeover" feature.
        :type request_no_context_takeover: bool
        :param request_max_window_bits: When non-zero, the client requests the given "max window size" (must be
            and integer from the interval ``[9..15]``).
        :type request_max_window_bits: int
        z.invalid type %s for accept_no_context_takeoverz*invalid type %s for accept_max_window_bitsú/invalid type %s for request_no_context_takeoverr   úDinvalid value %s for request_max_window_bits - permissible values %sN)ÚtypeÚboolr/   r4   r3   r6   r"   r5   )Úselfr4   r3   r6   r5   r$   r$   r%   Ú__init__¡   s    zPerMessageDeflateOffer.__init__c                 C   sL   | j }| jr|d7 }| jr"|d7 }| jr0|d7 }| jdkrH|d| j 7 }|S )úŸ
        Returns the WebSocket extension configuration string as sent to the server.

        :returns: PMCE configuration string.
        :rtype: str
        ú; client_no_context_takeoverz; client_max_window_bitsú; server_no_context_takeoverr   ú; server_max_window_bits=%d©r!   r4   r3   r6   r5   ©r?   Zpmce_stringr$   r$   r%   Úget_extension_stringÆ   s    
z+PerMessageDeflateOffer.get_extension_stringc                 C   s   | j | j| j| j| jdœS )úŽ
        Returns a JSON serializable object representation.

        :returns: JSON serializable representation.
        :rtype: dict
        )Ú	extensionr4   r3   r6   r5   rE   ©r?   r$   r$   r%   Ú__json__Ø   s    üzPerMessageDeflateOffer.__json__c                 C   s   d| j | j| j| jf S )úª
        Returns Python object representation that can be eval'ed to reconstruct the object.

        :returns: Python string representation.
        :rtype: str
        z”PerMessageDeflateOffer(accept_no_context_takeover = %s, accept_max_window_bits = %s, request_no_context_takeover = %s, request_max_window_bits = %s))r4   r3   r6   r5   rJ   r$   r$   r%   Ú__repr__å   s    zPerMessageDeflateOffer.__repr__N)TTFr   )
r   r   r   r    Úclassmethodr:   r@   rG   rK   rM   r$   r$   r$   r%   r	   E   s   
U    ü
%r	   c                   @   s2   e Zd ZdZddd„Zdd„ Zd	d
„ Zdd„ ZdS )r
   zm
    Set of parameters with which to accept an `permessage-deflate` offer
    from a client by a server.
    Fr   Nc                 C   sf  t |tƒstdt|ƒ ƒ‚|| _t|ƒtkr<tdt|ƒ ƒ‚|rR|jsRtd| ƒ‚|| _|dkr||| jkr|td|| jf ƒ‚|dkr–|j	s–td| ƒ‚|| _
|dk	rÖt|ƒtkrÀtdt|ƒ ƒ‚|jrÖ|sÖtd	| ƒ‚|| _|dk	�r(|| jk�rtd
|| jf ƒ‚|j
dk�r(||j
k�r(td| ƒ‚|| _|dk	�rV|| jk�rVtd|| jf ƒ‚|| _|| _dS )aé  

        :param offer: The offer being accepted.
        :type offer: Instance of :class:`autobahn.compress.PerMessageDeflateOffer`.
        :param request_no_context_takeover: When ``True``, the server requests the "no context takeover" feature.
        :type request_no_context_takeover: bool
        :param request_max_window_bits: When non-zero, the server requests the given "max window size" (must be
            and integer from the interval ``[9..15]``).
        :param request_max_window_bits: int
        :param no_context_takeover: Override server ("server-to-client direction") context takeover (this must
                be compatible with the offer).
        :type no_context_takeover: bool
        :param window_bits: Override server ("server-to-client direction") window size (this must be
                compatible with the offer).
        :type window_bits: int
        :param mem_level: Set server ("server-to-client direction") memory level.
        :type mem_level: int
        zinvalid type %s for offerr;   zPinvalid value %s for request_no_context_takeover - feature unsupported by clientr   r<   zLinvalid value %s for request_max_window_bits - feature unsupported by clientNú'invalid type %s for no_context_takeoverzCinvalid value %s for no_context_takeover - client requested featureú8invalid value %s for window_bits - permissible values %szGinvalid value %s for window_bits - client requested lower maximum valueú6invalid value %s for mem_level - permissible values %s)Ú
isinstancer	   r/   r=   r9   r>   r4   r6   r"   r3   r5   Úno_context_takeoverÚwindow_bitsr#   Ú	mem_levelÚmax_message_size)r?   r9   r6   r5   rS   rT   rU   rV   r$   r$   r%   r@   ö   s<    




z%PerMessageDeflateOfferAccept.__init__c                 C   s\   | j }| jjr|d7 }| jjdkr2|d| jj 7 }| jr@|d7 }| jdkrX|d| j 7 }|S )rA   rC   r   rD   rB   z; client_max_window_bits=%d)r!   r9   r6   r5   rF   r$   r$   r%   rG   >  s    
z1PerMessageDeflateOfferAccept.get_extension_stringc              	   C   s*   | j | j ¡ | j| j| j| j| j| jdœS )rH   )rI   r9   r6   r5   rS   rT   rU   rV   )	r!   r9   rK   r6   r5   rS   rT   rU   rV   rJ   r$   r$   r%   rK   P  s    øz%PerMessageDeflateOfferAccept.__json__c                 C   s(   d| j  ¡ | j| j| j| j| j| jf S )rL   z»PerMessageDeflateOfferAccept(offer = %s, request_no_context_takeover = %s, request_max_window_bits = %s, no_context_takeover = %s, window_bits = %s, mem_level = %s, max_message_size = %s))r9   rM   r6   r5   rS   rT   rU   rV   rJ   r$   r$   r%   rM   b  s    z%PerMessageDeflateOfferAccept.__repr__)Fr   NNNN)r   r   r   r    r@   rG   rK   rM   r$   r$   r$   r%   r
   ï   s         ù
Hr
   c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )r   zI
    Set of parameters for `permessage-deflate` responded by server.
    c           	   	   C   s†  d}d}d}d}|D �]\}t || ƒdkr<td|| jf ƒ‚|| d }|dkr¤zt|ƒ}W n    td||| jf ƒ‚Y n&X |tjkržtd||| jf ƒ‚n|}q|dkrÐ|dk	rÊtd||| jf ƒ‚nd}q|d	k�r0zt|ƒ}W n    td||| jf ƒ‚Y n(X |tjk�r*td||| jf ƒ‚n|}q|d
k�r`|dk	�rZtd||| jf ƒ‚nd}qtd|| jf ƒ‚q| ||||ƒ}|S )ae  
        Parses a WebSocket extension response for `permessage-deflate` provided by a server to a client.

        :param params: Output from :func:`autobahn.websocket.WebSocketProtocol._parseExtensionsHeader`.
        :type params: list

        :returns: A new instance of :class:`autobahn.compress.PerMessageDeflateResponse`.
        :rtype: obj
        r   Fr   r&   r'   r(   r)   Tr*   r+   r,   r-   )	r1   r2   r'   r)   r*   r+   r7   r8   Úresponser$   r$   r%   r:   r  sN    




ýzPerMessageDeflateResponse.parsec                 C   s   || _ || _|| _|| _dS )ax  

        :param client_max_window_bits: FIXME
        :type client_max_window_bits: int
        :param client_no_context_takeover: FIXME
        :type client_no_context_takeover: bool
        :param server_max_window_bits: FIXME
        :type server_max_window_bits: int
        :param server_no_context_takeover: FIXME
        :type server_no_context_takeover: bool
        N©r'   r)   r*   r+   )r?   r'   r)   r*   r+   r$   r$   r%   r@   ¶  s    z"PerMessageDeflateResponse.__init__c                 C   s   | j | j| j| j| jdœS )rH   )rI   r'   r)   r*   r+   )r!   r'   r)   r*   r+   rJ   r$   r$   r%   rK   Ë  s    üz"PerMessageDeflateResponse.__json__c                 C   s   d| j | j| j| jf S )rL   z•PerMessageDeflateResponse(client_max_window_bits = %s, client_no_context_takeover = %s, server_max_window_bits = %s, server_no_context_takeover = %s)rX   rJ   r$   r$   r%   rM   Ø  s    z"PerMessageDeflateResponse.__repr__N)	r   r   r   r    rN   r:   r@   rK   rM   r$   r$   r$   r%   r   l  s   
Cr   c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
r   zp
    Set of parameters with which to accept an `permessage-deflate` response
    from a server by a client.
    Nc                 C   sÞ   t |tƒstdt|ƒ ƒ‚|| _|dk	rZt|ƒtkrDtdt|ƒ ƒ‚|jrZ|sZtd| ƒ‚|| _|dk	r¤|| jkr„td|| jf ƒ‚|j	dkr¤||j	kr¤td| ƒ‚|| _
|dk	rÎ|| jkrÎtd|| jf ƒ‚|| _|| _dS )	a]  

        :param response: The response being accepted.
        :type response: Instance of :class:`autobahn.compress.PerMessageDeflateResponse`.
        :param no_context_takeover: Override client ("client-to-server direction") context takeover (this must be compatible with response).
        :type no_context_takeover: bool
        :param window_bits: Override client ("client-to-server direction") window size (this must be compatible with response).
        :type window_bits: int
        :param mem_level: Set client ("client-to-server direction") memory level.
        :type mem_level: int
        zinvalid type %s for responseNrO   zCinvalid value %s for no_context_takeover - server requested featurerP   r   zGinvalid value %s for window_bits - server requested lower maximum valuerQ   )rR   r   r/   r=   rW   r>   r)   rS   r"   r'   rT   r#   rU   rV   )r?   rW   rS   rT   rU   rV   r$   r$   r%   r@   é  s(    



z(PerMessageDeflateResponseAccept.__init__c                 C   s   | j | j ¡ | j| j| jdœS )rH   )rI   rW   rS   rT   rU   )r!   rW   rK   rS   rT   rU   rJ   r$   r$   r%   rK     s    üz(PerMessageDeflateResponseAccept.__json__c                 C   s   d| j  ¡ | j| j| jf S )rL   zjPerMessageDeflateResponseAccept(response = %s, no_context_takeover = %s, window_bits = %s, mem_level = %s))rW   rM   rS   rT   rU   rJ   r$   r$   r%   rM   %  s    z(PerMessageDeflateResponseAccept.__repr__)NNNN)r   r   r   r    r@   rK   rM   r$   r$   r$   r%   r   â  s       û
/r   c                   @   s|   e Zd ZdZejZdZedd„ ƒZ	edd„ ƒZ
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S )r   z=
    `permessage-deflate` WebSocket extension processor.
    r   c                 C   sL   | ||j j|jd k	r|jn|j j|j j|jd k	r6|jn|j j|j|jƒ}|S ©N)	rW   r+   rS   r)   r*   rT   r'   rU   rV   ©r1   Ú	is_serverÚacceptZpmcer$   r$   r%   Úcreate_from_response_accept7  s    ù	z-PerMessageDeflate.create_from_response_acceptc                 C   sH   | ||j d k	r|j n|jj|j|jd k	r.|jn|jj|j|j|jƒ}|S rY   )rS   r9   r6   rT   r5   rU   rV   rZ   r$   r$   r%   Úcreate_from_offer_acceptE  s    úz*PerMessageDeflate.create_from_offer_acceptNc                 C   s`   || _ || _|| _|dkr|n| j| _|dkr2|n| j| _|rB|n| j| _|| _d | _	d | _
d S )Nr   )Ú
_is_serverr+   r)   ÚDEFAULT_WINDOW_BITSr*   r'   ÚDEFAULT_MEM_LEVELrU   rV   Ú_compressorÚ_decompressor)r?   r[   r+   r)   r*   r'   rU   rV   r$   r$   r%   r@   Q  s    zPerMessageDeflate.__init__c                 C   s"   | j | j| j| j| j| j| jdœS )N)rI   r[   r+   r)   r*   r'   rU   )r!   r_   r+   r)   r*   r'   rU   rJ   r$   r$   r%   rK   g  s    úzPerMessageDeflate.__json__c                 C   s    d| j | j| j| j| j| jf S )Nz­PerMessageDeflate(is_server = %s, server_no_context_takeover = %s, client_no_context_takeover = %s, server_max_window_bits = %s, client_max_window_bits = %s, mem_level = %s))r_   r+   r)   r*   r'   rU   rJ   r$   r$   r%   rM   p  s    zPerMessageDeflate.__repr__c                 C   sd   | j r4| jd ks| jr`t tjtj| j | j¡| _n,| jd ksD| j	r`t tjtj| j
 | j¡| _d S rY   )r_   rb   r+   ÚzlibÚcompressobjÚZ_DEFAULT_COMPRESSIONÚDEFLATEDr*   rU   r)   r'   rJ   r$   r$   r%   Ústart_compress_messages  s
    z(PerMessageDeflate.start_compress_messagec                 C   s   | j  |¡S rY   )rb   Úcompress©r?   Údatar$   r$   r%   Úcompress_message_data~  s    z'PerMessageDeflate.compress_message_datac                 C   s   | j  tj¡}|d d… S )Néüÿÿÿ)rb   Úflushrd   ÚZ_SYNC_FLUSHrj   r$   r$   r%   Úend_compress_message�  s    z&PerMessageDeflate.end_compress_messagec                 C   sL   | j r(| jd ks| jrHt | j ¡| _n | jd ks8| jrHt | j ¡| _d S rY   )r_   rc   r)   rd   Údecompressobjr'   r+   r*   rJ   r$   r$   r%   Ústart_decompress_message…  s
    z*PerMessageDeflate.start_decompress_messagec                 C   s&   | j d k	r| j || j ¡S | j |¡S rY   )rV   rc   Ú
decompressrj   r$   r$   r%   Údecompress_message_data�  s    
z)PerMessageDeflate.decompress_message_datac                 C   s   | j  d¡ d S )Ns     ÿÿ)rc   rs   rJ   r$   r$   r%   Úend_decompress_message’  s    z(PerMessageDeflate.end_decompress_message)N)r   r   r   r    rd   Ú	MAX_WBITSr`   ra   rN   r]   r^   r@   rK   rM   rh   rl   rp   rr   rt   ru   r$   r$   r$   r%   r   0  s"   

 ù
	r   )rd   Zautobahn.utilr   Z autobahn.websocket.compress_baser   r   r   r   r   Ú__all__Úobjectr   r	   r
   r   r   r   r$   r$   r$   r%   Ú<module>   s   
 *|uM