o
    èó·i²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	 g d¢Z	 g d¢ZdS )r   z)
    Mixin class for this extension.
    zpermessage-deflate)é	   é
   é   é   é   é   é   )	é   é   é   é   é   é   é   é   r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚEXTENSION_NAMEÚWINDOW_SIZE_PERMISSIBLE_VALUESÚMEM_LEVEL_PERMISSIBLE_VALUES© r$   r$   úiC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\autobahn/websocket/compress_deflate.pyr   .   s    r   c                   @   sF   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   st  d}d}d}d}|D ]¦}t || ƒdkrtd|| jf ƒ‚|| d }|dkrT|durQzt|ƒ}W n   td||| jf ƒ‚|tjvrNtd||| jf ƒ‚d}q
d}q
|dkri|durftd||| jf ƒ‚d}q
|d	kr“zt|ƒ}W n   td||| jf ƒ‚|tjvr�td||| jf ƒ‚|}q
|d
kr¨|dur¥td||| jf ƒ‚d}q
td|| jf ƒ‚| ||||ƒ}|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'N©Ú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r0tdt |ƒ ƒ‚|| _|dkrE|| jvrEt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r|d7 }| jdkr$|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=%dN©r!   r4   r3   r6   r5   ©r?   Zpmce_stringr$   r$   r%   Úget_extension_stringÆ   s   
z+PerMessageDeflateOffer.get_extension_stringc                 C   ó   | j | j| j| j| jdœS )úŽ
        Returns a JSON serializable object representation.

        :returns: JSON serializable representation.
        :rtype: dict
        )Ú	extensionr4   r3   r6   r5   NrE   ©r?   r$   r$   r%   Ú__json__Ø   ó   üzPerMessageDeflateOffer.__json__c                 C   ó   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)N)r4   r3   r6   r5   rK   r$   r$   r%   Ú__repr__å   ó   zPerMessageDeflateOffer.__repr__N)TTFr   )
r   r   r   r    Úclassmethodr:   r@   rG   rL   rP   r$   r$   r$   r%   r	   E   s    
U
ü%r	   c                   @   s>   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   sZ  t |tƒstdt|ƒ ƒ‚|| _t|ƒtkrtdt|ƒ ƒ‚|r)|js)td| ƒ‚|| _|dkr>|| jvr>td|| jf ƒ‚|dkrK|j	sKtd| ƒ‚|| _
|durkt|ƒtkr`tdt|ƒ ƒ‚|jrk|sktd	| ƒ‚|| _|dur�|| jvr€td
|| jf ƒ‚|j
dkr�||j
kr�td| ƒ‚|| _|dur¥|| jvr¥t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   rW   rX   rY   rZ   r$   r$   r%   r@   ö   s<   





z%PerMessageDeflateOfferAccept.__init__c                 C   s\   | j }| jjr|d7 }| jjdkr|d| jj 7 }| jr |d7 }| jdkr,|d| j 7 }|S )rA   rC   r   rD   rB   z; client_max_window_bits=%dN)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 )rI   )rJ   r9   r6   r5   rW   rX   rY   rZ   N)	r!   r9   rL   r6   r5   rW   rX   rY   rZ   rK   r$   r$   r%   rL   P  s   øz%PerMessageDeflateOfferAccept.__json__c                 C   s(   d| j  ¡ | j| j| j| j| j| jf S )rO   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)N)r9   rP   r6   r5   rW   rX   rY   rZ   rK   r$   r$   r%   rP   b  s   (z%PerMessageDeflateOfferAccept.__repr__)Fr   NNNN)r   r   r   r    r@   rG   rL   rP   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   sf  d}d}d}d}|D ]Ÿ}t || ƒdkrtd|| jf ƒ‚|| d }|dkrMzt|ƒ}W n   td||| jf ƒ‚|tjvrJtd||| jf ƒ‚|}q
|dkrb|dur_td||| jf ƒ‚d}q
|d	krŒzt|ƒ}W n   td||| jf ƒ‚|tjvr‰td||| jf ƒ‚|}q
|d
kr¡|duržtd||| jf ƒ‚d}q
td|| jf ƒ‚| ||||ƒ}|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,   Nr-   )	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   rH   )rI   )rJ   r'   r)   r*   r+   N)r!   r'   r)   r*   r+   rK   r$   r$   r%   rL   Ë  rM   z"PerMessageDeflateResponse.__json__c                 C   rN   )rO   z•PerMessageDeflateResponse(client_max_window_bits = %s, client_no_context_takeover = %s, server_max_window_bits = %s, server_no_context_takeover = %s)Nr\   rK   r$   r$   r%   rP   Ø  rQ   z"PerMessageDeflateResponse.__repr__N)	r   r   r   r    rR   r:   r@   rL   rP   r$   r$   r$   r%   r   l  s    
Cr   c                   @   s2   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ur-t|ƒtkr"tdt|ƒ ƒ‚|jr-|s-td| ƒ‚|| _|durR|| jvrBtd|| jf ƒ‚|j	dkrR||j	krRtd| ƒ‚|| _
|durg|| jvrgt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 responseNrS   zCinvalid value %s for no_context_takeover - server requested featurerT   r   zGinvalid value %s for window_bits - server requested lower maximum valuerU   )rV   r   r/   r=   r[   r>   r)   rW   r"   r'   rX   r#   rY   rZ   )r?   r[   rW   rX   rY   rZ   r$   r$   r%   r@   é  s(   




z(PerMessageDeflateResponseAccept.__init__c                 C   s   | j | j ¡ | j| j| jdœS )rI   )rJ   r[   rW   rX   rY   N)r!   r[   rL   rW   rX   rY   rK   r$   r$   r%   rL     s   üz(PerMessageDeflateResponseAccept.__json__c                 C   s   d| j  ¡ | j| j| jf S )rO   zjPerMessageDeflateResponseAccept(response = %s, no_context_takeover = %s, window_bits = %s, mem_level = %s)N)r[   rP   rW   rX   rY   rK   r$   r$   r%   rP   %  s   z(PerMessageDeflateResponseAccept.__repr__)NNNN)r   r   r   r    r@   rL   rP   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 ur|jn|j j|j j|jd ur|jn|j j|j|jƒ}|S ©N)	r[   r+   rW   r)   r*   rX   r'   rY   rZ   ©r1   Ú	is_serverÚacceptZpmcer$   r$   r%   Úcreate_from_response_accept7  s   ù	z-PerMessageDeflate.create_from_response_acceptc                 C   sH   | ||j d ur
|j n|jj|j|jd ur|jn|jj|j|j|jƒ}|S r]   )rW   r9   r6   rX   r5   rY   rZ   r^   r$   r$   r%   Úcreate_from_offer_acceptE  s   úz*PerMessageDeflate.create_from_offer_acceptNc                 C   s`   || _ || _|| _|dkr|n| j| _|dkr|n| j| _|r!|n| j| _|| _d | _	d | _
d S )Nr   )Ú
_is_serverr+   r)   ÚDEFAULT_WINDOW_BITSr*   r'   ÚDEFAULT_MEM_LEVELrY   rZ   Ú_compressorÚ_decompressor)r?   r_   r+   r)   r*   r'   rY   rZ   r$   r$   r%   r@   Q  s   
zPerMessageDeflate.__init__c                 C   s"   | j | j| j| j| j| j| jdœS )N)rJ   r_   r+   r)   r*   r'   rY   )r!   rc   r+   r)   r*   r'   rY   rK   r$   r$   r%   rL   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))rc   r+   r)   r*   r'   rY   rK   r$   r$   r%   rP   p  s    zPerMessageDeflate.__repr__c                 C   sn   | j r| jd u s| jrt tjtj| j | j¡| _d S d S | jd u s%| j	r5t tjtj| j
 | j¡| _d S d S r]   )rc   rf   r+   ÚzlibÚcompressobjÚZ_DEFAULT_COMPRESSIONÚDEFLATEDr*   rY   r)   r'   rK   r$   r$   r%   Ústart_compress_messages  s    ÿ ÿz(PerMessageDeflate.start_compress_messagec                 C   s   | j  |¡S r]   )rf   Úcompress©r?   Údatar$   r$   r%   Úcompress_message_data~  s   z'PerMessageDeflate.compress_message_datac                 C   s   | j  tj¡}|d d… S )Néüÿÿÿ)rf   Úflushrh   ÚZ_SYNC_FLUSHrn   r$   r$   r%   Úend_compress_message�  s   z&PerMessageDeflate.end_compress_messagec                 C   sV   | j r| jd u s| jrt | j ¡| _d S d S | jd u s| jr)t | j ¡| _d S d S r]   )rc   rg   r)   rh   Údecompressobjr'   r+   r*   rK   r$   r$   r%   Ústart_decompress_message…  s   ÿÿz*PerMessageDeflate.start_decompress_messagec                 C   s&   | j d ur| j || j ¡S | j |¡S r]   )rZ   rg   Ú
decompressrn   r$   r$   r%   Údecompress_message_data�  s   
z)PerMessageDeflate.decompress_message_datac                 C   s   | j  d¡ d S )Ns     ÿÿ)rg   rw   rK   r$   r$   r%   Úend_decompress_message’  s   z(PerMessageDeflate.end_decompress_messager]   )r   r   r   r    rh   Ú	MAX_WBITSrd   re   rR   ra   rb   r@   rL   rP   rl   rp   rt   rv   rx   ry   r$   r$   r$   r%   r   0  s$    


ù	r   )rh   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