o
    h-                     @  sv  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 ejrbd d	lmZ d d
l m!Z! d dl"m#Z# n&zzd d	lmZ W n e$yz   d d	l%mZ Y nw W n e$y   dZY nw 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-Z0dS )#    )annotationsN)cookies)AwaitableOrContextManager AwaitableOrContextManagerWrapper)URLAddressFormDataHeadersQueryParamsState)HTTPException)
FormParserMultiPartExceptionMultiPartParser)MessageReceiveScopeSend)parse_options_header)	Starlette)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,   f/var/www/html/construction_image-detection-poc/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/   B   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r4   )selfr4   r5   r,   r,   r-   __init__L   s   
zHTTPConnection.__init__r*   r   
typing.Anyc                 C  s
   | j | S Nr;   )r<   r*   r,   r,   r-   __getitem__P      
zHTTPConnection.__getitem__typing.Iterator[str]c                 C  
   t | jS r?   )iterr4   r<   r,   r,   r-   __iter__S   rA   zHTTPConnection.__iter__intc                 C  rC   r?   )lenr4   rE   r,   r,   r-   __len__V   rA   zHTTPConnection.__len__c                 C  s
   | j d S )Nappr;   rE   r,   r,   r-   rJ   _   s   
zHTTPConnection.appr   c                 C     t | dst| jd| _| jS )N_urlr;   )hasattrr   r4   rL   rE   r,   r,   r-   urlc      
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;   )rM   dictr4   getendswithr   rP   )r<   base_url_scoperQ   rT   r,   r,   r-   base_urli   s   


zHTTPConnection.base_urlr	   c                 C  rK   )N_headersr;   )rM   r	   r4   r\   rE   r,   r,   r-   headersz   rO   zHTTPConnection.headersr
   c                 C  s    t | dst| jd | _| jS )N_query_paramsrV   )rM   r
   r4   r^   rE   r,   r,   r-   query_params   s   
zHTTPConnection.query_paramsdict[str, typing.Any]c                 C  s   | j di S )Npath_params)r4   rX   rE   r,   r,   r-   ra      s   zHTTPConnection.path_paramsr   c                 C  s2   t | dsi }| jd}|rt|}|| _| jS )N_cookiescookie)rM   r]   rX   r.   rb   )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)r4   rX   r   )r<   	host_portr,   r,   r-   rf      s   zHTTPConnection.clientc                 C     d| j v s	J d| j d S )Nsessionz=SessionMiddleware must be installed to access request.sessionr;   rE   r,   r,   r-   ri         
zHTTPConnection.sessionc                 C  rh   )NauthzAAuthenticationMiddleware must be installed to access request.authr;   rE   r,   r,   r-   rk      rj   zHTTPConnection.authc                 C  rh   )NuserzAAuthenticationMiddleware must be installed to access request.userr;   rE   r,   r,   r-   rl      rj   zHTTPConnection.userr   c                 C  s.   t | ds| jdi  t| jd | _| jS )N_statestate)rM   r4   
setdefaultr   rm   rE   r,   r,   r-   rn      s   
zHTTPConnection.statenamera   c                K  sH   | j dp| j d}|d u rtd|j|fi |}|j| jdS )NrouterrJ   zVThe `url_for` method can only be used inside a Starlette application or with a router.)r[   )r4   rX   RuntimeErrorurl_path_formake_absolute_urlr[   )r<   rp   ra   url_path_providerurl_pathr,   r,   r-   url_for   s
   zHTTPConnection.url_forr?   )r4   r   r5   r6   r   r7   )r*   r   r   r>   )r   rB   )r   rG   r   r>   )r   r   )r   r	   )r   r
   )r   r`   )r   r   )r   re   )r   r   )rp   r   ra   r>   r   r   )r0   r1   r2   __doc__r=   r@   rF   rI   object__eq____hash__propertyrJ   rN   r[   r]   r_   ra   r   rf   ri   rk   rl   rn   rw   r,   r,   r,   r-   r3   F   sB    



	r3   typing.NoReturnc                     
   t d)Nz+Receive channel has not been made availablerr   r,   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d1 fd	d
Zed2ddZed3ddZ	d4ddZ
d5ddZd6ddZddddd7d#d$Zddddd8d&d'Zd9d)d*Zd:d,d-Zd;d/d0Z  ZS )<RequestzFormData | None_formr4   r   r5   r   sendr   c                   s>   t  | |d dksJ || _|| _d| _d| _d | _d S )Nr8   r9   F)superr=   _receive_send_stream_consumed_is_disconnectedr   )r<   r4   r5   r   	__class__r,   r-   r=      s   
zRequest.__init__r   r   c                 C  s   t t| jd S )Nmethod)typingcastr   r4   rE   r,   r,   r-   r      s   zRequest.methodc                 C  s   | j S r?   )r   rE   r,   r,   r-   r5      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_bodyrU   zStream consumedr8   zhttp.requestbody	more_bodyFThttp.disconnect)rM   r   r   rr   r   rX   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   rU   )rM   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)rM   r   jsonloadsr   )r<   r   r,   r,   r-   r      s
   
zRequest.jsoni  i   	max_files
max_fieldsmax_part_sizer   int | floatr   r   rG   r   c          
   
     s   | j d u rltd usJ d| jd}t|\}}|dkrQzt| j|  |||d}| I d H | _ W | j S  tyP } zd| jv rJt	d|j
d|d }~ww |dkrht| 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   rJ   i  )status_codedetails!   application/x-www-form-urlencoded)r   r   r]   rX   r   r   parser   r4   r   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,   r-   form  s   zRequest.formr7   c                   s$   | j d ur| j  I d H  d S d S r?   )r   closerE   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 )Nr8   r   T)r   anyioCancelScopecancelr   rX   )r<   r   csr,   r,   r-   is_disconnected.  s   
zRequest.is_disconnectedrT   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)r8   rT   r]   )r4   rX   SERVER_PUSH_HEADERS_TO_COPYr]   getlistr   encoder   )r<   rT   raw_headersrp   valuer,   r,   r-   send_push_promise<  s   zRequest.send_push_promise)r4   r   r5   r   r   r   )r   r   )r   r   )r   r   )r   r   rx   )r   r   r   r   r   rG   r   r   )r   r   r   r   r   rG   r   r   )r   r7   )r   r   )rT   r   r   r7   )r0   r1   r2   __annotations__r   r   r=   r}   r   r5   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~   )1
__future__r   r   r   r9   r   r&   r   starlette._utilsr   r   starlette.datastructuresr   r   r   r	   r
   r   starlette.exceptionsr   starlette.formparsersr   r   r   starlette.typesr   r   r   r   TYPE_CHECKINGpython_multipart.multipartr   starlette.applicationsr   starlette.routingr   ModuleNotFoundErrormultipart.multipartr   r.   	Exceptionr/   Mappingr   Anyr3   r   r   r   r,   r,   r,   r-   <module>   s>     
	
x
