a
    њhod                     @  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 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ddddddddZddddddZG dd  d eZd!d"d#d$d%ZG d&d' d'eZ d(d)d#d*d+Z!dS ),    )annotationsN)Sequence)AnyLiteral   )frames)DuplicateParameterInvalidParameterNameInvalidParameterValueNegotiationErrorPayloadTooBigProtocolError)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   c/wd/webapps/venvs/v2025_4um/lib/python3.9/site-packages/websockets/extensions/permessage_deflate.py
<listcomp>       r         c                   @  sh   e Zd ZdZedZddddddddd	d
ZddddZddddddddZdddddZ	dS )r   z)
    Per-Message Deflate extension.

    permessage-deflateNboolintzdict[Any, Any] | NoneNone)remote_no_context_takeoverlocal_no_context_takeoverremote_max_window_bitslocal_max_window_bitscompress_settingsreturnc                 C  s   |du ri }|dv sJ |dv s$J d|  kr8dks>n J d|  krRdksXn J d|vsdJ || _ || _|| _|| _|| _| j stj| j d| _| jstjf d| j i| j| _	d| _
dS )z?
        Configure the Per-Message Deflate extension.

        N)FTr       wbitsr-   F)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   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)   r5   r   r   r   __repr__S   s    zPerMessageDeflate.__repr__)max_sizezframes.Frame
int | None)framer;   r+   c             
   C  sP  |j tjv r|S |j tju r4| js&|S |jrbd| _n.|js>|S |jsJd| _| jrbtj	| j
 d| _|jrt|jdk rt|jt }n|j}|du rdn|}zP| j||}| jjr|dusJ td||jrt|jdkr| jt W n2 tjy } ztd|W Y d}~n
d}~0 0 |jr4| jr4| `t|j ||jd|j|jS )z,
        Decode an incoming frame.

        FTr.   i  Nr   zdecompression failed)opcoder   CTRL_OPCODESOP_CONTr4   finZrsv1r&   r/   r0   r(   r1   lendatabytes_EMPTY_UNCOMPRESSED_BLOCK
decompressunconsumed_tailr   errorr   Framersv2rsv3)r5   r=   r;   rC   
max_lengthexcr   r   r   decode\   sH    
 zPerMessageDeflate.decode)r=   r+   c                 C  s   |j tjv r|S |j tjur>| jr>tjf d| j i| j| _	| j	
|j| j	tj }|jr|dd tkstJ t|dk r|dd }nt|dd }|jr| jr| `	t|j ||j|j tju|j|jS )z,
        Encode an outgoing frame.

        r-   Ni   )r>   r   r?   r@   r'   r/   r2   r)   r*   r3   compressrC   flushZ_SYNC_FLUSHrA   rE   rB   
memoryviewrI   rJ   rK   )r5   r=   rC   r   r   r   encode   s2    
zPerMessageDeflate.encode)N)
__name__
__module____qualname____doc__r   namer6   r:   rN   rT   r   r   r   r   r   !   s    *Hr   r#   r<   int | Literal[True] | Nonezlist[ExtensionParameter])server_no_context_takeoverclient_no_context_takeoverserver_max_window_bitsclient_max_window_bitsr+   c                 C  sd   g }| r| d |r | d |r6| dt|f |du rJ| d n|r`| 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    


ra   Sequence[ExtensionParameter]z9tuple[bool, bool, int | None, int | Literal[True] | None])r`   	is_serverr+   c                C  s  d}d}d}d}| D ]\}}|dkrJ|r0t ||du r>d}qt||q|dkrx|r^t ||du rld}qt||q|dkr|durt ||tv rt|}qt||q|dkr|durt ||r|du rd}q|tv rt|}qt||qt|q||||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	   )r`   rc   r[   r\   r]   r^   rY   valuer   r   r   _extract_parameters   sJ    



rf   c                   @  sR   e Zd ZdZedZdddddd	d
dddZddddZddd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<   rZ   dict[str, Any] | Noner%   )r[   r\   r]   r^   r*   r+   c                 C  s   |du s&d|  krdks&n t d|du sT|du sTd|  krJdksTn t d|durld|v rlt 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*   )r5   r[   r\   r]   r^   r*   r   r   r   r6   B  s(    z'ClientPerMessageDeflateFactory.__init__rb   r7   c                 C  s   t | j| j| j| jS )z,
        Build request parameters.

        )ra   r[   r\   r]   r^   r9   r   r   r   get_request_paramsb  s    z1ClientPerMessageDeflateFactory.get_request_paramsSequence[Extension]r   r`   accepted_extensionsr+   c                   s   t  fdd|D r&td j t|dd\}}}} jrL|sLtd jrZ|sZd} jdu rfn$|du rxtd	n| jkrtd
 jdu r|durtdn. jdu rn"|du r j}n| jkrtdt|||pd|pd j	S )zV
        Process response parameters.

        Return an extension instance.

        c                 3  s   | ]}|j  j kV  qd S NrY   r   otherr9   r   r   	<genexpr>y  r   zIClientPerMessageDeflateFactory.process_response_params.<locals>.<genexpr>zreceived duplicate Frc   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   rY   rf   r[   r\   r]   r^   r   r*   r5   r`   ro   r[   r\   r]   r^   r   r9   r   process_response_paramsn  sH    








z6ClientPerMessageDeflateFactory.process_response_params)FFNTN)	rU   rV   rW   rX   r   rY   r6   rl   rx   r   r   r   r   r   (  s         r   z'Sequence[ClientExtensionFactory] | Nonez Sequence[ClientExtensionFactory])
extensionsr+   c                 C  s:   | du rg } t dd | D s6t| 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  s   | ]}|j tj kV  qd S rp   )rY   r   )r   Zextension_factoryr   r   r   rt     s   z3enable_client_permessage_deflate.<locals>.<genexpr>memLevel   )r*   )rv   listr   ry   r   r   r   r     s    
r   c                	   @  sF   e Zd ZdZedZddddddddd	d
dZddd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<   rg   r%   )r[   r\   r]   r^   r*   require_client_max_window_bitsr+   c                 C  s   |du s&d|  krdks&n t d|du sLd|  krBdksLn t d|durdd|v rdt d|du rx|rxt d|| _|| _|| _|| _|| _|| _dS )	rh   Nr    r,   ri   rj   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)rk   r[   r\   r]   r^   r*   r~   )r5   r[   r\   r]   r^   r*   r~   r   r   r   r6     s$    z'ServerPerMessageDeflateFactory.__init__rb   rm   z2tuple[list[ExtensionParameter], PerMessageDeflate]rn   c                   s   t  fdd|D r&td j t|dd\}}}} jrH|sHd} jrV|sVd} jdu rbn |du rr j}n| jkr j} jdu r|du rԈ j}n8|du r jrtdn |du rĈ j}n j|k rԈ j}t	||||t
|||pd|pd jfS )	zi
        Process request parameters.

        Return response params and an extension instance.

        c                 3  s   | ]}|j  j kV  qd S rp   rq   rr   r9   r   r   rt   ;  r   zHServerPerMessageDeflateFactory.process_request_params.<locals>.<genexpr>zskipped duplicate Tru   Nzrequired client_max_window_bitsr,   )rv   r   rY   rf   r[   r\   r]   r^   r~   ra   r   r*   rw   r   r9   r   process_request_params0  sX    





z5ServerPerMessageDeflateFactory.process_request_params)FFNNNF)rU   rV   rW   rX   r   rY   r6   r   r   r   r   r   r     s         #r   z'Sequence[ServerExtensionFactory] | Nonez 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  s   | ]}|j tj kV  qd S rp   )rY   r   )r   Zext_factoryr   r   r   rt     s   z3enable_server_permessage_deflate.<locals>.<genexpr>   rz   r{   )r]   r^   r*   )rv   r|   r   r}   r   r   r   r     s    
r   )"
__future__r   r/   collections.abcr   typingr   r    r   
exceptionsr   r	   r
   r   r   r   r   r   baser   r   r   __all__rE   rangerd   r   ra   rf   r   r   r   r   r   r   r   r   <module>   s(     3= 1 3