U
    nËj>W  ã                   @  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   ú</tmp/pip-unpacked-wheel-pzfrzqh9/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 | Noneú
typing.AnyÚNone)ÚurlÚscopeÚ
componentsÚreturnc                 K  s>  |d k	�r
|rt dƒ‚|r"t dƒ‚| dd¡}| dd ¡}|d }| dd¡}d }|d	 D ]\}	}
|	d
krZ|
 d¡} qzqZ|d k	r–|› d|› |› �}n\|d kr¤|}nN|\}}dddddœ| }||krÚ|› d|› |› �}n|› d|› d|› |› �}|�r4|d| ¡  7 }n*|�r4|�rt dƒ‚tdƒjf |Ž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   )ÚAssertionErrorÚgetÚdecoder   Úreplacer   ÚgeturlÚ_url)Úselfr   r   r   r    r"   r#   r$   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   r3   r:   ©r4   r   r   r   r   @   s    
zURL.componentsc                 C  s   | j jS ©N)r   r    r<   r   r   r   r    F   s    z
URL.schemec                 C  s   | j jS r=   )r   Únetlocr<   r   r   r   r>   J   s    z
URL.netlocc                 C  s   | j jS r=   )r   r#   r<   r   r   r   r#   N   s    zURL.pathc                 C  s   | j jS r=   )r   Úqueryr<   r   r   r   r?   R   s    z	URL.queryc                 C  s   | j jS r=   )r   Úfragmentr<   r   r   r   r@   V   s    zURL.fragmentz
None | strc                 C  s   | j jS r=   )r   Úusernamer<   r   r   r   rA   Z   s    zURL.usernamec                 C  s   | j jS r=   )r   Úpasswordr<   r   r   r   rB   ^   s    zURL.passwordc                 C  s   | j jS r=   )r   Úhostnamer<   r   r   r   rC   b   s    zURL.hostnameú
int | Nonec                 C  s   | j jS r=   )r   r   r<   r   r   r   r   f   s    zURL.portÚboolc                 C  s
   | j dkS )N)r)   r+   )r    r<   r   r   r   Ú	is_securej   s    zURL.is_secure)Úkwargsr   c           
      K  sþ   d|ks d|ks d|ks d|krâ|  dd ¡}|  d| j¡}|  d| j¡}|  d| j¡}|d kr�| j}| d¡\}}}|d dkr�| dd	¡d
 }|}|d k	rª|d|› �7 }|d k	rÚ|}|d k	rÌ|d|› �7 }|› d|› �}||d< | jjf |Ž}	|  	|	 
¡ ¡S )NrA   rB   rC   r   ú@éÿÿÿÿú]r,   é   r   r>   )Úpopr   rA   rB   r>   Ú
rpartitionÚrsplitr   Ú_replaceÚ	__class__r2   )
r4   rG   rC   r   rA   rB   r>   Ú_Z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  s   i | ]\}}t |ƒt |ƒ“qS r   ©r   ©Ú.0r5   r6   r   r   r   Ú
<dictcomp>Œ   s      z,URL.include_query_params.<locals>.<dictcomp>©r?   )Ú	MultiDictr   r?   ÚupdateÚitemsr   Úmulti_itemsr1   )r4   rG   Úparamsr?   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   rT   rU   r   r   r   Ú
<listcomp>‘   s     z,URL.replace_query_params.<locals>.<listcomp>rX   )r   r[   r1   )r4   rG   r?   r   r   r   Úreplace_query_params�   s    zURL.replace_query_paramsústr | typing.Sequence[str])Úkeysr   c                 C  sP   t |tƒr|g}tt| jdd�ƒ}|D ]}| |d ¡ q&t| ¡ ƒ}| j|d�S )NTrR   rX   )	Ú
isinstancer   rY   r   r?   rL   r   r\   r1   )r4   rb   r]   r5   r?   r   r   r   Úremove_query_params”   s    
zURL.remove_query_params©Úotherr   c                 C  s   t | ƒt |ƒkS r=   rT   ©r4   rf   r   r   r   Ú__eq__�   s    z
URL.__eq__c                 C  s   | j S r=   )r3   r<   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********)rB   ú(ú))r   rB   r1   rP   r   Úrepr)r4   r   r   r   r   Ú__repr__£   s    zURL.__repr__)r   N)r   r   r   r8   Úpropertyr   r    r>   r#   r?   r@   rA   rB   rC   r   rF   r1   r^   r`   rd   rh   ri   rm   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   )r#   Úprotocolr   r   c                 C  s   |dkst ‚t | |¡S )N)r!   Ú	websocketr   )r.   r   Ú__new__)Úclsr#   rp   r   r   r   r   rr   °   s    zURLPath.__new__r   c                 C  s   || _ || _d S r=   )rp   r   )r4   r#   rp   r   r   r   r   r8   ´   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 )	Nr)   r!   )TFr+   r*   )r!   rq   ú/)r    r>   r#   )
rc   r   r   rp   rF   r    r   r>   r#   Úrstrip)r4   rt   r    r>   r#   r   r   r   Úmake_absolute_url¸   s    
þýýzURLPath.make_absolute_urlN)r   r   )r   r   )r   r   r   Ú__doc__rr   r8   rw   r   r   r   r   ro   ª   s   ro   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   ©r6   c                 C  s
   || _ d S r=   ©Ú_value©r4   r6   r   r   r   r8   Î   s    zSecret.__init__r9   c                 C  s   | j j}|› d�S )Nz('**********')©rP   r   )r4   Ú
class_namer   r   r   rm   Ñ   s    zSecret.__repr__c                 C  s   | j S r=   r{   r<   r   r   r   ri   Õ   s    zSecret.__str__rE   c                 C  s
   t | jƒS r=   )rE   r|   r<   r   r   r   Ú__bool__Ø   s    zSecret.__bool__N)r   r   r   rx   r8   rm   ri   r€   r   r   r   r   ry   È   s
   ry   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 )ÚCommaSeparatedStringsra   rz   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©rV   Úitemr   r   r   r_   â   s     z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)rc   r   r   Ú
whitespaceÚwhitespace_splitÚ_itemsÚlist)r4   r6   Zsplitterr   r   r   r8   Ý   s    
zCommaSeparatedStrings.__init__r   r9   c                 C  s
   t | jƒS r=   )Úlenr‰   r<   r   r   r   Ú__len__æ   s    zCommaSeparatedStrings.__len__zint | slicer   )Úindexr   c                 C  s
   | j | S r=   )r‰   )r4   r�   r   r   r   Ú__getitem__é   s    z!CommaSeparatedStrings.__getitem__ztyping.Iterator[str]c                 C  s
   t | jƒS r=   )Úiterr‰   r<   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   r_   ñ   s     z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>rj   rk   r~   ©r4   r   r[   r   r   r   rm   ï   s    zCommaSeparatedStrings.__repr__c                 C  s   d  dd„ | D ƒ¡S )Nú, c                 s  s   | ]}t |ƒV  qd S r=   )rl   r…   r   r   r   Ú	<genexpr>õ   s     z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)Újoinr<   r   r   r   ri   ô   s    zCommaSeparatedStrings.__str__N)	r   r   r   r8   rŒ   rŽ   r�   rm   ri   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]Ú_dictz™ImmutableMultiDict[_KeyType, _CovariantValueType] | typing.Mapping[_KeyType, _CovariantValueType] | typing.Iterable[tuple[_KeyType, _CovariantValueType]]r   r   ©ÚargsrG   r   c                 O  sÒ   t |ƒdk stdƒ‚|r |d ng }|r@t|ƒ ¡ t|ƒ ¡  }|sJg }nnt|dƒrvt tttf |¡}t	| ¡ ƒ}nBt|dƒr¤t tj
ttf |¡}t	| ¡ ƒ}nt d|¡}t	|ƒ}dd„ |D ƒ| _|| _d S )	Né   úToo many arguments.r   r\   r[   z#list[tuple[typing.Any, typing.Any]]c                 S  s   i | ]\}}||“qS r   r   ©rV   ÚkÚvr   r   r   rW     s      z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r‹   r.   r•   r\   r;   ÚtypingÚcastr   r   rŠ   ÚMappingr[   r–   Ú_list)r4   r˜   rG   r6   r‰   r   r   r   r8   û   s     

zImmutableMultiDict.__init__zlist[_CovariantValueType]©r5   r   c                   s   ‡ fdd„| j D ƒS )Nc                   s   g | ]\}}|ˆ kr|‘qS r   r   ©rV   Úitem_keyÚ
item_value©r5   r   r   r_     s      z.ImmutableMultiDict.getlist.<locals>.<listcomp>©r¡   ©r4   r5   r   r¦   r   Úgetlist  s    zImmutableMultiDict.getlistztyping.KeysView[_KeyType]r9   c                 C  s
   | j  ¡ S r=   )r–   rb   r<   r   r   r   rb     s    zImmutableMultiDict.keysz&typing.ValuesView[_CovariantValueType]c                 C  s
   | j  ¡ S r=   )r–   Úvaluesr<   r   r   r   rª     s    zImmutableMultiDict.valuesz/typing.ItemsView[_KeyType, _CovariantValueType]c                 C  s
   | j  ¡ S r=   )r–   r[   r<   r   r   r   r[      s    zImmutableMultiDict.itemsz*list[tuple[_KeyType, _CovariantValueType]]c                 C  s
   t | jƒS r=   ©rŠ   r¡   r<   r   r   r   r\   #  s    zImmutableMultiDict.multi_itemsr   r   c                 C  s
   | j | S r=   ©r–   r¨   r   r   r   rŽ   &  s    zImmutableMultiDict.__getitem__rE   c                 C  s
   || j kS r=   r¬   r¨   r   r   r   Ú__contains__)  s    zImmutableMultiDict.__contains__ztyping.Iterator[_KeyType]c                 C  s   t |  ¡ ƒS r=   ©r�   rb   r<   r   r   r   r�   ,  s    zImmutableMultiDict.__iter__r   c                 C  s
   t | jƒS r=   )r‹   r–   r<   r   r   r   rŒ   /  s    zImmutableMultiDict.__len__re   c                 C  s$   t || jƒsdS t| jƒt|jƒkS ©NF)rc   rP   Úsortedr¡   rg   r   r   r   rh   2  s    zImmutableMultiDict.__eq__r   c                 C  s    | j j}|  ¡ }|› d|›d�S ©Nrj   rk   )rP   r   r\   r‘   r   r   r   rm   7  s    zImmutableMultiDict.__repr__N)r   r   r   r   r8   r©   rb   rª   r[   r\   rŽ   r­   r�   rŒ   rh   rm   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 )#rY   r   r   ©r5   r6   r   c                 C  s   |   ||g¡ d S r=   )Úsetlist©r4   r5   r6   r   r   r   Ú__setitem__>  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   r_   B  s      z)MultiDict.__delitem__.<locals>.<listcomp>)r¡   r–   r¨   r   r¦   r   Ú__delitem__A  s    zMultiDict.__delitem__N)r5   Údefaultr   c                   s$   ‡ fdd„| j D ƒ| _ | j ˆ |¡S )Nc                   s    g | ]\}}|ˆ kr||f‘qS r   r   r›   r¦   r   r   r_   F  s      z!MultiDict.pop.<locals>.<listcomp>)r¡   r–   rL   ©r4   r5   r·   r   r¦   r   rL   E  s    zMultiDict.popztuple[typing.Any, typing.Any]r9   c                   s,   | j  ¡ \‰ }‡ fdd„| jD ƒ| _ˆ |fS )Nc                   s    g | ]\}}|ˆ kr||f‘qS r   r   r›   r¦   r   r   r_   K  s      z%MultiDict.popitem.<locals>.<listcomp>)r–   Úpopitemr¡   r}   r   r¦   r   r¹   I  s    zMultiDict.popitemzlist[typing.Any]c                   s"   ‡ fdd„| j D ƒ}|  ˆ ¡ |S )Nc                   s   g | ]\}}|ˆ kr|‘qS r   r   r›   r¦   r   r   r_   O  s      z%MultiDict.poplist.<locals>.<listcomp>)r¡   rL   )r4   r5   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*   || kr"|| j |< | j ||f¡ | | S r=   )r–   r¡   Úappendr¸   r   r   r   Ú
setdefaultW  s    
zMultiDict.setdefault)r5   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   r_   b  s      z%MultiDict.setlist.<locals>.<listcomp>c                   s   g | ]}ˆ |f‘qS r   r   )rV   r6   r¦   r   r   r_   c  s     rI   )rL   r¡   r–   )r4   r5   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.appendzXMultiDict | typing.Mapping[typing.Any, typing.Any] | list[tuple[typing.Any, typing.Any]]r—   c                   s<   t ||Ž‰ ‡ fdd„| jD ƒ}|ˆ  ¡  | _| j ˆ ¡ d S )Nc                   s$   g | ]\}}|ˆ   ¡ kr||f‘qS r   )rb   r›   rz   r   r   r_   p  s      z$MultiDict.update.<locals>.<listcomp>)rY   r¡   r\   r–   rZ   )r4   r˜   rG   r¾   r   rz   r   rZ   j  s    
zMultiDict.update)N)N)r   r   r   rµ   r¶   rL   r¹   rº   r»   r½   r³   r¼   rZ   r   r   r   r   rY   =  s   rY   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.
    z‡ImmutableMultiDict[typing.Any, typing.Any] | typing.Mapping[typing.Any, typing.Any] | list[tuple[typing.Any, typing.Any]] | str | bytesr   r   r—   c                   s¬   t |ƒdk stdƒ‚|r |d ng }t|tƒrHtƒ jt|dd�f|Ž n8t|tƒrrtƒ jt| d¡dd�f|Ž ntƒ j||Ž dd„ | j	D ƒ| _	d	d
„ | j
 ¡ D ƒ| _
d S )Nr™   rš   r   TrR   r'   c                 S  s    g | ]\}}t |ƒt |ƒf‘qS r   rT   r›   r   r   r   r_   �  s     z(QueryParams.__init__.<locals>.<listcomp>c                 S  s   i | ]\}}t |ƒt |ƒ“qS r   rT   r›   r   r   r   rW   Ž  s      z(QueryParams.__init__.<locals>.<dictcomp>)r‹   r.   rc   r   Úsuperr8   r   Úbytesr0   r¡   r–   r[   )r4   r˜   rG   r6   ©rP   r   r   r8   z  s    	

 zQueryParams.__init__r   r9   c                 C  s
   t | jƒS r=   )r   r¡   r<   r   r   r   ri   �  s    zQueryParams.__str__c                 C  s    | j j}t| ƒ}|› d|›d�S r±   )rP   r   r   )r4   r   r$   r   r   r   rm   “  s    zQueryParams.__repr__)r   r   r   rx   r8   ri   rm   Ú__classcell__r   r   rÂ   r   r¿   u  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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Úfilenamer&   ztyping.BinaryIOrD   z
str | NonezHeaders | Noner   )ÚfilerÅ   rÆ   r&   r   c                C  s"   || _ || _|| _|ptƒ | _d S r=   )rÆ   rÇ   rÅ   ÚHeadersr&   )r4   rÇ   rÅ   rÆ   r&   r   r   r   r8   ž  s    zUploadFile.__init__r9   c                 C  s   | j  dd ¡S )Nzcontent-type)r&   r/   r<   r   r   r   Úcontent_type«  s    zUploadFile.content_typerE   c                 C  s   t | jddƒ}| S )NÚ_rolledT)ÚgetattrrÇ   )r4   Zrolled_to_diskr   r   r   Ú
_in_memory¯  s    zUploadFile._in_memoryrÁ   )Údatar   c                 Ã  sH   | j d k	r|  j t|ƒ7  _ | jr0| j |¡ nt| jj|ƒI d H  d S r=   )rÅ   r‹   rÌ   rÇ   Úwriter   )r4   rÍ   r   r   r   rÎ   µ  s
    
zUploadFile.writerI   r   )rÅ   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)Úoffsetr   c                 Ã  s,   | j r| j |¡ n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 ¡  n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=rk   )rP   r   rÆ   rÅ   r&   r<   r   r   r   rm   Ï  s    $ÿzUploadFile.__repr__)rI   )r   r   r   rx   r8   rn   rÉ   rÌ   rÎ   rÏ   rÑ   rÒ   rm   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.
    zUFormData | typing.Mapping[str, str | UploadFile] | list[tuple[str, str | UploadFile]]zstr | UploadFiler   r—   c                   s   t ƒ j||Ž d S r=   )rÀ   r8   )r4   r˜   rG   rÂ   r   r   r8   Ý  s    zFormData.__init__r9   c                 Ã  s.   |   ¡ D ] \}}t|tƒr| ¡ I d H  qd S r=   )r\   rc   rÄ   rÒ   r´   r   r   r   rÒ   ä  s    
zFormData.close)r   r   r   rx   r8   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typing.Mapping[str, str] | Nonez list[tuple[bytes, bytes]] | Nonez-typing.MutableMapping[str, typing.Any] | Noner   )r&   Úrawr   r   c                 C  s†   g | _ |d k	rD|d kstdƒ‚|d ks.tdƒ‚dd„ | ¡ D ƒ| _ n>|d k	rd|d ks\tdƒ‚|| _ n|d k	r‚t|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 ©r'   )ÚlowerÚencoderU   r   r   r   r_   ù  s     z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r&   )r¡   r.   r[   rŠ   )r4   r&   rÔ   r   r   r   r   r8   ï  s    zHeaders.__init__úlist[tuple[bytes, bytes]]r9   c                 C  s
   t | jƒS r=   r«   r<   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Õ   ©r0   rU   r   r   r   r_     s     z Headers.keys.<locals>.<listcomp>r§   r<   r   r   r   rb     s    zHeaders.keysc                 C  s   dd„ | j D ƒS )Nc                 S  s   g | ]\}}|  d ¡‘qS rÕ   rÙ   rU   r   r   r   r_   
  s     z"Headers.values.<locals>.<listcomp>r§   r<   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Ù   rU   r   r   r   r_     s     z!Headers.items.<locals>.<listcomp>r§   r<   r   r   r   r[     s    zHeaders.itemsr   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   r_     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  s    zHeaders.mutablecopyc                 C  s@   |  ¡  d¡}| jD ]\}}||kr| d¡  S qt|ƒ‚d S )Nr'   )rÖ   r×   r¡   r0   ÚKeyError©r4   r5   rÛ   Z
header_keyÚheader_valuer   r   r   rŽ     s
    zHeaders.__getitem__r   rE   c                 C  s0   |  ¡  d¡}| jD ]\}}||kr dS qdS )Nr'   TFrÜ   rà   r   r   r   r­     s
    zHeaders.__contains__ztyping.Iterator[typing.Any]c                 C  s   t |  ¡ ƒS r=   r®   r<   r   r   r   r�   $  s    zHeaders.__iter__r   c                 C  s
   t | jƒS r=   )r‹   r¡   r<   r   r   r   rŒ   '  s    zHeaders.__len__re   c                 C  s"   t |tƒsdS t| jƒt|jƒkS r¯   )rc   rÈ   r°   r¡   rg   r   r   r   rh   *  s    
zHeaders.__eq__c                 C  sF   | j j}t|  ¡ ƒ}t|ƒt| ƒkr4|› d|›d�S |› d| j›d�S )Nrj   rk   z(raw=)rP   r   Údictr[   r‹   rÔ   )r4   r   Zas_dictr   r   r   rm   /  s
    zHeaders.__repr__)NNN)r   r   r   rx   r8   rn   rÔ   rb   rª   r[   r©   rÞ   rŽ   r­   r�   rŒ   rh   rm   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.
        r'   rK   Nr   ©rÖ   r×   Ú	enumerater¡   r¼   Úreversed)	r4   r5   r6   Úset_keyÚ	set_valueZfound_indexesÚidxr¤   r¥   r   r   r   rµ   8  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`.
        r'   Nrã   )r4   r5   Zdel_keyZpop_indexesrè   r¤   r¥   r   r   r   r¶   N  s    zMutableHeaders.__delitem__ztyping.Mapping[str, str]re   c                 C  s,   t |tjƒstd|jj› �ƒ‚|  |¡ | S ©NzExpected a mapping but got )rc   rž   r    Ú	TypeErrorrP   r   rZ   rg   r   r   r   Ú__ior__\  s    
zMutableHeaders.__ior__c                 C  s4   t |tjƒstd|jj› �ƒ‚|  ¡ }| |¡ |S ré   )rc   rž   r    rê   rP   r   rÞ   rZ   )r4   rf   Únewr   r   r   Ú__or__b  s
    
zMutableHeaders.__or__rØ   r9   c                 C  s   | j S r=   r§   r<   r   r   r   rÔ   i  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   r5   r6   ræ   rç   rè   r¤   r¥   r   r   r   r½   m  s    
zMutableHeaders.setdefaultc                 C  s   |  ¡ D ]\}}|| |< qd S r=   )r[   )r4   rf   r5   Úvalr   r   r   rZ   {  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   r5   r6   Z
append_keyZappend_valuer   r   r   r¼     s    
zMutableHeaders.append)Úvaryr   c                 C  s,   |   d¡}|d k	r d ||g¡}|| d< d S )Nrï   r’   )r/   r”   )r4   rï   Úexistingr   r   r   Úadd_vary_header‡  s    
zMutableHeaders.add_vary_headerN)r   r   r   rµ   r¶   rë   rí   rn   rÔ   r½   rZ   r¼   rñ   r   r   r   r   rÝ   7  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, typing.Any]Ú_stateNzdict[str, typing.Any] | None)Ústatec                   s   |d kri }t ƒ  d|¡ d S )Nró   )rÀ   Ú__setattr__)r4   rô   rÂ   r   r   r8   —  s    zState.__init__r   r   r²   c                 C  s   || j |< d S r=   ©ró   r´   r   r   r   rõ   œ  s    zState.__setattr__r¢   c                 C  s>   z| j | W S  tk
r8   d}t| | jj|¡ƒ‚Y nX d S )Nz!'{}' object has no attribute '{}')ró   rß   ÚAttributeErrorÚformatrP   r   )r4   r5   Úmessager   r   r   Ú__getattr__Ÿ  s
    zState.__getattr__c                 C  s   | j |= d S r=   rö   r¨   r   r   r   Ú__delattr__¦  s    zState.__delattr__)N)
r   r   r   rx   r   r8   rõ   rú   rû   rÃ   r   r   rÂ   r   rò   Ž  s   
rò   )#Ú
__future__r   rž   r   Úurllib.parser   r   r   r   Zstarlette.concurrencyr   Zstarlette.typesr	   Ú
NamedTupler
   ÚTypeVarr   r   r   r   ro   ry   ÚSequencer�   r    r•   ÚAnyrY   r¿   rÄ   ÚUnionrÓ   rÈ   rÝ   rò   r   r   r   r   Ú<module>   s*   
 E8$?"MW