o
    Þ­j+  ã                   @  s8  d dl mZ d dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
 d dl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 d dlmZmZmZmZ zd d	lmZ W n ey_   dZY nw ej rid d
l!m"Z" h d£Z#ddd„Z$G dd„ de%ƒZ&G dd„ dej'e(ej)f ƒZ*d dd„Z+d!dd„Z,G dd„ de*ƒZ-dS )"é    )ÚannotationsN)Úcookies)ÚAwaitableOrContextManagerÚ AwaitableOrContextManagerWrapper)ÚURLÚAddressÚFormDataÚHeadersÚQueryParamsÚState)ÚHTTPException)Ú
FormParserÚMultiPartExceptionÚMultiPartParser)ÚMessageÚReceiveÚScopeÚSend)Úparse_options_header)ÚRouter>   ú
user-agentúcache-controlúaccept-encodingúaccept-languageÚacceptÚcookie_stringÚstrÚreturnúdict[str, str]c                 C  sd   i }|   d¡D ](}d|v r|  dd¡\}}nd|}}| ¡ | ¡ }}|s(|r/t |¡||< q|S )a   
    This function parses a ``Cookie`` HTTP header into a dict of key/value pairs.

    It attempts to mimic browser cookie parsing behavior: browsers and web servers
    frequently disregard the spec (RFC 6265) when setting and reading cookies,
    so we attempt to suit the common scenarios here.

    This function has been adapted from Django 3.1.0.
    Note: we are explicitly _NOT_ using `SimpleCookie.load` because it is based
    on an outdated spec and will fail on lots of input we want to support
    ú;ú=é   Ú )ÚsplitÚstripÚhttp_cookiesÚ_unquote)r   Úcookie_dictÚchunkÚkeyÚval© r+   úO/var/www/html/CropPilot/venv/lib/python3.10/site-packages/starlette/requests.pyÚcookie_parser"   s   
€r-   c                   @  s   e Zd ZdS )ÚClientDisconnectN)Ú__name__Ú
__module__Ú__qualname__r+   r+   r+   r,   r.   =   s    r.   c                   @  sø   e Zd ZdZd9d:d	d
„Zd;dd„Zd<dd„Zd=dd„Zej	Z	ej
Z
ed>dd„ƒZed?dd„ƒZed?dd„ƒZed@dd„ƒZedAd!d"„ƒZedBd$d%„ƒZedCd'd(„ƒZedDd*d+„ƒZedBd,d-„ƒZed>d.d/„ƒZed>d0d1„ƒZedEd3d4„ƒZdFd7d8„ZdS )GÚHTTPConnectionz•
    A base class for incoming HTTP connections, that is used to provide
    any functionality that is common to both `Request` and `WebSocket`.
    NÚscoper   ÚreceiveúReceive | Noner   ÚNonec                 C  s   |d dv sJ ‚|| _ d S )NÚtype)ÚhttpÚ	websocket©r3   )Úselfr3   r4   r+   r+   r,   Ú__init__G   s   
zHTTPConnection.__init__r)   r   ú
typing.Anyc                 C  s
   | j | S ©Nr:   )r;   r)   r+   r+   r,   Ú__getitem__K   ó   
zHTTPConnection.__getitem__útyping.Iterator[str]c                 C  ó
   t | jƒS r>   )Úiterr3   ©r;   r+   r+   r,   Ú__iter__N   r@   zHTTPConnection.__iter__Úintc                 C  rB   r>   )Úlenr3   rD   r+   r+   r,   Ú__len__Q   r@   zHTTPConnection.__len__c                 C  s
   | j d S )NÚappr:   rD   r+   r+   r,   rI   Z   s   
zHTTPConnection.appr   c                 C  ó   t | dƒst| jd�| _| jS )NÚ_urlr:   )Úhasattrr   r3   rK   rD   r+   r+   r,   Úurl^   ó   
zHTTPConnection.urlc                 C  sh   t | dƒs1t| jƒ}| d| dd¡¡}|}| d¡s|d7 }||d< d|d< ||d< t|d	�| _| jS )
NÚ	_base_urlÚapp_root_pathÚ	root_pathr"   ú/Úpathó    Úquery_stringr:   )rL   Údictr3   ÚgetÚendswithr   rO   )r;   Úbase_url_scoperP   rS   r+   r+   r,   Úbase_urld   s   

ÿ
zHTTPConnection.base_urlr	   c                 C  rJ   )NÚ_headersr:   )rL   r	   r3   r[   rD   r+   r+   r,   Úheadersw   rN   zHTTPConnection.headersr
   c                 C  s    t | dƒst| jd ƒ| _| jS )NÚ_query_paramsrU   )rL   r
   r3   r]   rD   r+   r+   r,   Úquery_params}   s   
zHTTPConnection.query_paramsúdict[str, typing.Any]c                 C  s   | j  di ¡S )NÚpath_params)r3   rW   rD   r+   r+   r,   r`   ƒ   s   zHTTPConnection.path_paramsr   c                 C  s2   t | dƒsi }| j d¡}|rt|ƒ}|| _| jS )NÚ_cookiesÚcookie)rL   r\   rW   r-   ra   )r;   r   Úcookie_headerr+   r+   r,   r   ‡   s   
zHTTPConnection.cookiesúAddress | Nonec                 C  s    | j  d¡}|d urt|Ž S d S )NÚclient)r3   rW   r   )r;   Ú	host_portr+   r+   r,   re   ’   s   zHTTPConnection.clientc                 C  ó   d| j v s	J dƒ‚| j d S )NÚsessionz=SessionMiddleware must be installed to access request.sessionr:   rD   r+   r+   r,   rh   š   ó   ÿ
zHTTPConnection.sessionc                 C  rg   )NÚauthzAAuthenticationMiddleware must be installed to access request.authr:   rD   r+   r+   r,   rj   ¡   ri   zHTTPConnection.authc                 C  rg   )NÚuserzAAuthenticationMiddleware must be installed to access request.userr:   rD   r+   r+   r,   rk   ¨   ri   zHTTPConnection.userr   c                 C  s.   t | dƒs| j di ¡ t| jd ƒ| _| jS )NÚ_stateÚstate)rL   r3   Ú
setdefaultr   rl   rD   r+   r+   r,   rm   ¯   s   
zHTTPConnection.stateÚnamer`   c                K  s*   | j d }|j|fi |¤Ž}|j| jd�S )NÚrouter)rZ   )r3   Úurl_path_forÚmake_absolute_urlrZ   )r;   ro   r`   rp   Úurl_pathr+   r+   r,   Úurl_for¹   s   
zHTTPConnection.url_forr>   )r3   r   r4   r5   r   r6   )r)   r   r   r=   )r   rA   )r   rF   ©r   r=   )r   r   )r   r	   )r   r
   )r   r_   )r   r   )r   rd   )r   r   )ro   r   r`   r=   r   r   )r/   r0   r1   Ú__doc__r<   r?   rE   rH   ÚobjectÚ__eq__Ú__hash__ÚpropertyrI   rM   rZ   r\   r^   r`   r   re   rh   rj   rk   rm   rt   r+   r+   r+   r,   r2   A   sB    



	r2   útyping.NoReturnc                   Ã  ó
   �t dƒ‚)Nz+Receive channel has not been made available©ÚRuntimeErrorr+   r+   r+   r,   Úempty_receive¿   ó   €r   Úmessager   c                 Ã  r|   )Nz(Send channel has not been made availabler}   )r�   r+   r+   r,   Ú
empty_sendÃ   r€   r‚   c                      sª   e Zd ZU ded< eefd.‡ fd	d
„Zed/dd„ƒZed0dd„ƒZ	d1dd„Z
d2dd„Zd3dd„Zdddœd4d d!„Zdddœd5d#d$„Zd6d&d'„Zd7d)d*„Zd8d,d-„Z‡  ZS )9ÚRequestzFormData | NoneÚ_formr3   r   r4   r   Úsendr   c                   s>   t ƒ  |¡ |d dksJ ‚|| _|| _d| _d| _d | _d S )Nr7   r8   F)Úsuperr<   Ú_receiveÚ_sendÚ_stream_consumedÚ_is_disconnectedr„   )r;   r3   r4   r…   ©Ú	__class__r+   r,   r<   Ê   s   
zRequest.__init__r   r   c                 C  s   t  t| jd ¡S )NÚmethod)ÚtypingÚcastr   r3   rD   r+   r+   r,   r�   Õ   s   zRequest.methodc                 C  s   | j S r>   )r‡   rD   r+   r+   r,   r4   Ù   s   zRequest.receiveú"typing.AsyncGenerator[bytes, None]c                 C sž   �t | dƒr| jV  dV  d S | jrtdƒ‚| jsJ|  ¡ I d H }|d dkr;| dd¡}| dd¡s5d	| _|r:|V  n|d d
krGd	| _tƒ ‚| jrdV  d S )NÚ_bodyrT   zStream consumedr7   zhttp.requestÚbodyÚ	more_bodyFTúhttp.disconnect)rL   r‘   r‰   r~   r‡   rW   rŠ   r.   )r;   r�   r’   r+   r+   r,   ÚstreamÝ   s*   €
€ö
zRequest.streamÚbytesc                 Ã  sD   �t | dƒsg }|  ¡ 2 z3 d H W }| |¡ q6 d |¡| _| jS )Nr‘   rT   )rL   r•   ÚappendÚjoinr‘   )r;   Úchunksr(   r+   r+   r,   r’   ñ   s   €
ÿzRequest.bodyr=   c                 Ã  s,   �t | dƒs|  ¡ I d H }t |¡| _| jS )NÚ_json)rL   r’   ÚjsonÚloadsrš   )r;   r’   r+   r+   r,   r›   ù   s
   €
zRequest.jsoniè  ©Ú	max_filesÚ
max_fieldsrž   úint | floatrŸ   r   c          	   
   Ã  sÜ   �| j d u rktd usJ dƒ‚| j d¡}t|ƒ\}}|dkrPzt| j|  ¡ ||d�}| ¡ I d H | _ W | j S  tyO } zd| jv rIt	d|j
d�‚|‚d }~ww |dkrgt| j|  ¡ ƒ}| ¡ I d H | _ | j S tƒ | _ | j S )	NzEThe `python-multipart` library must be installed to use form parsing.zContent-Types   multipart/form-datar�   rI   i�  )Ústatus_codeÚdetails!   application/x-www-form-urlencoded)r„   r   r\   rW   r   r•   Úparser   r3   r   r�   r   r   )	r;   rž   rŸ   Úcontent_type_headerÚcontent_typeÚ_Úmultipart_parserÚexcÚform_parserr+   r+   r,   Ú	_get_formÿ   s:   €

ÿü
÷
€ýÿzRequest._get_formú#AwaitableOrContextManager[FormData]c                C  s   t | j||d�ƒS )Nr�   )r   rª   )r;   rž   rŸ   r+   r+   r,   Úform  s   ÿzRequest.formr6   c                 Ã  s$   �| j d ur| j  ¡ I d H  d S d S r>   )r„   ÚcloserD   r+   r+   r,   r­   $  s   €
ÿzRequest.closeÚboolc                 Ã  sd   �| j s/i }t ¡ �}| ¡  |  ¡ I d H }W d   ƒ n1 s w   Y  | d¡dkr/d| _ | j S )Nr7   r”   T)rŠ   ÚanyioÚCancelScopeÚcancelr‡   rW   )r;   r�   Úcsr+   r+   r,   Úis_disconnected(  s   €
þzRequest.is_disconnectedrS   c                 Ã  sn   �d| j  di ¡v r5g }tD ]}| j |¡D ]}| | d¡| d¡f¡ qq|  d||dœ¡I d H  d S d S )Nzhttp.response.pushÚ
extensionszlatin-1)r7   rS   r\   )r3   rW   ÚSERVER_PUSH_HEADERS_TO_COPYr\   Úgetlistr—   Úencoderˆ   )r;   rS   Úraw_headersro   Úvaluer+   r+   r,   Úsend_push_promise6  s   €ÿÿ
ÿùzRequest.send_push_promise)r3   r   r4   r   r…   r   )r   r   )r   r   )r   r�   )r   r–   ru   )rž   r    rŸ   r    r   r   )rž   r    rŸ   r    r   r«   )r   r6   )r   r®   )rS   r   r   r6   )r/   r0   r1   Ú__annotations__r   r‚   r<   rz   r�   r4   r•   r’   r›   rª   r¬   r­   r³   rº   Ú__classcell__r+   r+   r‹   r,   rƒ   Ç   s$   
 ÿ


ÿÿ

rƒ   )r   r   r   r   )r   r{   )r�   r   r   r{   ).Ú
__future__r   r›   rŽ   r8   r   r%   r¯   Ústarlette._utilsr   r   Ústarlette.datastructuresr   r   r   r	   r
   r   Ústarlette.exceptionsr   Ústarlette.formparsersr   r   r   Ústarlette.typesr   r   r   r   Úmultipart.multipartr   ÚModuleNotFoundErrorÚTYPE_CHECKINGÚstarlette.routingr   rµ   r-   Ú	Exceptionr.   ÚMappingr   ÚAnyr2   r   r‚   rƒ   r+   r+   r+   r,   Ú<module>   s0     ÿ
	
~
