o
    Ð­jªd  ã                   @  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   úe/var/www/html/CropPilot/venv/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_serverú9tuple[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