
    i/                    T   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( n# e/$ r	 d dl0m(Z( Y nw xY wn# e/$ r dZ(Y nw xY wej1        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=dS )'    )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acceptcookie_stringstrreturndict[str, str]c                   i }|                      d          D ]g}d|v r|                     dd          \  }}nd|}}|                                |                                }}|s|rt          j        |          ||<   h|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vals        O/root/projects/qq-shell/venv/lib/python3.11/site-packages/starlette/requests.pycookie_parserr;   .   s     #%K$$S)) 
: 
:%<<{{3**HC 5C99;;		S 	:# 	:+4S99K    c                      e Zd ZdS )ClientDisconnectN)__name__
__module____qualname__ r<   r:   r>   r>   I   s        Dr<   r>   StateT)bounddefaultc                  x   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d0d            Zed1d            Zed2d            Zed3d            Zed1d             Zed-d!            Zed-d"            Zed4d$            Zd5d'ZdS )6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                ,    |d         dv sJ || _         d S )Ntype)http	websocketrH   )selfrH   rI   s      r:   __init__zHTTPConnection.__init__V   s#    V} 55555


r<   r8   r*   r	   c                    | j         |         S NrP   )rQ   r8   s     r:   __getitem__zHTTPConnection.__getitem__Z   s    z#r<   Iterator[str]c                *    t          | j                  S rT   )iterrH   rQ   s    r:   __iter__zHTTPConnection.__iter__]   s    DJr<   intc                *    t          | j                  S rT   )lenrH   rY   s    r:   __len__zHTTPConnection.__len__`   s    4:r<   c                    | j         d         S )NapprP   rY   s    r:   r`   zHTTPConnection.appi   s    z%  r<   r   c                d    t          | d          st          | j                  | _        | j        S )N_urlrP   )hasattrr   rH   rb   rY   s    r:   urlzHTTPConnection.urlm   s0    tV$$ 	.$*---DIyr<   c                ,   t          | d          s~t          | j                  }|                    d|                    dd                    }|}|                    d          s|dz  }||d<   d|d<   ||d<   t          |	          | _        | j        S )
N	_base_urlapp_root_path	root_pathr1   /pathr<   query_stringrP   )rc   dictrH   getendswithr   rf   )rQ   base_url_scoperg   rj   s       r:   base_urlzHTTPConnection.base_urls   s    t[)) 	7!$*--N +..@R@RS^`b@c@cddM D==%% %)N6"-0N>**7N;' ~666DN~r<   r   c                d    t          | d          st          | j                  | _        | j        S )N_headersrP   )rc   r   rH   rr   rY   s    r:   headerszHTTPConnection.headers   s0    tZ(( 	6#$*555DM}r<   r   c                n    t          | d          st          | j        d                   | _        | j        S )N_query_paramsrk   )rc   r   rH   ru   rY   s    r:   query_paramszHTTPConnection.query_params   s5    t_-- 	I!,TZ-G!H!HD!!r<   dict[str, Any]c                8    | j                             di           S )Npath_params)rH   rm   rY   s    r:   ry   zHTTPConnection.path_params   s    z~~mR000r<   r,   c                    t          | d          sJi }| j                            d          }|D ]$}|                    t	          |                     %|| _        | j        S )N_cookiescookie)rc   rs   getlistupdater;   r{   )rQ   r   cookie_headersheaders       r:   r   zHTTPConnection.cookies   si    tZ(( 	$&(G!\11(;;N( 6 6}V445555#DM}r<   Address | Nonec                P    | j                             d          }|	t          | S d S )Nclient)rH   rm   r   )rQ   	host_ports     r:   r   zHTTPConnection.client   s-     JNN8,,	 I&&tr<   c                    d| j         v s
J d            | j         d         }t          |d          r|                                 |S )Nsessionz=SessionMiddleware must be installed to access request.sessionmark_accessed)rH   rc   r   )rQ   r   s     r:   r   zHTTPConnection.session   sS    DJ&&&(g&&&:i07O,, 	$!!###r<   c                B    d| j         v s
J d            | j         d         S )NauthzAAuthenticationMiddleware must be installed to access request.authrP   rY   s    r:   r   zHTTPConnection.auth   +    ###%h###z&!!r<   c                B    d| j         v s
J d            | j         d         S )NuserzAAuthenticationMiddleware must be installed to access request.userrP   rY   s    r:   r   zHTTPConnection.user   r   r<   rC   c                    t          | d          s:| j                            di            t          | j        d                   | _        t          t          | j                  S )N_statestate)rc   rH   
setdefaultr   r   r   rC   rY   s    r:   r   zHTTPConnection.state   sV    tX&& 	5J!!'2...  
7 344DKFDK(((r<   namery   c                   | j                             d          p| j                             d          }|t          d           |j        |fi |}|                    | j                  S )Nrouterr`   zVThe `url_for` method can only be used inside a Starlette application or with a router.)rp   )rH   rm   RuntimeErrorurl_path_formake_absolute_urlrp   )rQ   r   ry   url_path_providerurl_paths        r:   url_forzHTTPConnection.url_for   sw    7;z~~h7O7O7hSWS]SaSabgShSh$wxxx1$1$FF+FF))4=)AAAr<   rT   )rH   r   rI   rJ   r+   rK   )r8   r*   r+   r	   )r+   rV   )r+   r[   r+   r	   )r+   r   )r+   r   )r+   r   )r+   rw   )r+   r,   )r+   r   )r+   rC   )r   r*   ry   r	   r+   r   )r?   r@   rA   __doc__rR   rU   rZ   r^   object__eq____hash__propertyr`   rd   rp   rs   rv   ry   r   r   r   r   r   r   r   rB   r<   r:   rG   rG   P   s        
                  ]FH! ! ! X!    X
    X     X
 " " " X"
 1 1 1 X1 	 	 	 X	    X    X " " " X" " " " X" ) ) ) X)B B B B B Br<   rG   r   c                 $   K   t          d          )Nz+Receive channel has not been made availabler   rB   r<   r:   empty_receiver      s      
D
E
EEr<   messager   c                $   K   t          d          )Nz(Send channel has not been made availabler   )r   s    r:   
empty_sendr      s      
A
B
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d0d%Z xZS )1RequestzFormData | None_formrH   r   rI   r   sendr   c                    t                                          |           |d         dk    sJ || _        || _        d| _        d| _        d | _        d S )NrM   rN   F)superrR   _receive_send_stream_consumed_is_disconnectedr   )rQ   rH   rI   r   	__class__s       r:   rR   zRequest.__init__   sY    V}&&&&
 % %


r<   r+   r*   c                B    t          t          | j        d                   S )Nmethod)r   r*   rH   rY   s    r:   r   zRequest.method   s    CH-...r<   c                    | j         S rT   )r   rY   s    r:   rI   zRequest.receive   s
    }r<   AsyncGenerator[bytes, None]c                 K   t          | d          r| j        W V  dW V  d S | j        rt          d          | j        s|                                  d {V }|d         dk    r;|                    dd          }|                    dd          sd	| _        |r|W V  n!|d         d
k    rd	| _        t                      | j        dW V  d S )N_bodyr<   zStream consumedrM   zhttp.requestbody	more_bodyFThttp.disconnect)rc   r   r   r   r   rm   r   r>   )rQ   r   r   s      r:   streamzRequest.stream   s     4!! 	*IIIIF  	20111' 
	) MMOO++++++Gv.00{{63//{{;66 1,0D) JJJJ$555(,%&((( ' 
	) 						r<   bytesc                   K   t          | d          sNg }|                                 2 3 d {V }|                    |           6 d                    |          | _        | j        S )Nr   r<   )rc   r   appendjoinr   )rQ   chunksr7   s      r:   r   zRequest.body   s      tW%% 	*"$F#{{}} % % % % % % %ee$$$$  -&))DJzs   Ar	   c                   K   t          | d          s3|                                  d {V }t          j        |          | _        | j        S )N_json)rc   r   jsonloadsr   )rQ   r   s     r:   r   zRequest.json  sP      tW%% 	*$$$$$$DD))DJzr<   i  i   	max_files
max_fieldsmax_part_sizer   int | floatr   r   r[   r   c               h  K   | j         "t          
J d            | j                            d          }t          |          \  }}|dk    r	 t	          | j        |                                 |||          }|                                 d {V | _         n# t          $ r&}d| j        v rt          d|j
                  |d }~ww xY w|dk    rGt          | j        |                                           }	|	                                 d {V | _         nt                      | _         | j         S )	NzEThe `python-multipart` library must be installed to use form parsing.zContent-Types   multipart/form-datar   r`   i  )status_codedetails!   application/x-www-form-urlencoded)r   r   rs   rm   r   r   parser   rH   r   r   r   r   )
rQ   r   r   r   content_type_headercontent_type_multipart_parserexcform_parsers
             r:   	_get_formzRequest._get_form  s`      :'33W 433 #',"2"2>"B"B23FGGOL!555'6"+#-&3( ( ($ (8'='='?'?!?!?!?!?!?!?DJJ)   
**+CKPPPPI !EEE(t{{}}EE#.#4#4#6#6666666

%ZZ
zs   A
B 
C
$!CC
#AwaitableOrContextManager[FormData]c               L    t          |                     |||                    S )Nr   )r   r   )rQ   r   r   r   s       r:   formzRequest.form.  s,     0NNY:UbNcc
 
 	
r<   rK   c                Z   K   | j         !| j                                          d {V  d S d S rT   )r   closerY   s    r:   r   zRequest.close9  sB      :!*""$$$$$$$$$$$ "!r<   boolc                  K   | j         s{i }t          j                    5 }|                                 |                                  d {V }d d d            n# 1 swxY w Y   |                    d          dk    rd| _         | j         S )NrM   r   T)r   anyioCancelScopecancelr   rm   )rQ   r   css      r:   is_disconnectedzRequest.is_disconnected=  s      $ 		-!G "$$ 0		 $//////0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 {{6""&777(,%$$s   /AA!Arj   c                R  K   d| j                             di           v rg }t          D ]\}| j                            |          D ]?}|                    |                    d          |                    d          f           @]|                     d||d           d {V  d S d S )Nzhttp.response.push
extensionszlatin-1)rM   rj   rs   )rH   rm   SERVER_PUSH_HEADERS_TO_COPYrs   r}   r   encoder   )rQ   rj   raw_headersr   values        r:   send_push_promisezRequest.send_push_promiseK  s      4:>>,#C#CCC57K3 Z Z!\11$77 Z ZE&&I(>(>Y@W@W'XYYYYZ**&:DU`aabbbbbbbbbbb DCr<   )rH   r   rI   r   r   r   )r+   r*   )r+   r   )r+   r   )r+   r   r   )r   r   r   r   r   r[   r+   r   )r   r   r   r   r   r[   r+   r   )r+   rK   )r+   r   )rj   r*   r+   rK   )r?   r@   rA   __annotations__r   r   rR   r   r   rI   r   r   r   r   r   r   r   r   __classcell__)r   s   @r:   r   r      si        8ET^        / / / X/    X   (       "&"&(! ! ! ! ! !L "&"&(	
 	
 	
 	
 	
 	
% % % %% % % %c c c c c c c cr<   r   )r)   r*   r+   r,   )r+   r   )r   r   r+   r   )>
__future__r   r   syscollections.abcr   r   r   rN   r   r4   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   r;   	Exceptionr>   r*   rC   rG   r   r   r   rB   r<   r:   <module>r      sn   " " " " " "  



 = = = = = = = = = = ( ( ( ( ( ( > > > > > > > > > > > > > >  X X X X X X X X X X X X X X X X X X X X X X X X . . . . . . Q Q Q Q Q Q Q Q Q Q 9 9 9 9 9 9 9 9 9 9 9 9 $??????000000555555((((((($	AGGGGGGG" 	A 	A 	A@@@@@@@@	A $ $ $#$ w))))))      6	 	 	 	 	y 	 	 	 
c!2U!:E	J	J	JzB zB zB zB zBWS#X& zB zB zBzF F F FC C C C|c |c |c |c |cnV$ |c |c |c |c |cs0   B	 B 	BB BB B%$B%