o
    @Bit                     @   s   d dl mZ 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 )    )absolute_importN)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   r   N)__name__
__module____qualname____doc__EXTENSION_NAMEWINDOW_SIZE_PERMISSIBLE_VALUESMEM_LEVEL_PERMISSIBLE_VALUES r%   r%   c/var/www/html/Trade-python/venv/lib/python3.10/site-packages/autobahn/websocket/compress_deflate.pyr	   0   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rzt|}W n   td||| jf |tjvrtd||| jf |}q
|d
kr|durt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_bitsKillegal extension parameter value '%s' for parameter '%s' of extension '%s'client_no_context_takeoverserver_max_window_bitsserver_no_context_takeover3illegal 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&   parseN   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 ``[8..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boolr0   r5   r4   r7   r#   r6   )selfr5   r4   r7   r6   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=%dr"   r5   r4   r7   r6   r@   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
        )	extensionr5   r4   r7   r6   rF   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
        zPerMessageDeflateOffer(accept_no_context_takeover = %s, accept_max_window_bits = %s, request_no_context_takeover = %s, request_max_window_bits = %s))r5   r4   r7   r6   rM   r%   r%   r&   __repr__      zPerMessageDeflateOffer.__repr__N)TTFr   )
r   r   r    r!   classmethodr;   rA   rI   rN   rR   r%   r%   r%   r&   r
   G   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rtd
|| jf |j
dkr||j
krtd| || _|dur|| jvrt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 ``[8..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 feature8invalid value %s for window_bits - permissible values %szGinvalid value %s for window_bits - client requested lower maximum value6invalid value %s for mem_level - permissible values %s)
isinstancer
   r0   r>   r:   r?   r5   r7   r#   r4   r6   no_context_takeoverwindow_bitsr$   	mem_levelmax_message_size)r@   r:   r7   r6   rY   rZ   r[   r\   r%   r%   r&   rA      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 )rB   rD   r   rE   rC   z; client_max_window_bits=%d)r"   r:   r7   r6   rG   r%   r%   r&   rI   @  s   
z1PerMessageDeflateOfferAccept.get_extension_stringc              	   C   s*   | j | j | j| j| j| j| j| jdS )rK   )rL   r:   r7   r6   rY   rZ   r[   r\   )	r"   r:   rN   r7   r6   rY   rZ   r[   r\   rM   r%   r%   r&   rN   R  s   z%PerMessageDeflateOfferAccept.__json__c                 C   s(   d| j  | j| j| j| j| j| jf S )rQ   zPerMessageDeflateOfferAccept(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))r:   rR   r7   r6   rY   rZ   r[   r\   rM   r%   r%   r&   rR   d  s   (z%PerMessageDeflateOfferAccept.__repr__)Fr   NNNN)r   r   r    r!   rA   rI   rN   rR   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rzt|}W n   td||| jf |tjvrtd||| jf |}q
|d
kr|durt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-   r.   )	r2   r3   r(   r*   r+   r,   r8   r9   responser%   r%   r&   r;   t  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&   rA     s   
z"PerMessageDeflateResponse.__init__c                 C   rJ   )rK   )rL   r(   r*   r+   r,   )r"   r(   r*   r+   r,   rM   r%   r%   r&   rN     rO   z"PerMessageDeflateResponse.__json__c                 C   rP   )rQ   zPerMessageDeflateResponse(client_max_window_bits = %s, client_no_context_takeover = %s, server_max_window_bits = %s, server_no_context_takeover = %s)r^   rM   r%   r%   r&   rR     rS   z"PerMessageDeflateResponse.__repr__N)	r   r   r    r!   rT   r;   rA   rN   rR   r%   r%   r%   r&   r   n  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 responseNrU   zCinvalid value %s for no_context_takeover - server requested featurerV   r   zGinvalid value %s for window_bits - server requested lower maximum valuerW   )rX   r   r0   r>   r]   r?   r*   rY   r#   r(   rZ   r$   r[   r\   )r@   r]   rY   rZ   r[   r\   r%   r%   r&   rA     s(   




z(PerMessageDeflateResponseAccept.__init__c                 C   s   | j | j | j| j| jdS )rK   )rL   r]   rY   rZ   r[   )r"   r]   rN   rY   rZ   r[   rM   r%   r%   r&   rN     s   z(PerMessageDeflateResponseAccept.__json__c                 C   s   d| j  | j| j| jf S )rQ   zjPerMessageDeflateResponseAccept(response = %s, no_context_takeover = %s, window_bits = %s, mem_level = %s))r]   rR   rY   rZ   r[   rM   r%   r%   r&   rR   '  s   z(PerMessageDeflateResponseAccept.__repr__)NNNN)r   r   r    r!   rA   rN   rR   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,   rY   r*   r+   rZ   r(   r[   r\   r2   	is_serveracceptpmcer%   r%   r&   create_from_response_accept9  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_   )rY   r:   r7   rZ   r6   r[   r\   r`   r%   r%   r&   create_from_offer_acceptG  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_LEVELr[   r\   _compressor_decompressor)r@   ra   r,   r*   r+   r(   r[   r\   r%   r%   r&   rA   S  s   
zPerMessageDeflate.__init__c                 C   s"   | j | j| j| j| j| j| jdS )N)rL   ra   r,   r*   r+   r(   r[   )r"   rf   r,   r*   r+   r(   r[   rM   r%   r%   r&   rN   i  s   zPerMessageDeflate.__json__c                 C   s    d| j | j| j| j| j| jf S )NzPerMessageDeflate(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))rf   r,   r*   r+   r(   r[   rM   r%   r%   r&   rR   r  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_   )rf   ri   r,   zlibcompressobjZ_DEFAULT_COMPRESSIONDEFLATEDr+   r[   r*   r(   rM   r%   r%   r&   start_compress_messageu  s     z(PerMessageDeflate.start_compress_messagec                 C   s   | j |S r_   )ri   compressr@   datar%   r%   r&   compress_message_data  s   z'PerMessageDeflate.compress_message_datac                 C   s   | j tj}|d d S )N)ri   flushrk   Z_SYNC_FLUSHrq   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_   )rf   rj   r*   rk   decompressobjr(   r,   r+   rM   r%   r%   r&   start_decompress_message  s   z*PerMessageDeflate.start_decompress_messagec                 C   s&   | j d ur| j|| j S | j|S r_   )r\   rj   
decompressrq   r%   r%   r&   decompress_message_data  s   
z)PerMessageDeflate.decompress_message_datac                 C   s   | j d d S )Ns     )rj   rz   rM   r%   r%   r&   end_decompress_message  s   z(PerMessageDeflate.end_decompress_messager_   )r   r   r    r!   rk   	MAX_WBITSrg   rh   rT   rd   re   rA   rN   rR   ro   rs   rw   ry   r{   r|   r%   r%   r%   r&   r   2  s$    


	r   )
__future__r   rk   autobahn.utilr    autobahn.websocket.compress_baser   r   r   r   r   __all__objectr	   r
   r   r   r   r   r%   r%   r%   r&   <module>   s    
 *|uM