ó
    öÞ jí  ã                  ó
  • S SK Jr  S SKrS SKJrJrJrJr  S SKJ	r	J
r
  / SQr " S S\5      r\R                  " S5      R                  r " S	 S
\\\4   5      r " S S\
5      r\\\\4   -  \\\\4      -  \-  r SSKJr  g)é    )ÚannotationsN)ÚIterableÚIteratorÚMappingÚMutableMapping)ÚAnyÚProtocol)ÚHeadersÚHeadersLikeÚMultipleValuesErrorc                  ó0   ^ • \ rS rSrSrSU 4S jjrSrU =r$ )r   é   zH
Exception raised when :class:`Headers` has multiple values for a key.

c                ó‚   >• [        U R                  5      S:X  a  [        U R                  S   5      $ [        TU ]  5       $ ©Né   r   )ÚlenÚargsÚreprÚsuperÚ__str__)ÚselfÚ	__class__s    €ÚS/var/www/html/gaurav/venv/lib/python3.13/site-packages/websockets/datastructures.pyr   ÚMultipleValuesError.__str__   s3   ø€ äˆt�y‰y‹>˜QÓÜ˜Ÿ	™	 !™Ó%Ð%Ü‰w‰Ó Ð ó    © ©ÚreturnÚstr)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classcell__©r   s   @r   r   r      s   ø† ñ÷
!õ !r   r   z[\x09\x20-\x7e\x80-\xff]*c                  óØ   ^ • \ rS rSrSrSS/rSS jrSS jrSS jrSS jr	SS	 jr
SS
 jrSS jrSS jrSS jrSS jrS S jrS!S jrS"S jrSU 4S jjrS#S jrS$S jrSS jrSrU =r$ )%r
   é    al  
Efficient data structure for manipulating HTTP headers.

A :class:`list` of ``(name, values)`` is inefficient for lookups.

A :class:`dict` doesn't suffice because header names are case-insensitive
and multiple occurrences of headers with the same name are possible.

:class:`Headers` stores HTTP headers in a hybrid data structure to provide
efficient insertions and lookups while preserving the original data.

In order to account for multiple values with minimal hassle,
:class:`Headers` follows this logic:

- When getting a header with ``headers[name]``:
    - if there's no value, :exc:`KeyError` is raised;
    - if there's exactly one value, it's returned;
    - if there's more than one value, :exc:`MultipleValuesError` is raised.

- When setting a header with ``headers[name] = value``, the value is
  appended to the list of values for that header.

- When deleting a header with ``del headers[name]``, all values for that
  header are removed (this is slow).

Other methods for manipulating headers are consistent with this logic.

As long as no header occurs multiple times, :class:`Headers` behaves like
:class:`dict`, except keys are lower-cased to provide case-insensitivity.

Two methods support manipulating multiple values explicitly:

- :meth:`get_all` returns a list of all values for a header;
- :meth:`raw_items` returns an iterator of ``(name, values)`` pairs.

Ú_dictÚ_listc                óD   • 0 U l         / U l        U R                  " U0 UD6  g ©N)r*   r+   Úupdate)r   r   Úkwargss      r   Ú__init__ÚHeaders.__init__I   s!   € Ø+-ˆŒ
Ø,.ˆŒ
Ø�Š�TÐ$˜VÓ$r   c                óL   • SR                  S U R                   5       5      S-   $ )NÚ c              3  ó4   #   • U H  u  pU S U S3v •  M     g7f)z: ú
Nr   )Ú.0ÚkeyÚvalues      r   Ú	<genexpr>Ú"Headers.__str__.<locals>.<genexpr>O   s   é € ÐJ¹z±°˜#˜˜b   tÕ,ºzùs   ‚r5   )Újoinr+   ©r   s    r   r   ÚHeaders.__str__N   s    € Ø�w‰wÑJ¸t¿zºzÓJÓJÈVÑSÐSr   c                óP   • U R                   R                   SU R                  < S3$ )NÚ(Ú))r   r    r+   r<   s    r   Ú__repr__ÚHeaders.__repr__Q   s$   € Ø—.‘.×)Ñ)Ð*¨!¨D¯J©J©>¸Ð;Ð;r   c                ó¢   • U R                  5       nU R                  R                  5       Ul        U R                  R                  5       Ul        U$ r-   )r   r*   Úcopyr+   )r   rD   s     r   rD   ÚHeaders.copyT   s7   € Ø�~‰~ÓˆØ—Z‘Z—_‘_Ó&ˆŒ
Ø—Z‘Z—_‘_Ó&ˆŒ
Øˆr   c                ó4   • [        U 5      R                  5       $ r-   )r   Úencoder<   s    r   Ú	serializeÚHeaders.serializeZ   s   € ä�4‹y×ÑÓ!Ð!r   c                ój   • [        U[        5      =(       a    UR                  5       U R                  ;   $ r-   )Ú
isinstancer   Úlowerr*   ©r   r7   s     r   Ú__contains__ÚHeaders.__contains__`   s#   € Ü˜#œsÓ#×A¨¯	©	«°t·z±zÑ(AÐAr   c                ó,   • [        U R                  5      $ r-   )Úiterr*   r<   s    r   Ú__iter__ÚHeaders.__iter__c   s   € Ü�D—J‘JÓÐr   c                ó,   • [        U R                  5      $ r-   )r   r*   r<   s    r   Ú__len__ÚHeaders.__len__f   s   € Ü�4—:‘:‹Ðr   c                óz   • U R                   UR                  5          n[        U5      S:X  a  US   $ [        U5      er   )r*   rL   r   r   ©r   r7   r8   s      r   Ú__getitem__ÚHeaders.__getitem__k   s5   € Ø—
‘
˜3Ÿ9™9›;Ñ'ˆÜˆu‹:˜‹?Ø˜‘8ˆOä% cÓ*Ð*r   c                óö   • [        [        U5      5      (       d  [        X5      eU R                  R	                  UR                  5       / 5      R                  U5        U R                  R                  X45        g r-   )Úis_valid_header_valuer   ÚInvalidHeaderValuer*   Ú
setdefaultrL   Úappendr+   rX   s      r   Ú__setitem__ÚHeaders.__setitem__r   sU   € Ü$¤S¨£Z×0Ñ0Ü$ SÓ0Ð0Ø�
‰
×Ñ˜cŸi™i›k¨2Ó.×5Ñ5°eÔ<Ø�
‰
×Ñ˜3˜,Õ'r   c                óÞ   • UR                  5       nU R                  R                  U5        U R                   VVs/ sH  u  p4UR                  5       U:w  d  M  X44PM      snnU l        g s  snnf r-   )rL   r*   Ú__delitem__r+   )r   r7   Ú	key_lowerÚkÚvs        r   rc   ÚHeaders.__delitem__x   sO   € Ø—I‘I“Kˆ	Ø�
‰
×Ñ˜yÔ)à)-¯ªÔN©¡ °q·w±w³yÀIÑ7M“f�q“f©ÒNˆ�
ùÓNs   »A)ÁA)c                ój   • [        U[        5      (       d  [        $ U R                  UR                  :H  $ r-   )rK   r
   ÚNotImplementedr*   )r   Úothers     r   Ú__eq__ÚHeaders.__eq__~   s(   € Ü˜%¤×)Ñ)Ü!Ð!Ø�z‰z˜UŸ[™[Ñ(Ð(r   c                ó    • 0 U l         / U l        g)z
Remove all headers.

N©r*   r+   r<   s    r   ÚclearÚHeaders.clearƒ   s   € ð
 ˆŒ
Øˆ�
r   c                óJ   >• [        S U 5       5      n[        TU ]  " U0 UD6  g)zD
Update from a :class:`Headers` instance and/or keyword arguments.

c              3  ón   #   • U H,  n[        U[        5      (       a  UR                  5       OUv •  M.     g 7fr-   )rK   r
   Ú	raw_items)r6   Úargs     r   r9   Ú!Headers.update.<locals>.<genexpr>�   s*   é € ð 
ÙLPÀSœz¨#¬w×7Ñ7ˆC�M‰MŒO¸SÔ@ÊDùs   ‚35N)Útupler   r.   )r   r   r/   r   s      €r   r.   ÚHeaders.update‹   s/   ø€ ô
 ñ 
ÙLPó
ó 
ˆô 	‰Š˜Ð' Ó'r   c                óV   • U R                   R                  UR                  5       / 5      $ )z\
Return the (possibly empty) list of all values for a header.

Args:
    key: Header name.

)r*   ÚgetrL   rM   s     r   Úget_allÚHeaders.get_all—   s   € ð �z‰z�~‰~˜cŸi™i›k¨2Ó.Ð.r   c                ó,   • [        U R                  5      $ )z?
Return an iterator of all values as ``(name, value)`` pairs.

)rQ   r+   r<   s    r   rs   ÚHeaders.raw_items¡   s   € ô
 �D—J‘JÓÐr   c                ó®   • U R                   R                  UR                  5       / 5      R                  U5        U R                  R                  X45        g)z-
Set a header without validating its value.

N)r*   r^   rL   r_   r+   rX   s      r   Úset_insecureÚHeaders.set_insecureª   s=   € ð
 	�
‰
×Ñ˜cŸi™i›k¨2Ó.×5Ñ5°eÔ<Ø�
‰
×Ñ˜3˜,Õ'r   rn   )r   r   r/   r   r   ÚNoner   )r   r
   )r   Úbytes)r7   Úobjectr   Úbool)r   zIterator[str])r   Úint©r7   r   r   r   )r7   r   r8   r   r   r�   )r7   r   r   r�   )rj   r   r   r„   )r   r�   )r7   r   r   z	list[str])r   zIterator[tuple[str, str]])r    r!   r"   r#   r$   Ú	__slots__r0   r   rA   rD   rH   rN   rR   rU   rY   r`   rc   rk   ro   r.   rz   rs   r   r%   r&   r'   s   @r   r
   r
       sr   ø† ñ#ðJ ˜'Ð"€Iô%ô
Tô<ôô"ôBô ôô
+ô(ôOô)ô
÷(ô/ô ÷(ò (r   r
   c                  ó,   • \ rS rSrSrSS jrSS jrSrg)	ÚSupportsKeysAndGetItemé´   zW
Dict-like types with ``keys() -> str`` and ``__getitem__(key: str) -> str`` methods.

c                ó   • g r-   r   r<   s    r   ÚkeysÚSupportsKeysAndGetItem.keysº   s   €  Sr   c                ó   • g r-   r   rM   s     r   rY   Ú"SupportsKeysAndGetItem.__getitem__¼   s   € ¨Cr   r   N)r   zIterable[str]r†   )r    r!   r"   r#   r$   rŒ   rY   r%   r   r   r   r‰   r‰   ´   s   † ñô
 )ç/r   r‰   r   )r]   )Ú
__future__r   ÚreÚcollections.abcr   r   r   r   Útypingr   r	   Ú__all__ÚLookupErrorr   ÚcompileÚ	fullmatchr\   r   r
   r‰   rv   r   Ú
exceptionsr]   r   r   r   Ú<module>r™      s�   ðÝ "ã 	ß GÓ Gß  ò€ô
!˜+ô 
!ð Ÿ
š
Ð#?Ó@×JÑJÐ ôP(ˆn˜S #˜XÑ&ô P(ôh0˜Xô 0ð ˆg�c˜3�hÑÑ (¨5°°c°©?Ñ";Ñ;Ð>TÑTð ðö +r   