Ë
    RPfø>  ã                  ó   — d dl mZ d dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZmZmZmZmZmZ g d¢Z ed«      Zd*d	„Zd+d
„Z ej4                  d«      Zd,d„Z ej4                  d«      Zd-d„Z ej4                  d«      Z ej4                  d«      Z d-d„Z! ej4                  d«      Z" ej4                  d«      Z#d.d„Z$	 	 	 	 	 	 	 	 	 	 d/d„Z%	 	 	 	 	 	 	 	 d0d„Z&d1d„Z' ej4                  d«      Z(	 	 	 	 	 	 	 	 d2d„Z)d3d„Z*	 	 	 	 	 	 	 	 d4d„Z+	 	 	 	 	 	 	 	 d5d„Z,d6d„Z-e-Z.	 	 	 	 	 	 d7d„Z/d8d„Z0e0Z1	 	 	 	 	 	 	 	 d9d „Z2d:d!„Z3e3Z4d;d"„Z5e5Z6d<d#„Z7d=d$„Z8 ej4                  d%«      Z9d-d&„Z:d>d'„Z;d?d(„Z<d@d)„Z=y)Aé    )ÚannotationsN)ÚCallableÚListÚOptionalÚSequenceÚTupleÚTypeVarÚcasté   )Ú
exceptions)ÚConnectionOptionÚExtensionHeaderÚExtensionNameÚExtensionParameterÚSubprotocolÚUpgradeProtocol)Ú
build_hostÚparse_connectionÚparse_upgradeÚparse_extensionÚbuild_extensionÚparse_subprotocolÚbuild_subprotocolÚvalidate_subprotocolsÚbuild_www_authenticate_basicÚparse_authorization_basicÚbuild_authorization_basicÚTc                óœ   — 	 t        j                  | «      }|j                  dk(  rd| › d�} 	 ||rdndk7  r| › d|› �} | S # t        $ r Y Œw xY w)z#
    Build a ``Host`` header.

    é   ú[ú]i»  éP   ú:)Ú	ipaddressÚ
ip_addressÚversionÚ
ValueError)ÚhostÚportÚsecureÚaddresss       úL/var/www/fastapitest/venv/lib/python3.12/site-packages/websockets/headers.pyr   r   &   sg   € ðÜ×&Ñ& tÓ,ˆð �?‰?˜aÒØ�t�f˜A�;‰Dà‘v‘ 2Ò&Ø��q˜˜Ðˆà€Køô ò áðús   ‚? ¿	AÁ
Ac                ó,   — |t        | «      k(  rdS | |   S )z·
    Return the next character from ``header`` at the given position.

    Return :obj:`None` at the end of ``header``.

    We never need to peek more than one character ahead.

    N)Úlen)ÚheaderÚposs     r-   Ú
peek_aheadr2   B   s   € ð œ#˜f›+Ò%ˆ4Ð6¨6°#©;Ð6ó    z[\t ]*c                óV   — t         j                  | |«      }|€J ‚|j                  «       S )z±
    Parse optional whitespace from ``header`` at the given position.

    Return the new position.

    The whitespace itself isn't returned because it isn't significant.

    )Ú_OWS_reÚmatchÚend)r0   r1   r6   s      r-   Ú	parse_OWSr8   Q   s,   € ô �M‰M˜& #Ó&€EØÐÐÐØ�9‰9‹;Ðr3   z[-!#$%&\'*+.^_`|~0-9a-zA-Z]+c                ó¢   — t         j                  | |«      }|€t        j                  |d| |«      ‚|j	                  «       |j                  «       fS )z®
    Parse a token from ``header`` at the given position.

    Return the token value and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    zexpected token)Ú	_token_rer6   r   ÚInvalidHeaderFormatÚgroupr7   ©r0   r1   Úheader_namer6   s       r-   Úparse_tokenr?   c   sI   € ô �O‰O˜F CÓ(€EØ€}Ü×,Ñ,¨[Ð:JÈFÐTWÓXÐXØ�;‰;‹=˜%Ÿ)™)›+Ð%Ð%r3   zC"(?:[\x09\x20-\x21\x23-\x5b\x5d-\x7e]|\\[\x09\x20-\x7e\x80-\xff])*"z\\([\x09\x20-\x7e\x80-\xff])c                óÐ   — t         j                  | |«      }|€t        j                  |d| |«      ‚t        j                  d|j                  «       dd «      |j                  «       fS )z¹
    Parse a quoted string from ``header`` at the given position.

    Return the unquoted value and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    zexpected quoted stringz\1r   éÿÿÿÿ)Ú_quoted_string_rer6   r   r;   Ú_unquote_reÚsubr<   r7   r=   s       r-   Úparse_quoted_stringrE   {   sc   € ô ×#Ñ# F¨CÓ0€EØ€}Ü×,Ñ,ØÐ1°6¸3ó
ð 	
ô �?‰?˜5 %§+¡+£-°°"Ð"5Ó6¸¿	¹	»ÐCÐCr3   z[\x09\x20-\x7e\x80-\xff]*z([\x22\x5c])c                ó~   — t         j                  | «      }|€t        d«      ‚dt        j	                  d| «      z   dz   S )zh
    Format ``value`` as a quoted string.

    This is the reverse of :func:`parse_quoted_string`.

    z-invalid characters for quoted-string encodingú"z\\\1)Ú_quotable_reÚ	fullmatchr(   Ú	_quote_rerD   )Úvaluer6   s     r-   Úbuild_quoted_stringrL   “   s@   € ô ×"Ñ" 5Ó)€EØ€}ÜÐHÓIÐIØ”—‘˜w¨Ó.Ñ.°Ñ4Ð4r3   c                óä  — t        ||«      dk(  rt        ||dz   «      }t        ||«      dk(  rŒg }	  | |||«      \  }}|j                  |«       t        ||«      }|t        |«      k(  rnut        ||«      dk(  rt        ||dz   «      }nt	        j
                  |d||«      ‚t        ||«      dk(  rt        ||dz   «      }t        ||«      dk(  rŒ|t        |«      k(  rnŒ®|t        |«      k(  sJ ‚|S )aö  
    Parse a comma-separated list from ``header`` at the given position.

    This is appropriate for parsing values with the following grammar:

        1#item

    ``parse_item`` parses one item.

    ``header`` is assumed not to start or end with whitespace.

    (This function is designed for parsing an entire header value and
    :func:`~websockets.http.read_headers` strips whitespace from values.)

    Return a list of items.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    ú,r   zexpected comma)r2   r8   Úappendr/   r   r;   )Ú
parse_itemr0   r1   r>   ÚitemsÚitems         r-   Ú
parse_listrS       s  € ô> �V˜SÓ
! SÒ
(Ü˜  a¡Ó(ˆô �V˜SÓ
! SÓ
(ð €EØ
á˜v s¨KÓ8‰	ˆˆcØ�‰�TÔÜ˜ Ó$ˆð ”#�f“+ÒØô �f˜cÓ" cÒ)Ü˜F C¨!¡GÓ,‰Cä×0Ñ0ØÐ-¨v°sóð ô
 ˜ Ó%¨Ò,Ü˜F C¨!¡GÓ,ˆCô ˜ Ó%¨Ó,ð ”#�f“+ÒØð1 ð8 ”#�f“+ÒÐÐà€Lr3   c                óF   — t        | ||«      \  }}t        t        |«      |fS )z½
    Parse a Connection option from ``header`` at the given position.

    Return the protocol value and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    )r?   r
   r   ©r0   r1   r>   rR   s       r-   Úparse_connection_optionrV   ä   s)   € ô ˜F C¨Ó5�I€Dˆ#ÜÔ  $Ó'¨Ð,Ð,r3   c                ó&   — t        t        | dd«      S )zÓ
    Parse a ``Connection`` header.

    Return a list of HTTP connection options.

    Args
        header: value of the ``Connection`` header.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    r   Ú
Connection)rS   rV   ©r0   s    r-   r   r   ô   s   € ô Ô-¨v°q¸,ÓGÐGr3   z>[-!#$%&\'*+.^_`|~0-9a-zA-Z]+(?:/[-!#$%&\'*+.^_`|~0-9a-zA-Z]+)?c                ó¾   — t         j                  | |«      }|€t        j                  |d| |«      ‚t	        t
        |j                  «       «      |j                  «       fS )z½
    Parse an Upgrade protocol from ``header`` at the given position.

    Return the protocol value and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    zexpected protocol)Ú_protocol_rer6   r   r;   r
   r   r<   r7   r=   s       r-   Úparse_upgrade_protocolr\   	  sX   € ô ×Ñ˜v sÓ+€EØ€}Ü×,Ñ,ØÐ,¨f°có
ð 	
ô ” §¡£Ó/°·±³Ð<Ð<r3   c                ó&   — t        t        | dd«      S )zÆ
    Parse an ``Upgrade`` header.

    Return a list of HTTP protocols.

    Args:
        header: value of the ``Upgrade`` header.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    r   ÚUpgrade)rS   r\   rY   s    r-   r   r     s   € ô Ô,¨f°a¸ÓCÐCr3   c                óZ  — t        | ||«      \  }}t        | |«      }d}t        | |«      dk(  ryt        | |dz   «      }t        | |«      dk(  r?|}t        | ||«      \  }}t        j                  |«      €(t        j                  |d| |«      ‚t        | ||«      \  }}t        | |«      }||f|fS )zÌ
    Parse a single extension parameter from ``header`` at the given position.

    Return a ``(name, value)`` pair and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    Nú=r   rG   zinvalid quoted header content)r?   r8   r2   rE   r:   rI   r   r;   )r0   r1   r>   ÚnamerK   Ú
pos_befores         r-   Úparse_extension_item_paramrc   -  sË   € ô ˜F C¨Ó5�I€Dˆ#Ü
�F˜CÓ
 €Cà€EÜ�&˜#Ó #Ò%Ü˜  a¡Ó(ˆÜ�f˜cÓ" cÒ)ØˆJÜ,¨V°S¸+ÓF‰JˆE�3ô ×"Ñ" 5Ó)Ð1Ü ×4Ñ4ØÐ!@À&È*óð ô % V¨S°+Ó>‰JˆE�3Ü˜ Ó$ˆà�%ˆ=˜#ÐÐr3   c                ó  — t        | ||«      \  }}t        | |«      }g }t        | |«      dk(  r@t        | |dz   «      }t        | ||«      \  }}|j	                  |«       t        | |«      dk(  rŒ@t        t        |«      |f|fS )a  
    Parse an extension definition from ``header`` at the given position.

    Return an ``(extension name, parameters)`` pair, where ``parameters`` is a
    list of ``(name, value)`` pairs, and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    ú;r   )r?   r8   r2   rc   rO   r
   r   )r0   r1   r>   ra   Ú
parametersÚ	parameters         r-   Úparse_extension_itemrh   Q  s�   € ô ˜F C¨Ó5�I€Dˆ#Ü
�F˜CÓ
 €Cà€JÜ
�V˜SÓ
! SÒ
(Ü˜  a¡Ó(ˆÜ3°F¸CÀÓM‰ˆ	�3Ø×Ñ˜)Ô$ô �V˜SÓ
! SÓ
(ô ” Ó% zÐ2°CÐ7Ð7r3   c                ó&   — t        t        | dd«      S )aâ  
    Parse a ``Sec-WebSocket-Extensions`` header.

    Return a list of WebSocket extensions and their parameters in this format::

        [
            (
                'extension name',
                [
                    ('parameter name', 'parameter value'),
                    ....
                ]
            ),
            ...
        ]

    Parameter values are :obj:`None` when no value is provided.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    r   zSec-WebSocket-Extensions)rS   rh   rY   s    r-   r   r   j  s   € ô. Ô*¨F°AÐ7QÓRÐRr3   c           
     óŒ   — dj                  t        t        | «      g|D � �cg c]  \  } }|€| n| › d|› �‘Œ c}} z   «      S c c}} w )zc
    Build an extension definition.

    This is the reverse of :func:`parse_extension_item`.

    z; r`   )Újoinr
   Ústr)ra   rf   rK   s      r-   Úbuild_extension_itemrm   ‡  s]   € ð �9‰9Ü	Œc�4‹Ðð  *÷
ñ ��eð �M‰D¨$¨¨q°°Ð'8Ñ8ó
ñ	
óð ùó
s   ¡A c                ó2   — dj                  d„ | D «       «      S )zl
    Build a ``Sec-WebSocket-Extensions`` header.

    This is the reverse of :func:`parse_extension`.

    ú, c              3  ó:   K  — | ]  \  }}t        ||«      –— Œ y ­w)N)rm   )Ú.0ra   rf   s      r-   ú	<genexpr>z"build_extension.<locals>.<genexpr>¡  s!   è ø€ ò Ù3C°4¸Ô˜T :×.ñùs   ‚©rk   )Ú
extensionss    r-   r   r   š  s"   € ð �9‰9ñ ØGQôó ð r3   c                óF   — t        | ||«      \  }}t        t        |«      |fS )zº
    Parse a subprotocol from ``header`` at the given position.

    Return the subprotocol value and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    )r?   r
   r   rU   s       r-   Úparse_subprotocol_itemrv   ©  s(   € ô ˜F C¨Ó5�I€Dˆ#Ü”˜TÓ" CÐ'Ð'r3   c                ó&   — t        t        | dd«      S )z 
    Parse a ``Sec-WebSocket-Protocol`` header.

    Return a list of WebSocket subprotocols.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    r   zSec-WebSocket-Protocol)rS   rv   rY   s    r-   r   r   ¹  s   € ô Ô,¨f°aÐ9QÓRÐRr3   c                ó$   — dj                  | «      S )zl
    Build a ``Sec-WebSocket-Protocol`` header.

    This is the reverse of :func:`parse_subprotocol`.

    ro   rs   )Úsubprotocolss    r-   r   r   É  s   € ð �9‰9�\Ó"Ð"r3   c                óÄ   — t        | t        «      st        d«      ‚t        | t        «      rt        d«      ‚| D ]%  }t        j                  |«      rŒt        d|› �«      ‚ y)zT
    Validate that ``subprotocols`` is suitable for :func:`build_subprotocol`.

    zsubprotocols must be a listz&subprotocols must be a list, not a strzinvalid subprotocol: N)Ú
isinstancer   Ú	TypeErrorrl   r:   rI   r(   )ry   Úsubprotocols     r-   r   r   Ö  sb   € ô
 �l¤HÔ-ÜÐ5Ó6Ð6Ü�,¤Ô$ÜÐ@ÓAÐAØ#ò DˆÜ×"Ñ" ;Õ/ÜÐ4°[°MÐBÓCÐCñDr3   c                ó>   — t        | «      } t        d«      }d| › d|› �S )z�
    Build a ``WWW-Authenticate`` header for HTTP Basic Auth.

    Args:
        realm: identifier of the protection space.

    zUTF-8zBasic realm=z
, charset=)rL   )ÚrealmÚcharsets     r-   r   r   ä  s+   € ô   Ó&€EÜ! 'Ó*€GØ˜%˜ 
¨7¨)Ð4Ð4r3   z[A-Za-z0-9-._~+/]+=*c                ó¢   — t         j                  | |«      }|€t        j                  |d| |«      ‚|j	                  «       |j                  «       fS )z°
    Parse a token68 from ``header`` at the given position.

    Return the token value and the new position.

    Raises:
        InvalidHeaderFormat: on invalid inputs.

    zexpected token68)Ú_token68_rer6   r   r;   r<   r7   r=   s       r-   Úparse_token68rƒ   õ  sQ   € ô ×Ñ˜f cÓ*€EØ€}Ü×,Ñ,ØÐ+¨V°Só
ð 	
ð �;‰;‹=˜%Ÿ)™)›+Ð%Ð%r3   c                óP   — |t        | «      k  rt        j                  |d| |«      ‚y)z8
    Check that parsing reached the end of header.

    ztrailing dataN)r/   r   r;   )r0   r1   r>   s      r-   Ú	parse_endr…     s-   € ð
 ŒS�‹[ÒÜ×,Ñ,¨[¸/È6ÐSVÓWÐWð r3   c                óH  — t        | dd«      \  }}|j                  «       dk7  rt        j                  dd|› �«      ‚t	        | |«      dk7  rt        j
                  dd| |«      ‚|dz  }t        | |d«      \  }}t        | |d«       	 t        j                  |j                  «       «      j                  «       }	 |j                  d
d«      \  }}||fS # t        j                  $ r t        j                  dd«      d	‚w xY w# t        $ r t        j                  dd«      d	‚w xY w)a!  
    Parse an ``Authorization`` header for HTTP Basic Auth.

    Return a ``(username, password)`` tuple.

    Args:
        header: value of the ``Authorization`` header.

    Raises:
        InvalidHeaderFormat: on invalid inputs.
        InvalidHeaderValue: on unsupported inputs.

    r   ÚAuthorizationÚbasiczunsupported scheme: ú zexpected space after schemer   z#expected base64-encoded credentialsNr$   z&expected username:password credentials)r?   Úlowerr   ÚInvalidHeaderValuer2   r;   rƒ   r…   Úbase64Ú	b64decodeÚencodeÚdecodeÚbinasciiÚErrorÚsplitr(   )r0   Úschemer1   Úbasic_credentialsÚ	user_passÚusernameÚpasswords          r-   r   r     sM  € ô  ˜f a¨Ó9�K€FˆCØ‡|�|ƒ~˜Ò Ü×+Ñ+ØØ" 6 (Ð+ó
ð 	
ô �&˜#Ó #Ò%Ü×,Ñ,ØÐ:¸FÀCó
ð 	
ð ˆ1�H€CÜ*¨6°3¸ÓHÑÐ�sÜˆf�c˜?Ô+ðÜ×$Ñ$Ð%6×%=Ñ%=Ó%?Ó@×GÑGÓIˆ	ðØ&Ÿ_™_¨S°!Ó4Ñˆ�(ð �XÐÐøô �>‰>ò Ü×+Ñ+ØØ1ó
ð ð	ðûô ò Ü×+Ñ+ØØ4ó
ð ð	ðús   Â1C Â9D  Ã+C=Ä !D!c                óˆ   — d| vsJ ‚| › d|› �}t        j                  |j                  «       «      j                  «       }d|z   S )z€
    Build an ``Authorization`` header for HTTP Basic Auth.

    This is the reverse of :func:`parse_authorization_basic`.

    r$   zBasic )rŒ   Ú	b64encoderŽ   r�   )r–   r—   r•   r”   s       r-   r   r   @  sQ   € ð �hÑÐÐØ�*˜A˜h˜ZÐ(€IÜ×(Ñ(¨×)9Ñ)9Ó);Ó<×CÑCÓEÐØÐ'Ñ'Ð'r3   )r)   rl   r*   Úintr+   ÚboolÚreturnrl   )r0   rl   r1   rš   rœ   zOptional[str])r0   rl   r1   rš   rœ   rš   )r0   rl   r1   rš   r>   rl   rœ   zTuple[str, int])rK   rl   rœ   rl   )
rP   z(Callable[[str, int, str], Tuple[T, int]]r0   rl   r1   rš   r>   rl   rœ   zList[T])r0   rl   r1   rš   r>   rl   rœ   zTuple[ConnectionOption, int])r0   rl   rœ   zList[ConnectionOption])r0   rl   r1   rš   r>   rl   rœ   zTuple[UpgradeProtocol, int])r0   rl   rœ   zList[UpgradeProtocol])r0   rl   r1   rš   r>   rl   rœ   zTuple[ExtensionParameter, int])r0   rl   r1   rš   r>   rl   rœ   zTuple[ExtensionHeader, int])r0   rl   rœ   zList[ExtensionHeader])ra   r   rf   zList[ExtensionParameter]rœ   rl   )rt   zSequence[ExtensionHeader]rœ   rl   )r0   rl   r1   rš   r>   rl   rœ   zTuple[Subprotocol, int])r0   rl   rœ   zList[Subprotocol])ry   úSequence[Subprotocol]rœ   rl   )ry   r�   rœ   ÚNone)r   rl   rœ   rl   )r0   rl   r1   rš   r>   rl   rœ   rž   )r0   rl   rœ   zTuple[str, str])r–   rl   r—   rl   rœ   rl   )>Ú
__future__r   rŒ   r�   r%   ÚreÚtypingr   r   r   r   r   r	   r
   Ú r   r   r   r   r   r   r   Ú__all__r   r   r2   Úcompiler5   r8   r:   r?   rB   rC   rE   rH   rJ   rL   rS   rV   r   r[   r\   r   rc   rh   r   Úparse_extension_listrm   r   Úbuild_extension_listrv   r   Úparse_subprotocol_listr   Úbuild_subprotocol_listr   r   r‚   rƒ   r…   r   r   © r3   r-   ú<module>rª      sj  ðÝ "ã Û Û Û 	ß K× KÑ Kå ÷÷ ò€ñ ˆCƒL€óó8	7ð ˆ"�*‰*�YÓ
€óð ˆB�J‰JÐ6Ó7€	ó&ð  �B—J‘JØJóÐ ð
 ˆb�j‰jÐ8Ó9€óDð$ ˆr�z‰zÐ6Ó7€ð ˆB�J‰J�Ó'€	ó
5ðAØ8ðAàðAð 
ðAð ð	Að
 óAðH-Øð-Øð-Ø(+ð-à!ó-ó Hð  ˆr�z‰zØEó€ð
=Øð=Øð=Ø(+ð=à ó=ó(Dð !Øð!Øð!Ø(+ð!à#ó!ðH8Øð8Øð8Ø(+ð8à ó8ó2Sð4 'Ð ðØ
ðØ%=ðàóó&	ð 'Ð ð(Øð(Øð(Ø(+ð(àó(ó 
Sð +Ð ó#ð +Ð óDó5ð ˆb�j‰jÐ0Ó1€ó&ó$Xó-ô`(r3   