K iddlmZddlmZmZmZmZddlmZm Z m Z gdZ Gdde Z GddeeefZGd d e Ze eeeefeeeefefZy ) ) annotations)IterableIteratorMappingMutableMapping)AnyProtocolUnion)Headers HeadersLikeMultipleValuesErrorc$eZdZdZdfd ZxZS)r zP Exception raised when :class:`Headers` has multiple values for a key. ct|jdk(rt|jdSt|SNr)lenargsreprsuper__str__)self __class__s _/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/websockets/datastructures.pyrzMultipleValuesError.__str__s3 tyy>Q  ! % %w  returnstr)__name__ __module__ __qualname____doc__r __classcell__rs@rr r s !!rr ceZdZdZddgZddZddZddZddZddZ dd Z dd Z dd Z dd Z dd ZddZddZddZdfd Zd dZd!dZxZS)"r a 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_listcDi|_g|_|j|i|yN)r%r&update)rrkwargss r__init__zHeaders.__init__Ds#+- ,.  T$V$rcLdjd|jDdzS)Nc32K|]\}}|d|dyw)z:  N).0keyvalues r z"Headers.__str__..Js!Je#bt,Jsr/)joinr&rs rrzHeaders.__str__Is wwJtzzJJVSSrcN|jjd|jdS)N())rrr&r6s r__repr__zHeaders.__repr__Ls$..))*!DJJ>;;rc|j}|jj|_|jj|_|Sr()rr%copyr&)rr<s rr<z Headers.copyOs7~~ZZ__& ZZ__&  rc4t|jSr()rencoder6s r serializezHeaders.serializeUs4y!!rc^t|txr|j|jvSr() isinstancerlowerr%rr2s r __contains__zHeaders.__contains__[s##s#A tzz(AArc,t|jSr()iterr%r6s r__iter__zHeaders.__iter__^sDJJrc,t|jSr()rr%r6s r__len__zHeaders.__len__as4::rcx|j|j}t|dk(r|dSt|r)r%rBrr rr2r3s r __getitem__zHeaders.__getitem__fs5 399;' u:?8O%c* *rc|jj|jgj||jj||fyr()r% setdefaultrBappendr&rKs r __setitem__zHeaders.__setitem__ms= ciik2.55e< 3,'rc|j}|jj||jDcgc]\}}|j|k7s||fc}}|_ycc}}wr()rBr% __delitem__r&)rr2 key_lowerkvs rrRzHeaders.__delitem__qsMIIK  y))-NAqwwyI7Mq!fN Ns A'A'c`t|tstS|j|jk(Sr()rAr NotImplementedr%)rothers r__eq__zHeaders.__eq__ws%%)! !zzU[[((rc i|_g|_y)z& Remove all headers. N)r%r&r6s rclearz Headers.clear|s   rcHtd|D}t||i|y)zT Update from a :class:`Headers` instance and/or keyword arguments. c3`K|]&}t|tr|jn|(ywr()rAr raw_items)r1args rr4z!Headers.update..s) EHz#w7CMMOS @ s,.N)tuplerr))rrr*rs rr)zHeaders.updates/  LP   ''rcV|jj|jgS)z| Return the (possibly empty) list of all values for a header. Args: key: Header name. )r%getrBrCs rget_allzHeaders.get_allszz~~ciik2..rc,t|jS)zO Return an iterator of all values as ``(name, value)`` pairs. )rFr&r6s rr^zHeaders.raw_itemss DJJr)rr r*rrNoner)rr )rbytes)r2objectrbool)rz Iterator[str])rintr2rrr)r2rr3rrre)r2rrre)rXrrrh)rre)r2rrz list[str])rzIterator[tuple[str, str]])rrr r! __slots__r+rr:r<r?rDrGrIrLrPrRrYr[r)rcr^r"r#s@rr r sh#J'"I% T< " B  +(O ) (/ rr c eZdZdZddZddZy)SupportsKeysAndGetItemz_ Dict-like types with ``keys() -> str`` and ``__getitem__(key: str) -> str`` methods. cyr(r0r6s rkeyszSupportsKeysAndGetItem.keysrcyr(r0rCs rrLz"SupportsKeysAndGetItem.__getitem__rprN)rz Iterable[str]rj)rrr r!rorLr0rrrmrms )/rrmN) __future__rcollections.abcrrrrtypingrr r __all__ LookupErrorr rr rmr`r r0rrrws"GG''  !+ !D nS#X&D P0X0  CH U38_ r