o
    hV                     @  sv  d dl mZ d dlZd dl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jZed	Zej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je ZG dd dejeef ZG dd deejejf ZG dd deeef ZG dd dZG dd deeejeef f ZG dd  d ejeef Z G d!d" d"e Z!G d#d$ d$Z"dS )%    )annotationsN)shlex)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   l/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/starlette/datastructures.pyr
      s   
 r
   _KeyType_CovariantValueTypeT)	covariantc                   @  s   e Zd Z		d9d:ddZed;ddZed<ddZed<ddZed<ddZed<ddZ	ed<ddZ
ed=ddZed=ddZed=dd Zed>d"d#Zed?d%d&Zd@d(d)Zd@d*d+Zd@d,d-ZdAd0d1ZdBd3d4Zd<d5d6Zd<d7d8ZdS )CURL Nurlr   scopeScope | None
components
typing.AnyreturnNonec                 K  s:  |d ur|r
J d|rJ d| dd}| dd }|d }| dd}d }|d	 D ]\}	}
|	d
kr;|
d} nq,|d urJ| d| | }n.|d u rQ|}n'|\}}ddddd| }||krl| d| | }n| d| d| | }|r|d|  7 }n|r|rJ dtdjd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   r   )getdecoder   replacer   geturl_url)selfr   r   r   r!   r#   r$   r%   host_headerkeyvaluer   r   default_portr   r   r   __init__   s:   

zURL.__init__r   c                 C  s   t | dst| j| _| jS )N_components)hasattrr   r3   r:   r4   r   r   r   r   @   s   
zURL.componentsc                 C     | j jS N)r   r!   r<   r   r   r   r!   F      z
URL.schemec                 C  r=   r>   )r   netlocr<   r   r   r   r@   J   r?   z
URL.netlocc                 C  r=   r>   )r   r$   r<   r   r   r   r$   N   r?   zURL.pathc                 C  r=   r>   )r   queryr<   r   r   r   rA   R   r?   z	URL.queryc                 C  r=   r>   )r   fragmentr<   r   r   r   rB   V   r?   zURL.fragment
None | strc                 C  r=   r>   )r   usernamer<   r   r   r   rD   Z   r?   zURL.usernamec                 C  r=   r>   )r   passwordr<   r   r   r   rE   ^   r?   zURL.passwordc                 C  r=   r>   )r   hostnamer<   r   r   r   rF   b   r?   zURL.hostname
int | Nonec                 C  r=   r>   )r   r   r<   r   r   r   r   f   r?   zURL.portboolc                 C  s
   | j dv S )N)r*   r,   )r!   r<   r   r   r   	is_securej      
zURL.is_securekwargsc           
      K  s  d|v sd|v sd|v sd|v rq| dd }| d| j}| d| j}| d| j}|d u rH| j}|d\}}}|d dkrH|dd	d
 }|}|d urU|d| 7 }|d urm|}|d urf|d| 7 }| d| }||d< | jjdi |}	| 	|	
 S )NrD   rE   rF   r   @]r-      r   r@   r   )popr   rD   rE   r@   
rpartitionrsplitr   _replace	__class__r2   )
r4   rK   rF   r   rD   rE   r@   _userpassr   r   r   r   r1   n   s*    zURL.replacec                 K  sB   t t| jdd}|dd | D  t| }| j|dS )NTkeep_blank_valuesc                 S     i | ]\}}t |t |qS r   r   .0r6   r7   r   r   r   
<dictcomp>       z,URL.include_query_params.<locals>.<dictcomp>rA   )	MultiDictr   rA   updateitemsr   multi_itemsr1   )r4   rK   paramsrA   r   r   r   include_query_params   s   zURL.include_query_paramsc                 K  s"   t dd | D }| j|dS )Nc                 S      g | ]\}}t |t |fqS r   rZ   r[   r   r   r   
<listcomp>        z,URL.replace_query_params.<locals>.<listcomp>r_   )r   rb   r1   )r4   rK   rA   r   r   r   replace_query_params      zURL.replace_query_paramskeysstr | typing.Sequence[str]c                 C  sP   t |tr|g}tt| jdd}|D ]}||d  qt| }| j|dS )NTrW   r_   )	
isinstancer   r`   r   rA   rP   r   rc   r1   )r4   rk   rd   r6   rA   r   r   r   remove_query_params   s   
zURL.remove_query_paramsotherc                 C  s   t | t |kS r>   rZ   r4   ro   r   r   r   __eq__      z
URL.__eq__c                 C     | j S r>   )r3   r<   r   r   r   __str__      zURL.__str__c                 C  s6   t | }| jrt | jdd}| jj dt| dS )Nz********)rE   ())r   rE   r1   rT   r   repr)r4   r   r   r   r   __repr__   s   zURL.__repr__)r   N)r   r   r   r   r   r   r   r    )r   r   r   r   )r   rC   )r   rG   r   rH   )rK   r   r   r   )rk   rl   r   r   ro   r   r   rH   )r   r   r   r9   propertyr   r!   r@   r$   rA   rB   rD   rE   rF   r   rI   r1   re   ri   rn   rq   rt   ry   r   r   r   r   r      sB    (




	
r   c                   @  s2   e Zd ZdZdddd	ZddddZ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$   r   protocolr   r   c                 C  s   |dv sJ t | |S )N)r"   	websocketr   )r   __new__)clsr$   r   r   r   r   r   r      s   zURLPath.__new__r    c                 C  s   || _ || _d S r>   )r   r   )r4   r$   r   r   r   r   r   r9      s   
zURLPath.__init__base_url	str | URLr   c                 C  sp   t |tr	t|}| jrddddddd| j |j }n|j}| jp&|j}|j	dt|  }t|||dS )	Nr*   r"   )TFr,   r+   )r"   r   /)r!   r@   r$   )
rm   r   r   r   rI   r!   r   r@   r$   rstrip)r4   r   r!   r@   r$   r   r   r   make_absolute_url   s   
zURLPath.make_absolute_urlN)r   r   )r$   r   r   r   r   r   r   r~   )r$   r   r   r   r   r   r   r    )r   r   r   r   )r   r   r   __doc__r   r9   r   r   r   r   r   r~      s
    r~   c                   @  s8   e Zd ZdZdddZdddZdd	d
Z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.
    r7   r   c                 C  s
   || _ d S r>   _valuer4   r7   r   r   r   r9         
zSecret.__init__r   c                 C  s   | j j}| dS )Nz('**********')rT   r   )r4   
class_namer   r   r   ry      s   
zSecret.__repr__c                 C  rs   r>   r   r<   r   r   r   rt      ru   zSecret.__str__rH   c                 C  
   t | jS r>   )rH   r   r<   r   r   r   __bool__   r   zSecret.__bool__N)r7   r   rz   r{   )r   r   r   r   r9   ry   rt   r   r   r   r   r   r      s    


r   c                   @  sH   e Zd ZdddZdddZdddZdddZdddZdddZdS )CommaSeparatedStringsr7   rl   c                 C  sD   t |trt|dd}d|_d|_dd |D | _d S t|| _d S )NT)posix,c                 S  s   g | ]}|  qS r   )stripr\   itemr   r   r   rg          z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)rm   r   r   
whitespacewhitespace_split_itemslist)r4   r7   splitterr   r   r   r9      s   
zCommaSeparatedStrings.__init__r   r   c                 C  r   r>   )lenr   r<   r   r   r   __len__   r   zCommaSeparatedStrings.__len__indexint | slicer   c                 C  
   | j | S r>   )r   )r4   r   r   r   r   __getitem__   r   z!CommaSeparatedStrings.__getitem__typing.Iterator[str]c                 C  r   r>   )iterr   r<   r   r   r   __iter__   r   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   rg      s    z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>rv   rw   r   r4   r   rb   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 r>   )rx   r   r   r   r   	<genexpr>   s    z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)joinr<   r   r   r   rt         zCommaSeparatedStrings.__str__N)r7   rl   r   r   )r   r   r   r   )r   r   rz   )	r   r   r   r9   r   r   r   ry   rt   r   r   r   r   r      s    

	


r   c                   @  s   e Zd ZU ded< d/d	d
Zd0ddZd1ddZd2ddZd3ddZd4ddZ	d5ddZ
d6d d!Zd7d#d$Zd8d&d'Zd9d)d*Zd:d,d-Zd.S );ImmutableMultiDictz#dict[_KeyType, _CovariantValueType]_dictargsImmutableMultiDict[_KeyType, _CovariantValueType] | typing.Mapping[_KeyType, _CovariantValueType] | typing.Iterable[tuple[_KeyType, _CovariantValueType]]rK   r   r   r    c                 O  s   t |dk s
J d|r|d ng }|r t| t|  }|s%g }n7t|dr;ttttf |}t| }n!t|drRttj	ttf |}t|
 }n
td|}t|}dd |D | _|| _d S )	N   Too many arguments.r   rc   rb   z#list[tuple[typing.Any, typing.Any]]c                 S  s   i | ]\}}||qS r   r   r\   kvr   r   r   r]     s    z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r   r   rc   r;   typingcastr   r   r   Mappingrb   r   _list)r4   r   rK   r7   r   r   r   r   r9      s    


zImmutableMultiDict.__init__r6   list[_CovariantValueType]c                   s    fdd| j D S )Nc                      g | ]
\}}| kr|qS r   r   r\   item_key
item_valuer6   r   r   rg         z.ImmutableMultiDict.getlist.<locals>.<listcomp>r   r4   r6   r   r   r   getlist  r   zImmutableMultiDict.getlisttyping.KeysView[_KeyType]c                 C  
   | j  S r>   )r   rk   r<   r   r   r   rk     r   zImmutableMultiDict.keys&typing.ValuesView[_CovariantValueType]c                 C  r   r>   )r   valuesr<   r   r   r   r     r   zImmutableMultiDict.values/typing.ItemsView[_KeyType, _CovariantValueType]c                 C  r   r>   )r   rb   r<   r   r   r   rb      r   zImmutableMultiDict.items*list[tuple[_KeyType, _CovariantValueType]]c                 C  r   r>   r   r   r<   r   r   r   rc   #  r   zImmutableMultiDict.multi_itemsr   r   c                 C  r   r>   r   r   r   r   r   r   &  r   zImmutableMultiDict.__getitem__rH   c                 C  s
   || j v S r>   r   r   r   r   r   __contains__)  r   zImmutableMultiDict.__contains__typing.Iterator[_KeyType]c                 C     t |  S r>   r   rk   r<   r   r   r   r   ,     zImmutableMultiDict.__iter__r   c                 C  r   r>   )r   r   r<   r   r   r   r   /  r   zImmutableMultiDict.__len__ro   c                 C  s$   t || jsdS t| jt|jkS NF)rm   rT   sortedr   rp   r   r   r   rq   2  s   zImmutableMultiDict.__eq__r   c                 C  s    | j j}|  }| d|dS Nrv   rw   )rT   r   rc   r   r   r   r   ry   7     zImmutableMultiDict.__repr__N)r   r   rK   r   r   r    )r6   r   r   r   )r   r   )r   r   )r   r   )r   r   )r6   r   r   r   r6   r   r   rH   )r   r   r   r|   rz   )r   r   r   r   r9   r   rk   r   rb   rc   r   r   r   r   rq   ry   r   r   r   r   r      s   
 










r   c                   @  st   e Zd Zd"ddZd#dd	Zd$d%ddZd&ddZd'ddZd(ddZd$d%ddZ	d)ddZ
d"ddZd*d d!Zd
S )+r`   r6   r   r7   r   r    c                 C  s   |  ||g d S r>   )setlistr4   r6   r7   r   r   r   __setitem__>  s   zMultiDict.__setitem__c                   s"    fdd| j D | _ | j = d S )Nc                       g | ]\}}| kr||fqS r   r   r   r   r   r   rg   B  rh   z)MultiDict.__delitem__.<locals>.<listcomp>)r   r   r   r   r   r   __delitem__A  rj   zMultiDict.__delitem__Ndefaultc                   s$    fdd| j D | _ | j |S )Nc                   r   r   r   r   r   r   r   rg   F  rh   z!MultiDict.pop.<locals>.<listcomp>)r   r   rP   r4   r6   r   r   r   r   rP   E  s   zMultiDict.poptuple[typing.Any, typing.Any]c                   s,   | j  \ } fdd| jD | _ |fS )Nc                   r   r   r   r   r   r   r   rg   K  rh   z%MultiDict.popitem.<locals>.<listcomp>)r   popitemr   r   r   r   r   r   I  s   zMultiDict.popitemlist[typing.Any]c                   s"    fdd| j D }|   |S )Nc                   r   r   r   r   r   r   r   rg   O  r   z%MultiDict.poplist.<locals>.<listcomp>)r   rP   )r4   r6   r   r   r   r   poplistN  s   
zMultiDict.poplistc                 C  s   | j   | j  d S r>   )r   clearr   r<   r   r   r   r   S  s   
zMultiDict.clearc                 C  s*   || vr|| j |< | j||f | | S r>   )r   r   appendr   r   r   r   
setdefaultW  s   
zMultiDict.setdefaultr   c                   sR   |s
|   d  d S  fdd| jD }| fdd|D  | _|d | j < d S )Nc                   r   r   r   r   r   r   r   rg   b  rh   z%MultiDict.setlist.<locals>.<listcomp>c                   s   g | ]} |fqS r   r   )r\   r7   r   r   r   rg   c  r   rM   )rP   r   r   )r4   r6   r   existing_itemsr   r   r   r   ^  s
   zMultiDict.setlistc                 C  s   | j ||f || j|< d S r>   )r   r   r   r   r   r   r   r   f  s   zMultiDict.appendr   XMultiDict | typing.Mapping[typing.Any, typing.Any] | list[tuple[typing.Any, typing.Any]]rK   c                   s@   t |i |  fdd| jD }|   | _| j  d S )Nc                   s$   g | ]\}}|   vr||fqS r   )rk   r   r7   r   r   rg   p     $ z$MultiDict.update.<locals>.<listcomp>)r`   r   rc   r   ra   )r4   r   rK   r   r   r   r   ra   j  s   zMultiDict.updater6   r   r7   r   r   r    r6   r   r   r    r>   )r6   r   r   r   r   r   )r   r   )r6   r   r   r   r   r    )r6   r   r   r   r   r    )r   r   rK   r   r   r    )r   r   r   r   r   rP   r   r   r   r   r   r   ra   r   r   r   r   r`   =  s    






r`   c                      s6   e Zd ZdZd fdd	ZdddZdddZ  ZS )QueryParamsz!
    An immutable multidict.
    r   ImmutableMultiDict[typing.Any, typing.Any] | typing.Mapping[typing.Any, typing.Any] | list[tuple[typing.Any, typing.Any]] | str | bytesrK   r   r   r    c                   s   t |dk s
J d|r|d ng }t|tr&t jt|ddfi | n t|tr=t jt|dddfi | n	t j|i | dd | jD | _d	d
 | j	
 D | _	d S )Nr   r   r   TrW   r(   c                 S  rf   r   rZ   r   r   r   r   rg     rh   z(QueryParams.__init__.<locals>.<listcomp>c                 S  rY   r   rZ   r   r   r   r   r]     r^   z(QueryParams.__init__.<locals>.<dictcomp>)r   rm   r   superr9   r   bytesr0   r   r   rb   )r4   r   rK   r7   rT   r   r   r9   z  s   	

$zQueryParams.__init__r   c                 C  r   r>   )r   r   r<   r   r   r   rt     r   zQueryParams.__str__c                 C  s    | j j}t| }| d|dS r   )rT   r   r   )r4   r   r%   r   r   r   ry     r   zQueryParams.__repr__)r   r   rK   r   r   r    rz   )r   r   r   r   r9   rt   ry   __classcell__r   r   r   r   r   u  s
    
r   c                   @  st   e Zd ZdZddddd%ddZed&ddZed'ddZd(ddZd)d*ddZ	d+ddZ
d,d d!Zd-d#d$ZdS ).
UploadFilez@
    An uploaded file included as part of the request data.
    N)sizefilenamer'   filetyping.BinaryIOr   rG   r   
str | Noner'   Headers | Noner   r    c                C  s"   || _ || _|| _|pt | _d S r>   )r   r   r   Headersr'   )r4   r   r   r   r'   r   r   r   r9     s   zUploadFile.__init__c                 C  s   | j dd S )Nzcontent-type)r'   r/   r<   r   r   r   content_type  s   zUploadFile.content_typerH   c                 C  s   t | jdd}| S )N_rolledT)getattrr   )r4   rolled_to_diskr   r   r   
_in_memory  s   zUploadFile._in_memorydatar   c                   sL   | j d ur|  j t|7  _ | jr| j| d S t| jj|I d H  d S r>   )r   r   r   r   writer   )r4   r   r   r   r   r     s   
zUploadFile.writerM   r   c                   s(   | j r
| j|S t| jj|I d H S r>   )r   r   readr   )r4   r   r   r   r   r     s   zUploadFile.readoffsetc                   s0   | j r| j| d S t| jj|I d H  d S r>   )r   r   seekr   )r4   r  r   r   r   r    s   zUploadFile.seekc                   s,   | j r| j  d S t| jjI d H  d S r>   )r   r   closer   r<   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   )rT   r   r   r   r'   r<   r   r   r   ry     s   &zUploadFile.__repr__)
r   r   r   rG   r   r   r'   r   r   r    )r   r   r{   )r   r   r   r    )rM   )r   r   r   r   )r  r   r   r    r   rz   )r   r   r   r   r9   r}   r   r   r   r   r  r  ry   r   r   r   r   r     s    
	

r   c                      s,   e Zd ZdZd fdd	Zdd
dZ  ZS )FormDatazN
    An immutable multidict, containing both file uploads and text input.
    r   UFormData | typing.Mapping[str, str | UploadFile] | list[tuple[str, str | UploadFile]]rK   str | UploadFiler   r    c                   s   t  j|i | d S r>   )r   r9   )r4   r   rK   r   r   r   r9     s   zFormData.__init__c                   s0   |   D ]\}}t|tr| I d H  qd S r>   )rc   rm   r   r  r   r   r   r   r    s   
zFormData.close)r   r  rK   r  r   r    r   )r   r   r   r   r9   r  r   r   r   r   r   r    s    r  c                   @  s   e Zd ZdZ			d0d1ddZed2ddZd3ddZd3ddZd4ddZ	d5ddZ
d6ddZd7dd Zd8d#d$Zd9d&d'Zd:d)d*Zd;d,d-Zd<d.d/ZdS )=r   z3
    An immutable, case-insensitive multidict.
    Nr'   typing.Mapping[str, str] | Noneraw list[tuple[bytes, bytes]] | Noner   -typing.MutableMapping[str, typing.Any] | Noner   r    c                 C  s   g | _ |d ur#|d u sJ d|d u sJ ddd | D | _ d S |d ur4|d u s/J d|| _ d S |d urEt|d  | _ |d< d S 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 r(   )lowerencoder[   r   r   r   rg     s   ( z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r'   )r   rb   r   )r4   r'   r  r   r   r   r   r9     s   
zHeaders.__init__list[tuple[bytes, bytes]]c                 C  r   r>   r   r<   r   r   r   r    rJ   zHeaders.raw	list[str]c                 C     dd | j D S )Nc                 S  s   g | ]	\}}| d qS r  r0   r[   r   r   r   rg         z Headers.keys.<locals>.<listcomp>r   r<   r   r   r   rk     rr   zHeaders.keysc                 C  r  )Nc                 S  s   g | ]	\}}| d qS r  r  r[   r   r   r   rg     r  z"Headers.values.<locals>.<listcomp>r   r<   r   r   r   r     rr   zHeaders.valueslist[tuple[str, str]]c                 C  r  )Nc                 S  s$   g | ]\}}| d | d fqS r  r  r[   r   r   r   rg     r   z!Headers.items.<locals>.<listcomp>r   r<   r   r   r   rb     rr   zHeaders.itemsr6   r   c                   s"   |  d  fdd| jD S )Nr(   c                   s"   g | ]\}}| kr| d qS r  r  r   get_header_keyr   r   rg     s   " 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   r<   r   r   r   mutablecopy  r   zHeaders.mutablecopyc                 C  s<   |  d}| jD ]\}}||kr|d  S q
t|)Nr(   )r  r  r   r0   KeyErrorr4   r6   r  
header_keyheader_valuer   r   r   r     s   zHeaders.__getitem__r   rH   c                 C  s0   |  d}| jD ]\}}||kr dS q
dS )Nr(   TFr  r  r   r   r   r     s   zHeaders.__contains__typing.Iterator[typing.Any]c                 C  r   r>   r   r<   r   r   r   r     r   zHeaders.__iter__r   c                 C  r   r>   )r   r   r<   r   r   r   r   "  r   zHeaders.__len__ro   c                 C  s"   t |tsdS t| jt|jkS r   )rm   r   r   r   rp   r   r   r   rq   %  s   
zHeaders.__eq__c                 C  sF   | j j}t|  }t|t| kr| d|dS | d| jdS )Nrv   rw   z(raw=)rT   r   dictrb   r   r  )r4   r   as_dictr   r   r   ry   *  s
   zHeaders.__repr__)NNN)r'   r  r  r	  r   r
  r   r    r   r  )r   r  )r   r  )r6   r   r   r  )r   r  )r6   r   r   r   r   )r   r  r   r|   rz   )r   r   r   r   r9   r}   r  rk   r   rb   r   r  r   r   r   r   rq   ry   r   r   r   r   r     s&    









r   c                   @  sj   e Zd ZdddZddd	ZdddZdddZed ddZd!ddZ	d"ddZ
dddZd#ddZdS )$r  r6   r   r7   r   r    c           	      C  s   |  d}|d}g }t| jD ]\}\}}||kr"|| qt|dd D ]}| j|= q+|rA|d }||f| j|< dS | j||f dS )zs
        Set the header `key` to `value`, removing any duplicate entries.
        Retains insertion order.
        r(   rO   Nr   r  r  	enumerater   r   reversed)	r4   r6   r7   set_key	set_valuefound_indexesidxr   r   r   r   r   r   3  s   


zMutableHeaders.__setitem__c                 C  sV   |  d}g }t| jD ]\}\}}||kr|| qt|D ]}| j|= q"dS )z*
        Remove the header `key`.
        r(   Nr!  )r4   r6   del_keypop_indexesr'  r   r   r   r   r   r   I  s   

zMutableHeaders.__delitem__ro   typing.Mapping[str, str]c                 C  s,   t |tjstd|jj | | | S NzExpected a mapping but got )rm   r   r   	TypeErrorrT   r   ra   rp   r   r   r   __ior__W  s   
zMutableHeaders.__ior__c                 C  s4   t |tjstd|jj |  }|| |S r+  )rm   r   r   r,  rT   r   r  ra   )r4   ro   newr   r   r   __or__]  s
   
zMutableHeaders.__or__r  c                 C  rs   r>   r   r<   r   r   r   r  d  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.
        r(   )r  r  r"  r   r0   r   )r4   r6   r7   r$  r%  r'  r   r   r   r   r   r   h  s   
zMutableHeaders.setdefaultc                 C  s   |  D ]\}}|| |< qd S r>   )rb   )r4   ro   r6   valr   r   r   ra   v  s   
zMutableHeaders.updatec                 C  s,   |  d}|d}| j||f dS )zD
        Append a header, preserving any duplicate entries.
        r(   N)r  r  r   r   )r4   r6   r7   
append_keyappend_valuer   r   r   r   z  s   
zMutableHeaders.appendvaryc                 C  s,   |  d}|d urd||g}|| d< d S )Nr3  r   )r/   r   )r4   r3  existingr   r   r   add_vary_header  s   
zMutableHeaders.add_vary_headerN)r6   r   r7   r   r   r    )r6   r   r   r    )ro   r*  r   r  r   )r6   r   r7   r   r   r   )ro   r*  r   r    )r3  r   r   r    )r   r   r   r   r   r-  r/  r}   r  r   ra   r   r5  r   r   r   r   r  2  s    






r  c                      sL   e Zd ZU dZded< dd fddZdddZdddZ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, typing.Any]_stateNstatedict[str, typing.Any] | Nonec                   s   |d u ri }t  d| d S )Nr7  )r   __setattr__)r4   r8  r   r   r   r9     s   zState.__init__r6   r   r7   r   r    c                 C  s   || j |< d S r>   r7  r   r   r   r   r:    s   zState.__setattr__c                 C  s4   z| j | W S  ty   d}t|| jj|w )Nz!'{}' object has no attribute '{}')r7  r  AttributeErrorformatrT   r   )r4   r6   messager   r   r   __getattr__  s   zState.__getattr__c                 C  s   | j |= d S r>   r;  r   r   r   r   __delattr__  r   zState.__delattr__r>   )r8  r9  r   )r6   r   r   r   r   )
r   r   r   r   r   r9   r:  r?  r@  r   r   r   r   r   r6    s   
 

r6  )#
__future__r   r   r   urllib.parser   r   r   r   starlette.concurrencyr   starlette.typesr	   
NamedTupler
   TypeVarr   r   r   r   r~   r   Sequencer   r   r   Anyr`   r   r   Unionr  r   r  r6  r   r   r   r   <module>   s,    
 E8$":MW