
    6i/                    &   d dl mZ d dlZd dlZd dlmZmZmZ d dlm	Z
 d dlmZmZmZmZ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rd dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-m.Z. n	 	 d dl'm(Z( ejb                  dk\  rd dlm2Z2 nd dl3m2Z2 h dZ4ddZ5 G d de6      Z7 e2dee8ef   ez  e      Z9 G d dee8ef   ee9         Z:ddZ;ddZ< G d de:e9         Z=y# e/$ r	 d dl0m(Z( Y zw xY w# e/$ r dZ(Y w xY w)     )annotationsN)AsyncGeneratorIteratorMapping)cookies)TYPE_CHECKINGAnyGenericNoReturncast)AwaitableOrContextManager AwaitableOrContextManagerWrapper)URLAddressFormDataHeadersQueryParamsState)HTTPException)
FormParserMultiPartExceptionMultiPartParser)MessageReceiveScopeSend)parse_options_header)	Starlette)Session)Router)      )TypeVar>   
user-agentcache-controlaccept-encodingaccept-languageacceptc                    i }| j                  d      D ]]  }d|v r|j                  dd      \  }}nd|}}|j                         |j                         }}|s|sFt        j                  |      ||<   _ |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)cookie_stringcookie_dictchunkkeyvals        E/var/www/files/kim/lib/python3.12/site-packages/starlette/requests.pycookie_parserr8   .   s     #%K$$S) 
:%<{{3*HC 5C99;		S#+44S9K
:     c                      e Zd Zy)ClientDisconnectN)__name__
__module____qualname__ r9   r7   r;   r;   I   s    r9   r;   StateT)bounddefaultc                  B   e Zd ZdZdddZddZddZddZej                  Z	ej                  Z
edd       Zedd       Zedd	       Zedd
       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zed d       Zd!dZy)"HTTPConnectionz
    A base class for incoming HTTP connections, that is used to provide
    any functionality that is common to both `Request` and `WebSocket`.
    Nc                $    |d   dv sJ || _         y )Ntype)http	websocketscope)selfrJ   receives      r7   __init__zHTTPConnection.__init__V   s    V} 5555
r9   c                     | j                   |   S NrI   )rK   r5   s     r7   __getitem__zHTTPConnection.__getitem__Z   s    zz#r9   c                ,    t        | j                        S rO   )iterrJ   rK   s    r7   __iter__zHTTPConnection.__iter__]   s    DJJr9   c                ,    t        | j                        S rO   )lenrJ   rS   s    r7   __len__zHTTPConnection.__len__`   s    4::r9   c                     | j                   d   S )NapprI   rS   s    r7   rY   zHTTPConnection.appi   s    zz%  r9   c                h    t        | d      st        | j                        | _        | j                  S )N_urlrI   )hasattrr   rJ   r[   rS   s    r7   urlzHTTPConnection.urlm   s&    tV$$**-DIyyr9   c                   t        | d      sot        | j                        }|j                  d|j                  dd            }|}|j	                  d      s|dz  }||d<   d|d<   ||d<   t        |	      | _        | j                  S )
N	_base_urlapp_root_path	root_pathr-   /pathr9   query_stringrI   )r\   dictrJ   getendswithr   r_   )rK   base_url_scoper`   rc   s       r7   base_urlzHTTPConnection.base_urls   s    t[)!$**-N +..@R@RS^`b@cdM D==%%)N6"-0N>**7N;' ~6DN~~r9   c                h    t        | d      st        | j                        | _        | j                  S )N_headersrI   )r\   r   rJ   rk   rS   s    r7   headerszHTTPConnection.headers   s&    tZ(#$**5DM}}r9   c                l    t        | d      st        | j                  d         | _        | j                  S )N_query_paramsrd   )r\   r   rJ   rn   rS   s    r7   query_paramszHTTPConnection.query_params   s.    t_-!,TZZ-G!HD!!!r9   c                :    | j                   j                  di       S )Npath_params)rJ   rf   rS   s    r7   rq   zHTTPConnection.path_params   s    zz~~mR00r9   c                    t        | d      sEi }| j                  j                  d      }|D ]  }|j                  t	        |              || _        | j
                  S )N_cookiescookie)r\   rl   getlistupdater8   rs   )rK   r   cookie_headersheaders       r7   r   zHTTPConnection.cookies   sX    tZ(&(G!\\11(;N( 6}V456 $DM}}r9   c                N    | j                   j                  d      }|t        | S y )Nclient)rJ   rf   r   )rK   	host_ports     r7   rz   zHTTPConnection.client   s*     JJNN8,	 I&&r9   c                    d| j                   v sJ d       | j                   d   }t        |d      r|j                          |S )Nsessionz=SessionMiddleware must be installed to access request.sessionmark_accessed)rJ   r\   r~   )rK   r}   s     r7   r}   zHTTPConnection.session   sC    DJJ&g(gg&::i07O,!!#r9   c                J    d| j                   v sJ d       | j                   d   S )NauthzAAuthenticationMiddleware must be installed to access request.authrI   rS   s    r7   r   zHTTPConnection.auth   )    #h%hh#zz&!!r9   c                J    d| j                   v sJ d       | j                   d   S )NuserzAAuthenticationMiddleware must be installed to access request.userrI   rS   s    r7   r   zHTTPConnection.user   r   r9   c                    t        | d      s9| j                  j                  di        t        | j                  d         | _        t        t        | j                        S )N_statestate)r\   rJ   
setdefaultr   r   r   r@   rS   s    r7   r   zHTTPConnection.state   sH    tX&JJ!!'2.  

7 34DKFDKK((r9   c                   | j                   j                  d      xs | j                   j                  d      }|t        d       |j                  |fi |}|j	                  | j
                        S )NrouterrY   zVThe `url_for` method can only be used inside a Starlette application or with a router.)ri   )rJ   rf   RuntimeErrorurl_path_formake_absolute_urlri   )rK   namerq   url_path_providerurl_paths        r7   url_forzHTTPConnection.url_for   so    7;zz~~h7O7hSWS]S]SaSabgSh$wxx1$11$F+F))4==)AAr9   rO   )rJ   r   rL   zReceive | NonereturnNone)r5   strr   r	   )r   zIterator[str])r   intr   r	   )r   r   )r   r   )r   r   )r   zdict[str, Any])r   dict[str, str])r   zAddress | None)r   r@   )r   r   rq   r	   r   r   )r<   r=   r>   __doc__rM   rP   rT   rW   object__eq____hash__propertyrY   r]   ri   rl   ro   rq   r   rz   r}   r   r   r   r   r?   r9   r7   rD   rD   P   s#   
  ]]FH! !  
     
 " "
 1 1 	 	     " " " " ) )Br9   rD   c                     K   t        d      w)Nz+Receive channel has not been made availabler   r?   r9   r7   empty_receiver      s     
D
EE   c                    K   t        d      w)Nz(Send channel has not been made availabler   )messages    r7   
empty_sendr      s     
A
BBr   c                       e Zd ZU ded<   eefd fdZedd       Zedd       Z	ddZ
ddZddZd	d	d
d	 	 	 	 	 	 	 ddZd	d	d
d	 	 	 	 	 	 	 ddZddZddZddZ xZS )RequestzFormData | None_formc                ~    t         |   |       |d   dk(  sJ || _        || _        d| _        d| _        d | _        y )NrF   rG   F)superrM   _receive_send_stream_consumed_is_disconnectedr   )rK   rJ   rL   send	__class__s       r7   rM   zRequest.__init__   sG    V}&&&
 % %
r9   c                <    t        t        | j                  d         S )Nmethod)r   r   rJ   rS   s    r7   r   zRequest.method   s    CH-..r9   c                    | j                   S rO   )r   rS   s    r7   rL   zRequest.receive   s    }}r9   c                 K   t        | d      r| j                   d y | j                  rt        d      | j                  sy| j	                          d {   }|d   dk(  r3|j                  dd      }|j                  dd      sd	| _        |r| n|d   d
k(  rd	| _        t               | j                  syd y 7 kw)N_bodyr9   zStream consumedrF   zhttp.requestbody	more_bodyFThttp.disconnect)r\   r   r   r   r   rf   r   r;   )rK   r   r   s      r7   streamzRequest.stream   s     4!**I  011'' MMO+Gv.0{{63/{{;6,0D)J$55(,%&(( '' 	 ,s   ACCA$C Cc                   K   t        | d      s-g }| j                         2 3 d {   }|j                  |       | j                  S 7 "6 dj                  |      | _        &w)Nr   r9   )r\   r   appendjoinr   )rK   chunksr4   s      r7   r   zRequest.body   sX     tW%"$F#{{} % %ee$zz%}&)DJs%   A"A
AA
A"A

A"c                   K   t        | d      s2| j                          d {   }t        j                  |      | _        | j                  S 7 *w)N_json)r\   r   jsonloadsr   )rK   r   s     r7   r   zRequest.json  s=     tW%$DD)DJzz %s    AA+Ai  i   	max_files
max_fieldsmax_part_sizec                 K   | j                   t        J d       | j                  j                  d      }t        |      \  }}|dk(  rR	 t	        | j                  | j                         |||      }|j                          d {   | _         | j                   S |dk(  rMt        | j                  | j                               }	|	j                          d {   | _         | j                   S t               | _         | j                   S 7 # t        $ r,}d| j                  v rt        d|j                        |d }~ww xY w7 jw)	NzEThe `python-multipart` library must be installed to use form parsing.zContent-Types   multipart/form-datar   rY   i  )status_codedetails!   application/x-www-form-urlencoded)r   r   rl   rf   r   r   parser   rJ   r   r   r   r   )
rK   r   r   r   content_type_headercontent_type_multipart_parserexcform_parsers
             r7   	_get_formzRequest._get_form  s3     ::'3 W3 #',,"2"2>"B23FGOL!55'6"+#-&3($ (8'='='?!?DJ zz !EE(t{{}E#.#4#4#66
 zz &Z
zz "@) 

*+CKKPPI 7sI   AE;D D		D AEE0E	D 	E 'D;;E  Ec               <    t        | j                  |||            S )Nr   )r   r   )rK   r   r   r   s       r7   formzRequest.form.  s$     0NNY:UbNc
 	
r9   c                n   K   | j                   #| j                   j                          d {    y y 7 wrO   )r   closerS   s    r7   r   zRequest.close9  s.     ::!**""$$$ "$s   *535c                  K   | j                   sbi }t        j                         5 }|j                          | j	                          d {   }d d d        |j                  d      dk(  rd| _         | j                   S 7 3# 1 sw Y   2xY ww)NrF   r   T)r   anyioCancelScopecancelr   rf   )rK   r   css      r7   is_disconnectedzRequest.is_disconnected=  s}     $$!G ""$ 0		 $/0 {{6"&77(,%$$$ 00 0s.   #B$A?	A=
A?/B=A??BBc                D  K   d| j                   j                  di       v r|g }t        D ]S  }| j                  j	                  |      D ]3  }|j                  |j                  d      |j                  d      f       5 U | j                  d||d       d {    y y 7 w)Nzhttp.response.push
extensionszlatin-1)rF   rc   rl   )rJ   rf   SERVER_PUSH_HEADERS_TO_COPYrl   ru   r   encoder   )rK   rc   raw_headersr   values        r7   send_push_promisezRequest.send_push_promiseK  s     4::>>,#CC57K3 Z!\\11$7 ZE&&I(>Y@W'XYZZ **&:DU`abbb D
 cs   BB BB )rJ   r   rL   r   r   r   )r   r   )r   r   )r   zAsyncGenerator[bytes, None])r   bytesr   )r   int | floatr   r   r   r   r   r   )r   r   r   r   r   r   r   z#AwaitableOrContextManager[FormData])r   r   )r   bool)rc   r   r   r   )r<   r=   r>   __annotations__r   r   rM   r   r   rL   r   r   r   r   r   r   r   r   __classcell__)r   s   @r7   r   r      s    8ET^  / /  ( "&"&(! !  	!
 ! 
!L "&"&(	
 	
  		

 	
 
-	
%%cr9   r   )r2   r   r   r   )r   r   )r   r   r   r   )>
__future__r   r   syscollections.abcr   r   r   rG   r   r0   typingr   r	   r
   r   r   r   starlette._utilsr   r   starlette.datastructuresr   r   r   r   r   r   starlette.exceptionsr   starlette.formparsersr   r   r   starlette.typesr   r   r   r   python_multipart.multipartr   starlette.applicationsr   starlette.middleware.sessionsr   starlette.routingr    ModuleNotFoundErrormultipart.multipartversion_infor#   typing_extensionsr   r8   	Exceptionr;   r   r@   rD   r   r   r   r?   r9   r7   <module>r      s   "  
 = = ( > >  X X X . Q Q 9 9?05($	AG w) 6	y 	 
c!2U!:E	JzBWS#X& zBzFC|cnV$ |cu # 	A@	A $#$s*   C5 5D D DD DD