o
    _id                     @  s   d dl mZ d dlZd dl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mZmZ ddlmZmZmZ d	d
lmZmZmZ g dZdZdd eddD ZG dd deZd1ddZd2d"d#ZG d$d% d%eZd3d)d*Z G d+d, d,eZ!d4d/d0Z"dS )5    )annotationsN)Sequence)AnyLiteral   )frames)DuplicateParameterInvalidParameterNameInvalidParameterValueNegotiationErrorPayloadTooBigProtocolError)	BytesLikeExtensionNameExtensionParameter   )ClientExtensionFactory	ExtensionServerExtensionFactory)PerMessageDeflateClientPerMessageDeflateFactory enable_client_permessage_deflateServerPerMessageDeflateFactory enable_server_permessage_deflates     c                 C  s   g | ]}t |qS  )str).0bitsr   r   j/sda-disk/www/egybert/egybert_env/lib/python3.10/site-packages/websockets/extensions/permessage_deflate.py
<listcomp>   s    r         c                   @  sJ   e Zd ZdZedZ	ddddZdddZdddddZd ddZ	dS )!r   z)
    Per-Message Deflate extension.

    permessage-deflateNremote_no_context_takeoverboollocal_no_context_takeoverremote_max_window_bitsintlocal_max_window_bitscompress_settingsdict[Any, Any] | NonereturnNonec                 C  s   |du ri }|dv sJ |dv sJ d|  krdks J  J d|  kr+dks.J  J d|vs4J || _ || _|| _|| _|| _| j sOtj| j d| _| js`tjdd| j i| j| _	d| _
dS )	z?
        Configure the Per-Message Deflate extension.

        N)FTr       wbitsr.   Fr   )r#   r%   r&   r(   r)   zlibdecompressobjdecodercompressobjencoderdecode_cont_data)selfr#   r%   r&   r(   r)   r   r   r   __init__)   s*   
zPerMessageDeflate.__init__r   c              	   C  s&   d| j  d| j d| j d| j d	S )Nz-PerMessageDeflate(remote_no_context_takeover=z, local_no_context_takeover=z, remote_max_window_bits=z, local_max_window_bits=))r#   r%   r&   r(   r6   r   r   r   __repr__S   s   zPerMessageDeflate.__repr__)max_sizeframeframes.Framer;   
int | Nonec             
   C  s>  |j tjv r|S |j tju r| js|S |jrd| _n|js|S |js%d| _| jr1tj	| j
 d| _|jrCt|jdk rCt|jt }n|j}|du rLdn|}z(| j||}| jjre|dus`J td||jrut|jdkru| jt W n tjy } ztd|d}~ww |jr| jr| `t|j ||jd|j|jS )z,
        Decode an incoming frame.

        FTr/   i  Nr   zdecompression failed)opcoder   CTRL_OPCODESOP_CONTr5   finrsv1r#   r0   r1   r&   r2   lendatabytes_EMPTY_UNCOMPRESSED_BLOCK
decompressunconsumed_tailr   errorr   Framersv2rsv3)r6   r<   r;   rE   
max_lengthexcr   r   r   decode\   sP   

zPerMessageDeflate.decodec                 C  s   |j tjv r|S |j tjur| jrtjdd| j i| j| _	| j	
|j| j	tj }|jrO|dd tks:J t|dk rG|dd }nt|dd }|jrW| jrW| `	t|j ||j|j tju|j|jS )z,
        Encode an outgoing frame.

        r.   Ni   r   )r?   r   r@   rA   r%   r0   r3   r(   r)   r4   compressrE   flushZ_SYNC_FLUSHrB   rG   rD   
memoryviewrK   rL   rM   )r6   r<   rE   r   r   r   encode   s2   
zPerMessageDeflate.encodeN)r#   r$   r%   r$   r&   r'   r(   r'   r)   r*   r+   r,   )r+   r   )r<   r=   r;   r>   r+   r=   )r<   r=   r+   r=   )
__name__
__module____qualname____doc__r   namer7   r:   rP   rV   r   r   r   r   r   !   s    
*Ir   server_no_context_takeoverr$   client_no_context_takeoverserver_max_window_bitsr>   client_max_window_bitsint | Literal[True] | Noner+   list[ExtensionParameter]c                 C  sf   g }| r	| d |r| d |r| dt|f |du r&| d |S |r1| dt|f |S )zS
    Build a list of ``(name, value)`` pairs for some compression parameters.

    )r]   N)r^   Nr_   T)r`   Nr`   )appendr   )r]   r^   r_   r`   paramsr   r   r   _build_parameters   s   



re   rd   Sequence[ExtensionParameter]	is_server9tuple[bool, bool, int | None, int | Literal[True] | None]c                C  s  d}d}d}d}| D ]p\}}|dkr$|rt ||du rd}q
t|||dkr:|r.t ||du r5d}q
t|||dkrT|durFt ||tv rOt|}q
t|||dkrw|dur`t ||ri|du rid}q
|tv rrt|}q
t||t|||||fS )z
    Extract compression parameters from a list of ``(name, value)`` pairs.

    If ``is_server`` is :obj:`True`, ``client_max_window_bits`` may be
    provided without a value. This is only allowed in handshake requests.

    FNr]   Tr^   r_   r`   )r   r
   _MAX_WINDOW_BITS_VALUESr'   r	   )rd   rg   r]   r^   r_   r`   r\   valuer   r   r   _extract_parameters   sJ   






rk   c                   @  sB   e Zd ZdZedZ					ddddZdddZdddZdS ) r   a  
    Client-side extension factory for the Per-Message Deflate extension.

    Parameters behave as described in `section 7.1 of RFC 7692`_.

    .. _section 7.1 of RFC 7692: https://datatracker.ietf.org/doc/html/rfc7692#section-7.1

    Set them to :obj:`True` to include them in the negotiation offer without a
    value or to an integer value to include them with this value.

    Args:
        server_no_context_takeover: Prevent server from using context takeover.
        client_no_context_takeover: Prevent client from using context takeover.
        server_max_window_bits: Maximum size of the server's LZ77 sliding window
            in bits, between 8 and 15.
        client_max_window_bits: Maximum size of the client's LZ77 sliding window
            in bits, between 8 and 15, or :obj:`True` to indicate support without
            setting a limit.
        compress_settings: Additional keyword arguments for :func:`zlib.compressobj`,
            excluding ``wbits``.

    r"   FNTr]   r$   r^   r_   r>   r`   ra   r)   dict[str, Any] | Noner+   r,   c                 C  s   |du sd|  krdkst d t d|du s0|du s0d|  kr+dks0t d t d|dur<d|v r<t d|| _|| _|| _|| _|| _dS )	G
        Configure the Per-Message Deflate extension factory.

        Nr    r-   /server_max_window_bits must be between 8 and 15T/client_max_window_bits must be between 8 and 15r.   zLcompress_settings must not include wbits, set client_max_window_bits instead)
ValueErrorr]   r^   r_   r`   r)   )r6   r]   r^   r_   r`   r)   r   r   r   r7   D  s&   
z'ClientPerMessageDeflateFactory.__init__rf   c                 C  s   t | j| j| j| jS )z,
        Build request parameters.

        )re   r]   r^   r_   r`   r9   r   r   r   get_request_paramsd  s   z1ClientPerMessageDeflateFactory.get_request_paramsrd   accepted_extensionsSequence[Extension]r   c                   s   t  fdd|D rtd j t|dd\}}}} jr&|s&td jr-|s-d} jdu r3n|du r;td	| jkrDtd
 jdu rR|durQtdn jdu rXn|du r` j}n	| jkritdt|||pod|prd j	S )zV
        Process response parameters.

        Return an extension instance.

        c                 3      | ]	}|j  j kV  qd S rW   r\   r   otherr9   r   r   	<genexpr>{      zIClientPerMessageDeflateFactory.process_response_params.<locals>.<genexpr>zreceived duplicate Frg   z#expected server_no_context_takeoverTNzexpected server_max_window_bitsz"unsupported server_max_window_bitsz!unexpected client_max_window_bitsz"unsupported client_max_window_bitsr-   )
anyr   r\   rk   r]   r^   r_   r`   r   r)   r6   rd   rr   r]   r^   r_   r`   r   r9   r   process_response_paramsp  sJ   






z6ClientPerMessageDeflateFactory.process_response_params)FFNTN)r]   r$   r^   r$   r_   r>   r`   ra   r)   rl   r+   r,   )r+   rf   )rd   rf   rr   rs   r+   r   )	rX   rY   rZ   r[   r   r\   r7   rq   r}   r   r   r   r   r   *  s    
 r   
extensions'Sequence[ClientExtensionFactory] | None Sequence[ClientExtensionFactory]c                 C  s:   | du rg } t dd | D st| tddidg } | S )z
    Enable Per-Message Deflate with default settings in client extensions.

    If the extension is already present, perhaps with non-default settings,
    the configuration isn't changed.

    Nc                 s      | ]	}|j tj kV  qd S rW   )r\   r   )r   extension_factoryr   r   r   rx     
    

z3enable_client_permessage_deflate.<locals>.<genexpr>memLevel   )r)   )r{   listr   r~   r   r   r   r     s   
r   c                   @  s:   e Zd ZdZedZ						ddddZdddZdS )r   a  
    Server-side extension factory for the Per-Message Deflate extension.

    Parameters behave as described in `section 7.1 of RFC 7692`_.

    .. _section 7.1 of RFC 7692: https://datatracker.ietf.org/doc/html/rfc7692#section-7.1

    Set them to :obj:`True` to include them in the negotiation offer without a
    value or to an integer value to include them with this value.

    Args:
        server_no_context_takeover: Prevent server from using context takeover.
        client_no_context_takeover: Prevent client from using context takeover.
        server_max_window_bits: Maximum size of the server's LZ77 sliding window
            in bits, between 8 and 15.
        client_max_window_bits: Maximum size of the client's LZ77 sliding window
            in bits, between 8 and 15.
        compress_settings: Additional keyword arguments for :func:`zlib.compressobj`,
            excluding ``wbits``.
        require_client_max_window_bits: Do not enable compression at all if
            client doesn't advertise support for ``client_max_window_bits``;
            the default behavior is to enable compression without enforcing
            ``client_max_window_bits``.

    r"   FNr]   r$   r^   r_   r>   r`   r)   rl   require_client_max_window_bitsr+   r,   c                 C  s   |du sd|  krdkst d t d|du s,d|  kr'dks,t d t d|dur8d|v r8t d|du rB|rBt d|| _|| _|| _|| _|| _|| _dS )	rm   Nr    r-   rn   ro   r.   zLcompress_settings must not include wbits, set server_max_window_bits insteadzVrequire_client_max_window_bits is enabled, but client_max_window_bits isn't configured)rp   r]   r^   r_   r`   r)   r   )r6   r]   r^   r_   r`   r)   r   r   r   r   r7     s,   
z'ServerPerMessageDeflateFactory.__init__rd   rf   rr   rs   2tuple[list[ExtensionParameter], PerMessageDeflate]c                   s   t  fdd|D rtd j t|dd\}}}} jr$|s$d} jr+|s+d} jdu r1n|du r9 j}n| jkrA j} jdu rN|du rM j}n|du rZ jrYtdn|du rb j}n j|k rj j}t	||||t
|||pvd|pyd jfS )	zi
        Process request parameters.

        Return response params and an extension instance.

        c                 3  rt   rW   ru   rv   r9   r   r   rx   =  ry   zHServerPerMessageDeflateFactory.process_request_params.<locals>.<genexpr>zskipped duplicate Trz   Nzrequired client_max_window_bitsr-   )r{   r   r\   rk   r]   r^   r_   r`   r   re   r   r)   r|   r   r9   r   process_request_params2  s\   




z5ServerPerMessageDeflateFactory.process_request_params)FFNNNF)r]   r$   r^   r$   r_   r>   r`   r>   r)   rl   r   r$   r+   r,   )rd   rf   rr   rs   r+   r   )rX   rY   rZ   r[   r   r\   r7   r   r   r   r   r   r     s    #r   'Sequence[ServerExtensionFactory] | None Sequence[ServerExtensionFactory]c                 C  s>   | du rg } t dd | D st| tddddidg } | S )z
    Enable Per-Message Deflate with default settings in server extensions.

    If the extension is already present, perhaps with non-default settings,
    the configuration isn't changed.

    Nc                 s  r   rW   )r\   r   )r   ext_factoryr   r   r   rx     r   z3enable_server_permessage_deflate.<locals>.<genexpr>   r   r   )r_   r`   r)   )r{   r   r   r   r   r   r   r     s   
r   )
r]   r$   r^   r$   r_   r>   r`   ra   r+   rb   )rd   rf   rg   r$   r+   rh   )r~   r   r+   r   )r~   r   r+   r   )#
__future__r   r0   collections.abcr   typingr   r    r   
exceptionsr   r	   r
   r   r   r   r   r   r   baser   r   r   __all__rG   rangeri   r   re   rk   r   r   r   r   r   r   r   r   <module>   s*      
5
= 
1 3