
    ~lDh-                       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        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h dZ&ddZ' G d de(          Z) G d dej*        e+ej,        f                   Z-ddZ.ddZ/ G 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                   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        S/users/jtampere/www/backend/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__ r0   r.   r2   r2   B   s        Dr0   r2   c                  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r9   )selfr9   r:   s      r.   __init__zHTTPConnection.__init__L   s#    V} 55555


r0   r,   r   
typing.Anyc                    | j         |         S NrA   )rB   r,   s     r.   __getitem__zHTTPConnection.__getitem__P   s    z#r0   typing.Iterator[str]c                *    t          | j                  S rF   )iterr9   rB   s    r.   __iter__zHTTPConnection.__iter__S   s    DJr0   intc                *    t          | j                  S rF   )lenr9   rK   s    r.   __len__zHTTPConnection.__len__V   s    4:r0   c                    | j         d         S )NapprA   rK   s    r.   rR   zHTTPConnection.app_   s    z%  r0   r   c                d    t          | d          st          | j                  | _        | j        S )N_urlrA   )hasattrr   r9   rT   rK   s    r.   urlzHTTPConnection.urlc   s0    tV$$ 	.$*---DIyr0   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_pathr%   /pathr0   query_stringrA   )rU   dictr9   getendswithr   rX   )rB   base_url_scoperY   r\   s       r.   base_urlzHTTPConnection.base_urli   s    t[)) 	7!$*--N +..@R@RS^`b@c@cddM D==%% %)N6"-0N>**7N;' ~666DN~r0   r
   c                d    t          | d          st          | j                  | _        | j        S )N_headersrA   )rU   r
   r9   rd   rK   s    r.   headerszHTTPConnection.headersz   s0    tZ(( 	6#$*555DM}r0   r   c                n    t          | d          st          | j        d                   | _        | j        S )N_query_paramsr]   )rU   r   r9   rg   rK   s    r.   query_paramszHTTPConnection.query_params   s5    t_-- 	I!,TZ-G!H!HD!!r0   dict[str, typing.Any]c                8    | j                             di           S )Npath_params)r9   r_   rK   s    r.   rk   zHTTPConnection.path_params   s    z~~mR000r0   r    c                    t          | d          s4i }| j                            d          }|rt          |          }|| _        | j        S )N_cookiescookie)rU   re   r_   r/   rm   )rB   r   cookie_headers      r.   r   zHTTPConnection.cookies   sR    tZ(( 	$&(G L,,X66M 7'66#DM}r0   Address | Nonec                P    | j                             d          }|	t          | S d S )Nclient)r9   r_   r   )rB   	host_ports     r.   rr   zHTTPConnection.client   s-     JNN8,,	 I&&tr0   c                B    d| j         v s
J d            | j         d         S )Nsessionz=SessionMiddleware must be installed to access request.sessionrA   rK   s    r.   ru   zHTTPConnection.session   s+    DJ&&&(g&&&z)$$r0   c                B    d| j         v s
J d            | j         d         S )NauthzAAuthenticationMiddleware must be installed to access request.authrA   rK   s    r.   rw   zHTTPConnection.auth   +    ###%h###z&!!r0   c                B    d| j         v s
J d            | j         d         S )NuserzAAuthenticationMiddleware must be installed to access request.userrA   rK   s    r.   rz   zHTTPConnection.user   rx   r0   r   c                    t          | d          s:| j                            di            t          | j        d                   | _        | j        S )N_statestate)rU   r9   
setdefaultr   r|   rK   s    r.   r}   zHTTPConnection.state   sL    tX&& 	5J!!'2...  
7 344DK{r0   namerk   c                   | j                             d          p| j                             d          }|t          d           |j        |fi |}|                    | j                  S )NrouterrR   zVThe `url_for` method can only be used inside a Starlette application or with a router.)rb   )r9   r_   RuntimeErrorurl_path_formake_absolute_urlrb   )rB   r   rk   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Ar0   rF   )r9   r   r:   r;   r   r<   )r,   r   r   rD   )r   rH   )r   rM   r   rD   )r   r   )r   r
   )r   r   )r   ri   )r   r    )r   rp   )r   r   )r   r   rk   rD   r   r   )r3   r4   r5   __doc__rC   rG   rL   rP   object__eq____hash__propertyrR   rV   rb   re   rh   rk   r   rr   ru   rw   rz   r}   r   r6   r0   r.   r8   r8   F   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r0   r8   typing.NoReturnc                 $   K   t          d          )Nz+Receive channel has not been made availabler   r6   r0   r.   empty_receiver      s      
D
E
EEr0   messager   c                $   K   t          d          )Nz(Send channel has not been made availabler   )r   s    r.   
empty_sendr      s      
A
B
BBr0   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_formr9   r   r:   r   sendr   c                    t                                          |           |d         dk    sJ || _        || _        d| _        d| _        d | _        d S )Nr>   r?   F)superrC   _receive_send_stream_consumed_is_disconnectedr   )rB   r9   r:   r   	__class__s       r.   rC   zRequest.__init__   sY    V}&&&&
 % %


r0   r   r   c                L    t          j        t          | j        d                   S )Nmethod)typingcastr   r9   rK   s    r.   r   zRequest.method   s    {3
8 4555r0   c                    | j         S rF   )r   rK   s    r.   r:   zRequest.receive   s
    }r0   "typing.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_bodyr0   zStream consumedr>   zhttp.requestbody	more_bodyFThttp.disconnect)rU   r   r   r   r   r_   r   r2   )rB   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(,%&((( ' 
	) 						r0   bytesc                   K   t          | d          sNg }|                                 2 3 d {V }|                    |           6 d                    |          | _        | j        S )Nr   r0   )rU   r   appendjoinr   )rB   chunksr+   s      r.   r   zRequest.body   s      tW%% 	*"$F#{{}} % % % % % % %ee$$$$  -&))DJzs   ArD   c                   K   t          | d          s3|                                  d {V }t          j        |          | _        | j        S )N_json)rU   r   jsonloadsr   )rB   r   s     r.   r   zRequest.json   sP      tW%% 	*$$$$$$DD))DJzr0   i  i   	max_files
max_fieldsmax_part_sizer   int | floatr   r   rM   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   rR   i  )status_codedetails!   application/x-www-form-urlencoded)r   r   re   r_   r   r   parser   r9   r   r   r   r	   )
rB   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   )rB   r   r   r   s       r.   formzRequest.form  s,     0NNY:UbNcc
 
 	
r0   r<   c                Z   K   | j         !| j                                          d {V  d S d S rF   )r   closerK   s    r.   r   zRequest.close*  sB      :!*""$$$$$$$$$$$ "!r0   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 )Nr>   r   T)r   anyioCancelScopecancelr   r_   )rB   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r\   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)r>   r\   re   )r9   r_   SERVER_PUSH_HEADERS_TO_COPYre   getlistr   encoder   )rB   r\   raw_headersr   values        r.   send_push_promisezRequest.send_push_promise<  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Cr0   )r9   r   r:   r   r   r   )r   r   )r   r   )r   r   )r   r   r   )r   r   r   r   r   rM   r   r	   )r   r   r   r   r   rM   r   r   )r   r<   )r   r   )r\   r   r   r<   )r3   r4   r5   __annotations__r   r   rC   r   r   r:   r   r   r   r   r   r   r   r   __classcell__)r   s   @r.   r   r      si        8ET^        6 6 6 X6    X   (       "&"&(! ! ! ! ! !L "&"&(	
 	
 	
 	
 	
 	
% % % %% % % %c c c c c c c cr0   r   )r   r   r   r    )r   r   )r   r   r   r   )1
__future__r   r   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   TYPE_CHECKINGpython_multipart.multipartr   starlette.applicationsr   starlette.routingr   ModuleNotFoundErrormultipart.multipartr   r/   	Exceptionr2   Mappingr   Anyr8   r   r   r   r6   r0   r.   <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 $ $ $#$      6	 	 	 	 	y 	 	 	uB uB uB uB uBV^CO4 uB uB uBpF F F FC C C C|c |c |c |c |cn |c |c |c |c |cs0   )A0 /B 0A>;B =A>>B BB