
    wi.                    H   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, n(	 	 d dl'm(Z( n# e-$ r	 d dl.m(Z( Y nw xY wn# e-$ r dZ(Y nw xY wej/        dk    rd dlm0Z0 nd dl1m0Z0 h dZ2d#dZ3 G d de4          Z5 e0dee6ef         ez  e          Z7 G d dee6ef         ee7                   Z8d$dZ9d%d Z: G d! d"e8e7                   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)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        b/root/.openclaw/workspace/chatterbox_venv_py311/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;   r9   r=   r=   H   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rG   )selfrG   rH   s      r9   __init__zHTTPConnection.__init__U   s#    V} 55555


r;   r7   r)   r	   c                    | j         |         S NrO   )rP   r7   s     r9   __getitem__zHTTPConnection.__getitem__Y   s    z#r;   Iterator[str]c                *    t          | j                  S rS   )iterrG   rP   s    r9   __iter__zHTTPConnection.__iter__\   s    DJr;   intc                *    t          | j                  S rS   )lenrG   rX   s    r9   __len__zHTTPConnection.__len___   s    4:r;   c                    | j         d         S )NapprO   rX   s    r9   r_   zHTTPConnection.apph   s    z%  r;   r   c                d    t          | d          st          | j                  | _        | j        S )N_urlrO   )hasattrr   rG   ra   rX   s    r9   urlzHTTPConnection.urll   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_pathr0   /pathr;   query_stringrO   )rb   dictrG   getendswithr   re   )rP   base_url_scoperf   ri   s       r9   base_urlzHTTPConnection.base_urlr   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_headersrO   )rb   r   rG   rq   rX   s    r9   headerszHTTPConnection.headers   s0    tZ(( 	6#$*555DM}r;   r   c                n    t          | d          st          | j        d                   | _        | j        S )N_query_paramsrj   )rb   r   rG   rt   rX   s    r9   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)rG   rl   rX   s    r9   rx   zHTTPConnection.path_params   s    z~~mR000r;   r+   c                    t          | d          sJi }| j                            d          }|D ]$}|                    t	          |                     %|| _        | j        S )N_cookiescookie)rb   rr   getlistupdater:   rz   )rP   r   cookie_headersheaders       r9   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)rG   rl   r   )rP   	host_ports     r9   r   zHTTPConnection.client   s-     JNN8,,	 I&&tr;   c                B    d| j         v s
J d            | j         d         S )Nsessionz=SessionMiddleware must be installed to access request.sessionrO   rX   s    r9   r   zHTTPConnection.session   s+    DJ&&&(g&&&z)$$r;   c                B    d| j         v s
J d            | j         d         S )NauthzAAuthenticationMiddleware must be installed to access request.authrO   rX   s    r9   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.userrO   rX   s    r9   r   zHTTPConnection.user   r   r;   rB   c                    t          | d          s:| j                            di            t          | j        d                   | _        t          t          | j                  S )N_statestate)rb   rG   
setdefaultr   r   r   rB   rX   s    r9   r   zHTTPConnection.state   sV    tX&& 	5J!!'2...  
7 344DKFDK(((r;   namerx   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.)ro   )rG   rl   RuntimeErrorurl_path_formake_absolute_urlro   )rP   r   rx   url_path_providerurl_paths        r9   url_forzHTTPConnection.url_for   sw    7;z~~h7O7O7hSWS]SaSabgShSh$wxxx1$1$FF+FF))4=)AAAr;   rS   )rG   r   rH   rI   r*   rJ   )r7   r)   r*   r	   )r*   rU   )r*   rZ   r*   r	   )r*   r   )r*   r   )r*   r   )r*   rv   )r*   r+   )r*   r   )r*   rB   )r   r)   rx   r	   r*   r   )r>   r?   r@   __doc__rQ   rT   rY   r]   object__eq____hash__propertyr_   rc   ro   rr   ru   rx   r   r   r   r   r   r   r   rA   r;   r9   rF   rF   O   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;   rF   r   c                 $   K   t          d          )Nz+Receive channel has not been made availabler   rA   r;   r9   empty_receiver      s      
D
E
EEr;   messager   c                $   K   t          d          )Nz(Send channel has not been made availabler   )r   s    r9   
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_formrG   r   rH   r   sendr   c                    t                                          |           |d         dk    sJ || _        || _        d| _        d| _        d | _        d S )NrL   rM   F)superrQ   _receive_send_stream_consumed_is_disconnectedr   )rP   rG   rH   r   	__class__s       r9   rQ   zRequest.__init__   sY    V}&&&&
 % %


r;   r*   r)   c                B    t          t          | j        d                   S )Nmethod)r   r)   rG   rX   s    r9   r   zRequest.method   s    CH-...r;   c                    | j         S rS   )r   rX   s    r9   rH   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 consumedrL   zhttp.requestbody	more_bodyFThttp.disconnect)rb   r   r   r   r   rl   r   r=   )rP   r   r   s      r9   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;   )rb   r   appendjoinr   )rP   chunksr6   s      r9   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)rb   r   jsonloadsr   )rP   r   s     r9   r   zRequest.json   sP      tW%% 	*$$$$$$DD))DJzr;   i  i   	max_files
max_fieldsmax_part_sizer   int | floatr   r   rZ   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   rr   rl   r   r   parser   rG   r   r   r   r   )
rP   r   r   r   content_type_headercontent_type_multipart_parserexcform_parsers
             r9   	_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   )rP   r   r   r   s       r9   formzRequest.form)  s,     0NNY:UbNcc
 
 	
r;   rJ   c                Z   K   | j         !| j                                          d {V  d S d S rS   )r   closerX   s    r9   r   zRequest.close4  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 )NrL   r   T)r   anyioCancelScopecancelr   rl   )rP   r   css      r9   is_disconnectedzRequest.is_disconnected8  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ri   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)rL   ri   rr   )rG   rl   SERVER_PUSH_HEADERS_TO_COPYrr   r|   r   encoder   )rP   ri   raw_headersr   values        r9   send_push_promisezRequest.send_push_promiseF  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;   )rG   r   rH   r   r   r   )r*   r)   )r*   r   )r*   r   )r*   r   r   )r   r   r   r   r   rZ   r*   r   )r   r   r   r   r   rZ   r*   r   )r*   rJ   )r*   r   )ri   r)   r*   rJ   )r>   r?   r@   __annotations__r   r   rQ   r   r   rH   r   r   r   r   r   r   r   r   __classcell__)r   s   @r9   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   rM   r   r3   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.routingr   ModuleNotFoundErrormultipart.multipartversion_infor"   typing_extensionsr   r:   	Exceptionr=   r)   rB   rF   r   r   r   rA   r;   r9   <module>r      s\   " " " " " "  



 = = = = = = = = = = ( ( ( ( ( ( > > > > > > > > > > > > > >  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((((((($	AGGGGGGG" 	A 	A 	A@@@@@@@@	A $ $ $#$ w))))))      6	 	 	 	 	y 	 	 	 
c!2U!:E	J	J	JvB vB vB vB vBWS#X& vB vB vBr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