a
    hW                     @  s  d dl mZ d dlmZ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 d dlmZmZmZmZ d dlmZ d dlmZ G dd	 d	eZed
ZedddZG dd dZG dd de Z!G dd dZ"G dd de	e  Z#G dd deeef Z$G dd de$eef Z%G dd de$e e f Z&G dd dZ'G dd de$e ee'e f f Z(G d d! d!ee e f Z)G d"d# d#e)Z*G d$d% d%Z+d&S )'    )annotations)	ItemsViewIterableIteratorKeysViewMappingMutableMappingSequence
ValuesView)shlex)AnyBinaryIO
NamedTupleTypeVarUnioncast)SplitResult	parse_qsl	urlencodeurlsplit)run_in_threadpool)Scopec                   @  s   e Zd ZU ded< ded< dS )AddressstrhostintportN)__name__
__module____qualname____annotations__ r!   r!   T/var/www/html/assistant/venv/lib/python3.9/site-packages/starlette/datastructures.pyr      s   
r   _KeyType_CovariantValueTypeT)	covariantc                   @  sT  e Zd Zd7ddddddd	Zed
dddZeddddZeddddZeddddZeddddZ	eddddZ
eddddZeddddZeddddZeddd d!Zed"dd#d$Zdd d%d&d'Zdd d%d(d)Zdd d%d*d+Zd,d d-d.d/Zdd"d0d1d2Zddd3d4Zddd5d6ZdS )8URL Nr   zScope | Noner   None)urlscope
componentsreturnc                 K  sB  |d ur
|rJ d|r"J d| dd}| dd }|d }| dd}d }|d	 D ]\}	}
|	d
krZ|
d} qzqZ|d ur| d| | }n\|d u r|}nN|\}}ddddd| }||kr| d| | }n| d| d| | }|r8|d|  7 }n.|r8|rJ dtdjf i |j }|| _d S )Nz"Cannot set both "url" and "scope".z+Cannot set both "scope" and "**components".schemehttpserverpathquery_string    headerss   hostlatin-1z://P   i  )r.   httpswswss:?z)Cannot set both "url" and "**components".r'   )getdecoder&   replacer+   geturl_url)selfr)   r*   r+   r-   r/   r0   r1   Zhost_headerkeyvaluer   r   default_portr!   r!   r"   __init__    s6    

zURL.__init__r   r,   c                 C  s   t | dst| j| _| jS )N_components)hasattrr   r?   rF   r@   r!   r!   r"   r+   H   s    
zURL.componentsc                 C  s   | j jS N)r+   r-   rH   r!   r!   r"   r-   N   s    z
URL.schemec                 C  s   | j jS rI   )r+   netlocrH   r!   r!   r"   rJ   R   s    z
URL.netlocc                 C  s   | j jS rI   )r+   r0   rH   r!   r!   r"   r0   V   s    zURL.pathc                 C  s   | j jS rI   )r+   queryrH   r!   r!   r"   rK   Z   s    z	URL.queryc                 C  s   | j jS rI   )r+   fragmentrH   r!   r!   r"   rL   ^   s    zURL.fragmentz
None | strc                 C  s   | j jS rI   )r+   usernamerH   r!   r!   r"   rM   b   s    zURL.usernamec                 C  s   | j jS rI   )r+   passwordrH   r!   r!   r"   rN   f   s    zURL.passwordc                 C  s   | j jS rI   )r+   hostnamerH   r!   r!   r"   rO   j   s    zURL.hostname
int | Nonec                 C  s   | j jS rI   )r+   r   rH   r!   r!   r"   r   n   s    zURL.portboolc                 C  s
   | j dv S )N)r6   r8   )r-   rH   r!   r!   r"   	is_securer   s    zURL.is_secure)kwargsr,   c           
      K  s  d|v s d|v s d|v s d|v r| dd }| d| j}| d| j}| d| j}|d u r| j}|d\}}}|d dkr|dd	d
 }|}|d ur|d| 7 }|d ur|}|d ur|d| 7 }| d| }||d< | jjf i |}	| 	|	
 S )NrM   rN   rO   r   @]r9      r   rJ   )popr   rM   rN   rJ   
rpartitionrsplitr+   _replace	__class__r>   )
r@   rS   rO   r   rM   rN   rJ   _Zuserpassr+   r!   r!   r"   r=   v   s*     zURL.replacec                 K  sB   t t| jdd}|dd | D  t| }| j|dS )NTkeep_blank_valuesc                 S  s   i | ]\}}t |t |qS r!   r   .0rA   rB   r!   r!   r"   
<dictcomp>   r2   z,URL.include_query_params.<locals>.<dictcomp>rK   )	MultiDictr   rK   updateitemsr   multi_itemsr=   )r@   rS   paramsrK   r!   r!   r"   include_query_params   s    zURL.include_query_paramsc                 K  s"   t dd | D }| j|dS )Nc                 S  s    g | ]\}}t |t |fqS r!   r`   ra   r!   r!   r"   
<listcomp>   r2   z,URL.replace_query_params.<locals>.<listcomp>rd   )r   rg   r=   )r@   rS   rK   r!   r!   r"   replace_query_params   s    zURL.replace_query_paramsstr | Sequence[str])keysr,   c                 C  sP   t |tr|g}tt| jdd}|D ]}||d  q&t| }| j|dS )NTr^   rd   )	
isinstancer   re   r   rK   rX   r   rh   r=   )r@   rn   ri   rA   rK   r!   r!   r"   remove_query_params   s    
zURL.remove_query_paramsotherr,   c                 C  s   t | t |kS rI   r`   r@   rr   r!   r!   r"   __eq__   s    z
URL.__eq__c                 C  s   | j S rI   )r?   rH   r!   r!   r"   __str__   s    zURL.__str__c                 C  s6   t | }| jrt | jdd}| jj dt| dS )Nz********)rN   ())r   rN   r=   r\   r   repr)r@   r)   r!   r!   r"   __repr__   s    zURL.__repr__)r'   N)r   r   r   rD   propertyr+   r-   rJ   r0   rK   rL   rM   rN   rO   r   rR   r=   rj   rl   rp   rt   ru   ry   r!   r!   r!   r"   r&      s@     (	r&   c                   @  sL   e Zd ZdZddddd dddZdddddddd	Zd
ddddZdS )URLPathz
    A URL path string that may also hold an associated protocol and/or host.
    Used by the routing to return `url_path_for` matches.
    r'   r   )r0   protocolr   r,   c                 C  s   |dv sJ t | |S )N)r.   	websocketr'   )r   __new__)clsr0   r|   r   r!   r!   r"   r~      s    zURLPath.__new__r(   c                 C  s   || _ || _d S rI   )r|   r   )r@   r0   r|   r   r!   r!   r"   rD      s    zURLPath.__init__z	str | URLr&   )base_urlr,   c                 C  sp   t |trt|}| jr<ddddddd| j |j }n|j}| jpL|j}|j	dt|  }t|||dS )	Nr6   r.   )TFr8   r7   )r.   r}   /)r-   rJ   r0   )
ro   r   r&   r|   rR   r-   r   rJ   r0   rstrip)r@   r   r-   rJ   r0   r!   r!   r"   make_absolute_url   s    
zURLPath.make_absolute_urlN)r'   r'   )r'   r'   )r   r   r   __doc__r~   rD   r   r!   r!   r!   r"   r{      s   r{   c                   @  sH   e Zd ZdZddddZddddZddd	d
ZddddZdS )Secretz
    Holds a string value that should not be revealed in tracebacks etc.
    You should cast the value to `str` at the point it is required.
    r   rB   c                 C  s
   || _ d S rI   _valuer@   rB   r!   r!   r"   rD      s    zSecret.__init__rE   c                 C  s   | j j}| dS )Nz('**********')r\   r   )r@   
class_namer!   r!   r"   ry      s    zSecret.__repr__c                 C  s   | j S rI   r   rH   r!   r!   r"   ru      s    zSecret.__str__rQ   c                 C  s
   t | jS rI   )rQ   r   rH   r!   r!   r"   __bool__   s    zSecret.__bool__N)r   r   r   r   rD   ry   ru   r   r!   r!   r!   r"   r      s
   r   c                   @  sb   e Zd ZddddZddddZd	d
dddZddddZddddZddddZdS )CommaSeparatedStringsrm   r   c                 C  sB   t |tr4t|dd}d|_d|_dd |D | _n
t|| _d S )NT)posix,c                 S  s   g | ]}|  qS r!   )striprb   itemr!   r!   r"   rk      r2   z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)ro   r   r   
whitespacewhitespace_split_itemslist)r@   rB   Zsplitterr!   r!   r"   rD      s    
zCommaSeparatedStrings.__init__r   rE   c                 C  s
   t | jS rI   )lenr   rH   r!   r!   r"   __len__   s    zCommaSeparatedStrings.__len__zint | slicer   )indexr,   c                 C  s
   | j | S rI   )r   )r@   r   r!   r!   r"   __getitem__   s    z!CommaSeparatedStrings.__getitem__zIterator[str]c                 C  s
   t | jS rI   )iterr   rH   r!   r!   r"   __iter__   s    zCommaSeparatedStrings.__iter__r   c                 C  s&   | j j}dd | D }| d|dS )Nc                 S  s   g | ]}|qS r!   r!   r   r!   r!   r"   rk      r2   z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>rv   rw   r   r@   r   rg   r!   r!   r"   ry      s    zCommaSeparatedStrings.__repr__c                 C  s   d dd | D S )N, c                 s  s   | ]}t |V  qd S rI   )rx   r   r!   r!   r"   	<genexpr>   r2   z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)joinrH   r!   r!   r"   ru      s    zCommaSeparatedStrings.__str__N)	r   r   r   rD   r   r   r   ry   ru   r!   r!   r!   r"   r      s   	r   c                   @  s   e Zd ZU ded< ddddddZdd	d
ddZddddZddddZddddZddddZ	ddd
ddZ
ddd
dd Zd!dd"d#Zd$dd%d&Zddd'd(d)Zd*dd+d,Zd-S ).ImmutableMultiDictz#dict[_KeyType, _CovariantValueType]_dictzImmutableMultiDict[_KeyType, _CovariantValueType] | Mapping[_KeyType, _CovariantValueType] | Iterable[tuple[_KeyType, _CovariantValueType]]r   r(   argsrS   r,   c                 O  s   t |dk sJ d|r |d ng }|r@t| t|  }|sJg }nft|drtttttf |}t| }n<t|drttttf |}t|	 }ntd|}t|}dd |D | _
|| _d S )	N   Too many arguments.r   rh   rg   zlist[tuple[Any, Any]]c                 S  s   i | ]\}}||qS r!   r!   rb   kvr!   r!   r"   rc     r2   z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r   r   rh   rG   r   r#   r$   r   r   rg   r   _list)r@   r   rS   rB   r   r!   r!   r"   rD     s     


zImmutableMultiDict.__init__zlist[_CovariantValueType]rA   r,   c                   s    fdd| j D S )Nc                   s   g | ]\}}| kr|qS r!   r!   rb   item_key
item_valuerA   r!   r"   rk      r2   z.ImmutableMultiDict.getlist.<locals>.<listcomp>r   r@   rA   r!   r   r"   getlist  s    zImmutableMultiDict.getlistzKeysView[_KeyType]rE   c                 C  s
   | j  S rI   )r   rn   rH   r!   r!   r"   rn   "  s    zImmutableMultiDict.keyszValuesView[_CovariantValueType]c                 C  s
   | j  S rI   )r   valuesrH   r!   r!   r"   r   %  s    zImmutableMultiDict.valuesz(ItemsView[_KeyType, _CovariantValueType]c                 C  s
   | j  S rI   )r   rg   rH   r!   r!   r"   rg   (  s    zImmutableMultiDict.itemsz*list[tuple[_KeyType, _CovariantValueType]]c                 C  s
   t | jS rI   r   r   rH   r!   r!   r"   rh   +  s    zImmutableMultiDict.multi_itemsr#   r$   c                 C  s
   | j | S rI   r   r   r!   r!   r"   r   .  s    zImmutableMultiDict.__getitem__rQ   c                 C  s
   || j v S rI   r   r   r!   r!   r"   __contains__1  s    zImmutableMultiDict.__contains__zIterator[_KeyType]c                 C  s   t |  S rI   r   rn   rH   r!   r!   r"   r   4  s    zImmutableMultiDict.__iter__r   c                 C  s
   t | jS rI   )r   r   rH   r!   r!   r"   r   7  s    zImmutableMultiDict.__len__rq   c                 C  s$   t || jsdS t| jt|jkS NF)ro   r\   sortedr   rs   r!   r!   r"   rt   :  s    zImmutableMultiDict.__eq__r   c                 C  s    | j j}|  }| d|dS Nrv   rw   )r\   r   rh   r   r!   r!   r"   ry   ?  s    zImmutableMultiDict.__repr__N)r   r   r   r    rD   r   rn   r   rg   rh   r   r   r   r   rt   ry   r!   r!   r!   r"   r      s   
r   c                   @  s   e Zd ZddddddZdddddZd!dddd
ddZddddZdddddZddddZd"dddd
ddZ	ddddddZ
ddddddZdddddd Zd	S )#re   r   r(   rA   rB   r,   c                 C  s   |  ||g d S rI   )setlistr@   rA   rB   r!   r!   r"   __setitem__F  s    zMultiDict.__setitem__r   c                   s"    fdd| j D | _ | j = d S )Nc                   s    g | ]\}}| kr||fqS r!   r!   r   r   r!   r"   rk   J  r2   z)MultiDict.__delitem__.<locals>.<listcomp>)r   r   r   r!   r   r"   __delitem__I  s    zMultiDict.__delitem__N)rA   defaultr,   c                   s$    fdd| j D | _ | j |S )Nc                   s    g | ]\}}| kr||fqS r!   r!   r   r   r!   r"   rk   N  r2   z!MultiDict.pop.<locals>.<listcomp>)r   r   rX   r@   rA   r   r!   r   r"   rX   M  s    zMultiDict.popztuple[Any, Any]rE   c                   s,   | j  \ } fdd| jD | _ |fS )Nc                   s    g | ]\}}| kr||fqS r!   r!   r   r   r!   r"   rk   S  r2   z%MultiDict.popitem.<locals>.<listcomp>)r   popitemr   r   r!   r   r"   r   Q  s    zMultiDict.popitemz	list[Any]c                   s"    fdd| j D }|   |S )Nc                   s   g | ]\}}| kr|qS r!   r!   r   r   r!   r"   rk   W  r2   z%MultiDict.poplist.<locals>.<listcomp>)r   rX   )r@   rA   r   r!   r   r"   poplistV  s    
zMultiDict.poplistc                 C  s   | j   | j  d S rI   )r   clearr   rH   r!   r!   r"   r   [  s    
zMultiDict.clearc                 C  s*   || vr"|| j |< | j||f | | S rI   )r   r   appendr   r!   r!   r"   
setdefault_  s    
zMultiDict.setdefault)rA   r   r,   c                   sP   |s|   d  n: fdd| jD }| fdd|D  | _|d | j < d S )Nc                   s    g | ]\}}| kr||fqS r!   r!   r   r   r!   r"   rk   j  r2   z%MultiDict.setlist.<locals>.<listcomp>c                   s   g | ]} |fqS r!   r!   )rb   rB   r   r!   r"   rk   k  r2   rU   )rX   r   r   )r@   rA   r   existing_itemsr!   r   r"   r   f  s
    zMultiDict.setlistc                 C  s   | j ||f || j|< d S rI   )r   r   r   r   r!   r!   r"   r   n  s    zMultiDict.appendz5MultiDict | Mapping[Any, Any] | list[tuple[Any, Any]]r   c                   s@   t |i |  fdd| jD }|   | _| j  d S )Nc                   s$   g | ]\}}|   vr||fqS r!   )rn   r   r   r!   r"   rk   x  r2   z$MultiDict.update.<locals>.<listcomp>)re   r   rh   r   rf   )r@   r   rS   r   r!   r   r"   rf   r  s    zMultiDict.update)N)N)r   r   r   r   r   rX   r   r   r   r   r   r   rf   r!   r!   r!   r"   re   E  s   re   c                      sF   e Zd ZdZdddd fddZdd	d
dZdd	ddZ  ZS )QueryParamsz!
    An immutable multidict.
    zVImmutableMultiDict[Any, Any] | Mapping[Any, Any] | list[tuple[Any, Any]] | str | bytesr   r(   r   c                   s   t |dk sJ d|r |d ng }t|trLt jt|ddfi | n@t|trzt jt|dddfi | nt j|i | dd | jD | _d	d
 | j	
 D | _	d S )Nr   r   r   Tr^   r4   c                 S  s    g | ]\}}t |t |fqS r!   r`   r   r!   r!   r"   rk     r2   z(QueryParams.__init__.<locals>.<listcomp>c                 S  s   i | ]\}}t |t |qS r!   r`   r   r!   r!   r"   rc     r2   z(QueryParams.__init__.<locals>.<dictcomp>)r   ro   r   superrD   r   bytesr<   r   r   rg   )r@   r   rS   rB   r\   r!   r"   rD     s    

$zQueryParams.__init__r   rE   c                 C  s
   t | jS rI   )r   r   rH   r!   r!   r"   ru     s    zQueryParams.__str__c                 C  s    | j j}t| }| d|dS r   )r\   r   r   )r@   r   r1   r!   r!   r"   ry     s    zQueryParams.__repr__)r   r   r   r   rD   ru   ry   __classcell__r!   r!   r   r"   r   }  s   r   c                   @  s   e Zd ZdZdddddddddd	d
dZeddddZeddddZdddddZdddddZ	d&dddddZ
ddddd Zddd!d"Zd#dd$d%ZdS )'
UploadFilez@
    An uploaded file included as part of the request data.
    N)sizefilenamer3   r   rP   z
str | NonezHeaders | Noner(   )filer   r   r3   r,   c                C  s2   || _ || _|| _|pt | _t| jdd| _d S )N	_max_sizer   )r   r   r   Headersr3   getattr_max_mem_size)r@   r   r   r   r3   r!   r!   r"   rD     s
    zUploadFile.__init__rE   c                 C  s   | j dd S )Nzcontent-type)r3   r;   rH   r!   r!   r"   content_type  s    zUploadFile.content_typerQ   c                 C  s   t | jdd}| S )N_rolledT)r   r   )r@   Zrolled_to_diskr!   r!   r"   
_in_memory  s    zUploadFile._in_memoryr   )size_to_addr,   c                 C  s0   | j s
dS | j | }| jr,t|| jkS dS )NTF)r   r   tellr   rQ   )r@   r   Zfuture_sizer!   r!   r"   
_will_roll  s    zUploadFile._will_rollr   )datar,   c                   sP   t |}| jd ur |  j|7  _| |r@t| jj|I d H  n| j| d S rI   )r   r   r   r   r   write)r@   r   Znew_data_lenr!   r!   r"   r     s    

zUploadFile.writerU   )r   r,   c                   s&   | j r| j|S t| jj|I d H S rI   )r   r   readr   )r@   r   r!   r!   r"   r     s    zUploadFile.read)offsetr,   c                   s,   | j r| j| nt| jj|I d H  d S rI   )r   r   seekr   )r@   r   r!   r!   r"   r     s    zUploadFile.seekc                   s(   | j r| j  nt| jjI d H  d S rI   )r   r   closer   rH   r!   r!   r"   r     s    zUploadFile.closer   c                 C  s&   | j j d| jd| jd| jdS )Nz
(filename=z, size=z
, headers=rw   )r\   r   r   r   r3   rH   r!   r!   r"   ry     s    zUploadFile.__repr__)rU   )r   r   r   r   rD   rz   r   r   r   r   r   r   r   ry   r!   r!   r!   r"   r     s   	
r   c                      s8   e Zd ZdZdddd fddZddd	d
Z  ZS )FormDatazN
    An immutable multidict, containing both file uploads and text input.
    zNFormData | Mapping[str, str | UploadFile] | list[tuple[str, str | UploadFile]]zstr | UploadFiler(   r   c                   s   t  j|i | d S rI   )r   rD   )r@   r   rS   r   r!   r"   rD     s    zFormData.__init__rE   c                   s.   |   D ] \}}t|tr| I d H  qd S rI   )rh   ro   r   r   r   r!   r!   r"   r     s    
zFormData.close)r   r   r   r   rD   r   r   r!   r!   r   r"   r     s   r   c                   @  s   e Zd ZdZd.ddddddd	Zed
dddZddddZddddZddddZ	dddddZ
ddddZdddddZdd dd!d"Zd#dd$d%Zd&dd'd(Zdd d)d*d+Zddd,d-ZdS )/r   z3
    An immutable, case-insensitive multidict.
    NzMapping[str, str] | Nonez list[tuple[bytes, bytes]] | NonezMutableMapping[str, Any] | Noner(   )r3   rawr*   r,   c                 C  s   g | _ |d urD|d u sJ d|d u s.J ddd | D | _ n>|d urd|d u s\J d|| _ n|d urt|d  | _ |d< d S )Nz$Cannot set both "headers" and "raw".z&Cannot set both "headers" and "scope".c                 S  s(   g | ] \}}|  d |d fqS r4   )lowerencodera   r!   r!   r"   rk     r2   z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r3   )r   rg   r   )r@   r3   r   r*   r!   r!   r"   rD     s    zHeaders.__init__list[tuple[bytes, bytes]]rE   c                 C  s
   t | jS rI   r   rH   r!   r!   r"   r     s    zHeaders.rawz	list[str]c                 C  s   dd | j D S )Nc                 S  s   g | ]\}}| d qS r   r<   ra   r!   r!   r"   rk     r2   z Headers.keys.<locals>.<listcomp>r   rH   r!   r!   r"   rn     s    zHeaders.keysc                 C  s   dd | j D S )Nc                 S  s   g | ]\}}| d qS r   r   ra   r!   r!   r"   rk     r2   z"Headers.values.<locals>.<listcomp>r   rH   r!   r!   r"   r     s    zHeaders.valueszlist[tuple[str, str]]c                 C  s   dd | j D S )Nc                 S  s$   g | ]\}}| d | d fqS r   r   ra   r!   r!   r"   rk     r2   z!Headers.items.<locals>.<listcomp>r   rH   r!   r!   r"   rg     s    zHeaders.itemsr   r   c                   s"   |  d  fdd| jD S )Nr4   c                   s"   g | ]\}}| kr| d qS r   r   r   get_header_keyr!   r"   rk     r2   z#Headers.getlist.<locals>.<listcomp>r   r   r   r   r!   r   r"   r     s    zHeaders.getlistMutableHeadersc                 C  s   t | jd d  dS )N)r   )r   r   rH   r!   r!   r"   mutablecopy   s    zHeaders.mutablecopyc                 C  s@   |  d}| jD ]\}}||kr|d  S qt|d S )Nr4   )r   r   r   r<   KeyErrorr@   rA   r   Z
header_keyheader_valuer!   r!   r"   r   #  s
    zHeaders.__getitem__r   rQ   c                 C  s0   |  d}| jD ]\}}||kr dS qdS )Nr4   TFr   r   r!   r!   r"   r   *  s
    zHeaders.__contains__zIterator[Any]c                 C  s   t |  S rI   r   rH   r!   r!   r"   r   1  s    zHeaders.__iter__r   c                 C  s
   t | jS rI   )r   r   rH   r!   r!   r"   r   4  s    zHeaders.__len__rq   c                 C  s"   t |tsdS t| jt|jkS r   )ro   r   r   r   rs   r!   r!   r"   rt   7  s    
zHeaders.__eq__c                 C  sF   | j j}t|  }t|t| kr4| d|dS | d| jdS )Nrv   rw   z(raw=)r\   r   dictrg   r   r   )r@   r   Zas_dictr!   r!   r"   ry   <  s
    zHeaders.__repr__)NNN)r   r   r   r   rD   rz   r   rn   r   rg   r   r   r   r   r   r   rt   ry   r!   r!   r!   r"   r     s$      r   c                   @  s   e Zd ZddddddZdddddZd	d d
ddZd	d d
ddZeddddZddddddZ	d	dd
ddZ
ddddddZdddddZdS )r   r   r(   r   c           	      C  s   |  d}|d}g }t| jD ]\}\}}||kr&|| q&t|dd D ]}| j|= qV|r|d }||f| j|< n| j||f dS )zs
        Set the header `key` to `value`, removing any duplicate entries.
        Retains insertion order.
        r4   rW   Nr   r   r   	enumerater   r   reversed)	r@   rA   rB   set_key	set_valueZfound_indexesidxr   r   r!   r!   r"   r   E  s    

zMutableHeaders.__setitem__r   c                 C  sV   |  d}g }t| jD ]\}\}}||kr|| qt|D ]}| j|= qDdS )z*
        Remove the header `key`.
        r4   Nr   )r@   rA   Zdel_keyZpop_indexesr   r   r   r!   r!   r"   r   [  s    zMutableHeaders.__delitem__zMapping[str, str]rq   c                 C  s*   t |tstd|jj | | | S NzExpected a mapping but got )ro   r   	TypeErrorr\   r   rf   rs   r!   r!   r"   __ior__i  s    

zMutableHeaders.__ior__c                 C  s2   t |tstd|jj |  }|| |S r   )ro   r   r   r\   r   r   rf   )r@   rr   newr!   r!   r"   __or__o  s
    

zMutableHeaders.__or__r   rE   c                 C  s   | j S rI   r   rH   r!   r!   r"   r   v  s    zMutableHeaders.rawc                 C  sZ   |  d}|d}t| jD ]"\}\}}||kr"|d  S q"| j||f |S )zo
        If the header `key` does not exist, then set it to `value`.
        Returns the header value.
        r4   )r   r   r   r   r<   r   )r@   rA   rB   r   r   r   r   r   r!   r!   r"   r   z  s    
zMutableHeaders.setdefaultc                 C  s   |  D ]\}}|| |< qd S rI   )rg   )r@   rr   rA   valr!   r!   r"   rf     s    zMutableHeaders.updatec                 C  s,   |  d}|d}| j||f dS )zD
        Append a header, preserving any duplicate entries.
        r4   N)r   r   r   r   )r@   rA   rB   Z
append_keyZappend_valuer!   r!   r"   r     s    
zMutableHeaders.append)varyr,   c                 C  s,   |  d}|d ur d||g}|| d< d S )Nr   r   )r;   r   )r@   r   existingr!   r!   r"   add_vary_header  s    
zMutableHeaders.add_vary_headerN)r   r   r   r   r   r   r   rz   r   r   rf   r   r   r!   r!   r!   r"   r   D  s   r   c                      sd   e Zd ZU dZded< ddd fddZd	d	d
dddZd	d	dddZd	d
dddZ  Z	S )Statezm
    An object that can be used to store arbitrary state.

    Used for `request.state` and `app.state`.
    zdict[str, Any]_stateNzdict[str, Any] | None)statec                   s   |d u ri }t  d| d S )Nr  )r   __setattr__)r@   r  r   r!   r"   rD     s    zState.__init__r   r(   r   c                 C  s   || j |< d S rI   r  r   r!   r!   r"   r    s    zState.__setattr__r   c                 C  s<   z| j | W S  ty6   d}t|| jj|Y n0 d S )Nz!'{}' object has no attribute '{}')r  r   AttributeErrorformatr\   r   )r@   rA   messager!   r!   r"   __getattr__  s
    zState.__getattr__c                 C  s   | j |= d S rI   r  r   r!   r!   r"   __delattr__  s    zState.__delattr__)N)
r   r   r   r   r    rD   r  r  r	  r   r!   r!   r   r"   r     s   
r   N),
__future__r   collections.abcr   r   r   r   r   r   r	   r
   r   typingr   r   r   r   r   r   urllib.parser   r   r   r   Zstarlette.concurrencyr   Zstarlette.typesr   r   r#   r$   r&   r   r{   r   r   r   re   r   r   r   r   r   r   r!   r!   r!   r"   <module>   s,   (  E8 H MW