a
    ^g-                     @  s  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rd d	lmZ d d
l m!Z! d dl"m#Z# nNz4zd d	lmZ W n e$y   d d	l%mZ Y n0 W n e$y   dZY n0 h dZ&dddddZ'G dd de(Z)G dd dej*e+ej,f Z-ddddZ.dd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>   z
user-agentzcache-controlacceptzaccept-languagezaccept-encodingstrdict[str, str])cookie_stringreturnc                 C  sd   i }|  dD ]P}d|v r,| dd\}}n
d| }}| |  }}|sP|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(   `/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/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                   @  sF  e Zd ZdZd7ddddddZd	d
dddZddddZddddZej	Z	ej
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/d0Zed1dd2d3Zd	d
dd4d5d6ZdS )8HTTPConnectionz
    A base class for incoming HTTP connections, that is used to provide
    any functionality that is common to both `Request` and `WebSocket`.
    Nr   zReceive | NoneNone)scopereceiver   c                 C  s   |d dv sJ || _ d S )Ntype)httpZ	websocketr1   )selfr1   r2   r(   r(   r)   __init__L   s    zHTTPConnection.__init__r   
typing.Any)r&   r   c                 C  s
   | j | S Nr5   )r6   r&   r(   r(   r)   __getitem__P   s    zHTTPConnection.__getitem__ztyping.Iterator[str]r   c                 C  s
   t | jS r9   )iterr1   r6   r(   r(   r)   __iter__S   s    zHTTPConnection.__iter__intc                 C  s
   t | jS r9   )lenr1   r=   r(   r(   r)   __len__V   s    zHTTPConnection.__len__c                 C  s
   | j d S )Nappr5   r=   r(   r(   r)   rB   _   s    zHTTPConnection.appr   c                 C  s   t | dst| jd| _| jS )N_urlr5   )hasattrr   r1   rC   r=   r(   r(   r)   urlc   s    
zHTTPConnection.urlc                 C  sh   t | dsbt| 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_stringr5   )rD   dictr1   getendswithr   rF   )r6   Zbase_url_scoperG   rJ   r(   r(   r)   base_urli   s    


zHTTPConnection.base_urlr	   c                 C  s   t | dst| jd| _| jS )N_headersr5   )rD   r	   r1   rQ   r=   r(   r(   r)   headersz   s    
zHTTPConnection.headersr
   c                 C  s    t | dst| jd | _| jS )N_query_paramsrL   )rD   r
   r1   rS   r=   r(   r(   r)   query_params   s    
zHTTPConnection.query_paramszdict[str, typing.Any]c                 C  s   | j di S )Npath_params)r1   rN   r=   r(   r(   r)   rU      s    zHTTPConnection.path_paramsr   c                 C  s2   t | ds,i }| jd}|r&t|}|| _| jS )N_cookiescookie)rD   rR   rN   r*   rV   )r6   r   cookie_headerr(   r(   r)   r      s    
zHTTPConnection.cookieszAddress | Nonec                 C  s    | j d}|d urt| S d S )Nclient)r1   rN   r   )r6   	host_portr(   r(   r)   rY      s    zHTTPConnection.clientc                 C  s   d| j v sJ d| j d S )Nsessionz=SessionMiddleware must be installed to access request.sessionr5   r=   r(   r(   r)   r[      s    zHTTPConnection.sessionc                 C  s   d| j v sJ d| j d S )NauthzAAuthenticationMiddleware must be installed to access request.authr5   r=   r(   r(   r)   r\      s    zHTTPConnection.authc                 C  s   d| j v sJ d| j d S )NuserzAAuthenticationMiddleware must be installed to access request.userr5   r=   r(   r(   r)   r]      s    zHTTPConnection.userr   c                 C  s.   t | ds(| jdi  t| jd | _| jS )N_statestate)rD   r1   
setdefaultr   r^   r=   r(   r(   r)   r_      s    
zHTTPConnection.state)namerU   r   c                K  sH   | j dp| j d}|d u r(td|j|fi |}|j| jdS )NZrouterrB   zVThe `url_for` method can only be used inside a Starlette application or with a router.)rP   )r1   rN   RuntimeErrorZurl_path_forZmake_absolute_urlrP   )r6   ra   rU   Zurl_path_providerZurl_pathr(   r(   r)   url_for   s
    zHTTPConnection.url_for)N)r,   r-   r.   __doc__r7   r:   r>   rA   object__eq____hash__propertyrB   rE   rP   rR   rT   rU   r   rY   r[   r\   r]   r_   rc   r(   r(   r(   r)   r/   F   s@   
	r/   ztyping.NoReturnr;   c                     s   t dd S )Nz+Receive channel has not been made availablerb   r(   r(   r(   r)   empty_receive   s    rj   r   )messager   c                   s   t dd S )Nz(Send channel has not been made availableri   )rk   r(   r(   r)   
empty_send   s    rl   c                      s   e Zd ZU ded< eefdddd fddZe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dddddd Zdddddddd!dd"d#Zd$d
d%d&Zd'd
d(d)Zd	d$d*d+d,Z  ZS )-RequestzFormData | None_formr   r   r   )r1   r2   sendc                   s>   t  | |d dksJ || _|| _d| _d| _d | _d S )Nr3   r4   F)superr7   _receive_send_stream_consumed_is_disconnectedrn   )r6   r1   r2   ro   	__class__r(   r)   r7      s    zRequest.__init__r   r;   c                 C  s   t t| jd S )Nmethod)typingcastr   r1   r=   r(   r(   r)   rw      s    zRequest.methodc                 C  s   | j S r9   )rq   r=   r(   r(   r)   r2      s    zRequest.receivez"typing.AsyncGenerator[bytes, None]c                 C s   t | dr| jV  dV  d S | jr*td| js|  I d H }|d dkrt|dd}|ddshd	| _|r|V  q*|d d
kr*d	| _t q*dV  d S )N_bodyrK   zStream consumedr3   zhttp.requestbodyZ	more_bodyFThttp.disconnect)rD   rz   rs   rb   rq   rN   rt   r+   )r6   rk   r{   r(   r(   r)   stream   s$    
zRequest.streambytesc                   sB   t | ds<g }|  2 z3 d H W }|| q6 d|| _| jS )Nrz   rK   )rD   r}   appendjoinrz   )r6   chunksr%   r(   r(   r)   r{      s    
zRequest.bodyr8   c                   s*   t | ds$|  I d H }t|| _| jS )N_json)rD   r{   jsonloadsr   )r6   r{   r(   r(   r)   r      s    
zRequest.jsoni  i   	max_files
max_fieldsmax_part_sizezint | floatr?   r   )r   r   r   r   c          
   
     s   | j d u rtd usJ d| jd}t|\}}|dkrz,t| j|  |||d}| I d H | _ W q ty } z(d| jv rt	d|j
d|W Y d }~qd }~0 0 n2|dkrt| j|  }	|	 I d H | _ nt | _ | j S )	NzEThe `python-multipart` library must be installed to use form parsing.zContent-Types   multipart/form-datar   rB   i  )status_codedetails!   application/x-www-form-urlencoded)rn   r   rR   rN   r   r}   parser   r1   r   rk   r   r   )
r6   r   r   r   Zcontent_type_headercontent_type_Zmultipart_parserexcZform_parserr(   r(   r)   	_get_form   s4    

zRequest._get_formz#AwaitableOrContextManager[FormData]c                C  s   t | j|||dS )Nr   )r   r   )r6   r   r   r   r(   r(   r)   form  s    zRequest.formr0   c                   s   | j d ur| j  I d H  d S r9   )rn   closer=   r(   r(   r)   r   *  s    
zRequest.closeboolc                   sb   | j s\i }t &}|  |  I d H }W d    n1 s>0    Y  |ddkr\d| _ | j S )Nr3   r|   T)rt   anyioZCancelScopecancelrq   rN   )r6   rk   csr(   r(   r)   is_disconnected.  s    
,zRequest.is_disconnected)rJ   r   c                   sh   d| j di v rdg }tD ]0}| j|D ]}||d|df q*q| d||dI d H  d S )Nzhttp.response.push
extensionszlatin-1)r3   rJ   rR   )r1   rN   SERVER_PUSH_HEADERS_TO_COPYrR   getlistr   encoderr   )r6   rJ   Zraw_headersra   valuer(   r(   r)   send_push_promise<  s    zRequest.send_push_promise)r,   r-   r.   __annotations__rj   rl   r7   rh   rw   r2   r}   r{   r   r   r   r   r   r   __classcell__r(   r(   ru   r)   rm      s(   
		&rm   )1
__future__r   r   rx   r4   r   r"   r   Zstarlette._utilsr   r   Zstarlette.datastructuresr   r   r   r	   r
   r   Zstarlette.exceptionsr   Zstarlette.formparsersr   r   r   Zstarlette.typesr   r   r   r   TYPE_CHECKINGZpython_multipart.multipartr   Zstarlette.applicationsr   Zstarlette.routingr   ModuleNotFoundErrorZmultipart.multipartr   r*   	Exceptionr+   Mappingr   Anyr/   rj   rl   rm   r(   r(   r(   r)   <module>   s6    
	x