
    CCf+                    |   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 	 d d	lmZ ej@                  rd d
l!m"Z" h dZ#ddZ$ G d de%      Z& G d dejN                  e(ejR                  f         Z*ddZ+ddZ, G d de*      Z-y# e$ r dZY fw xY w)    )annotationsN)cookies)AwaitableOrContextManager AwaitableOrContextManagerWrapper)URLAddressFormDataHeadersQueryParamsState)HTTPException)
FormParserMultiPartExceptionMultiPartParser)MessageReceiveScopeSend)parse_options_header)Router>   
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        R/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/starlette/requests.pycookie_parserr+   "   s     #%K$$S) 
:%<{{3*HC 5C99;		S#+44S9K
:     c                      e Zd Zy)ClientDisconnectN)__name__
__module____qualname__ r,   r*   r.   r.   =   s    r,   r.   c                  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)selfr:   receives      r*   __init__zHTTPConnection.__init__G   s    V} 5555
r,   c                     | j                   |   S Nr9   )r;   r(   s     r*   __getitem__zHTTPConnection.__getitem__K   s    zz#r,   c                ,    t        | j                        S r?   )iterr:   r;   s    r*   __iter__zHTTPConnection.__iter__N   s    DJJr,   c                ,    t        | j                        S r?   )lenr:   rC   s    r*   __len__zHTTPConnection.__len__Q   s    4::r,   c                     | j                   d   S )Nappr9   rC   s    r*   rI   zHTTPConnection.appZ   s    zz%  r,   c                h    t        | d      st        | j                        | _        | j                  S )N_urlr9   )hasattrr   r:   rK   rC   s    r*   urlzHTTPConnection.url^   s&    tV$$**-DIyyr,   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    /pathr,   query_stringr9   )rL   dictr:   getendswithr   rO   )r;   base_url_scoperP   rS   s       r*   base_urlzHTTPConnection.base_urld   s    t[)!$**-N +..!3!3K!DM !D==%%)N6"-0N>**7N;' ~6DN~~r,   c                h    t        | d      st        | j                        | _        | j                  S )N_headersr9   )rL   r
   r:   r[   rC   s    r*   headerszHTTPConnection.headersw   s&    tZ(#$**5DM}}r,   c                l    t        | d      st        | j                  d         | _        | j                  S )N_query_paramsrT   )rL   r   r:   r^   rC   s    r*   query_paramszHTTPConnection.query_params}   s.    t_-!,TZZ-G!HD!!!r,   c                :    | j                   j                  di       S )Npath_params)r:   rV   rC   s    r*   ra   zHTTPConnection.path_params   s    zz~~mR00r,   c                    t        | d      s1i }| j                  j                  d      }|rt        |      }|| _        | j                  S )N_cookiescookie)rL   r\   rV   r+   rc   )r;   r   cookie_headers      r*   r   zHTTPConnection.cookies   sC    tZ(&(G LL,,X6M'6#DM}}r,   c                N    | j                   j                  d      }|t        | S y )Nclient)r:   rV   r   )r;   	host_ports     r*   rg   zHTTPConnection.client   s*     JJNN8,	 I&&r,   c                J    d| j                   v sJ d       | j                   d   S )Nsessionz=SessionMiddleware must be installed to access request.sessionr9   rC   s    r*   rj   zHTTPConnection.session   s1     #	KJ	K#zz)$$r,   c                J    d| j                   v sJ d       | j                   d   S )NauthzAAuthenticationMiddleware must be installed to access request.authr9   rC   s    r*   rl   zHTTPConnection.auth   1     djj 	ON	O zz&!!r,   c                J    d| j                   v sJ d       | j                   d   S )NuserzAAuthenticationMiddleware must be installed to access request.userr9   rC   s    r*   ro   zHTTPConnection.user   rm   r,   c                    t        | d      s9| j                  j                  di        t        | j                  d         | _        | j                  S )N_statestate)rL   r:   
setdefaultr   rq   rC   s    r*   rr   zHTTPConnection.state   sA    tX&JJ!!'2.  

7 34DK{{r,   c               ~    | j                   d   } |j                  |fi |}|j                  | j                        S )Nrouter)rY   )r:   url_path_formake_absolute_urlrY   )r;   namera   ru   url_paths        r*   url_forzHTTPConnection.url_for   s?    H-&6&&t;{;))4==)AAr,   r?   )r:   r   r<   zReceive | NonereturnNone)r(   strr{   
typing.Any)r{   ztyping.Iterator[str])r{   intr{   r~   )r{   r   )r{   r
   )r{   r   )r{   zdict[str, typing.Any])r{   dict[str, str])r{   zAddress | None)r{   r   )rx   r}   ra   r~   r{   r   )r/   r0   r1   __doc__r=   r@   rD   rG   object__eq____hash__propertyrI   rM   rY   r\   r_   ra   r   rg   rj   rl   ro   rr   rz   r2   r,   r*   r4   r4   A   s#   
  ]]FH! !  
  $  
 " "
 1 1     % % " " " "  Br,   r4   c                     K   t        d      w)Nz+Receive channel has not been made availableRuntimeErrorr2   r,   r*   empty_receiver      s     
D
EE   c                    K   t        d      w)Nz(Send channel has not been made availabler   )messages    r*   
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Z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 )Nr6   r7   F)superr=   _receive_send_stream_consumed_is_disconnectedr   )r;   r:   r<   send	__class__s       r*   r=   zRequest.__init__   sI     	V}&&&
 % %
r,   c                P    t        j                  t        | j                  d         S )Nmethod)typingcastr}   r:   rC   s    r*   r   zRequest.method   s    {{3

8 455r,   c                    | j                   S r?   )r   rC   s    r*   r<   zRequest.receive   s    }}r,   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_bodyr,   zStream consumedr6   zhttp.requestbody	more_bodyFThttp.disconnect)rL   r   r   r   r   rV   r   r.   )r;   r   r   s      r*   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   r,   )rL   r   appendjoinr   )r;   chunksr'   s      r*   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)rL   r   jsonloadsr   )r;   r   s     r*   r   zRequest.json   s=     tW%$DD)DJzz %s    AA+Ai  	max_files
max_fieldsc                 K   | j                   t        J d       | j                  j                  d      }t        |      \  }}|dk(  rQ	 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   rI   i  )status_codedetails!   application/x-www-form-urlencoded)r   r   r\   rV   r   r   parser   r:   r   r   r   r	   )	r;   r   r   content_type_headercontent_type_multipart_parserexcform_parsers	            r*   	_get_formzRequest._get_form   s0     ::$0WVW0"&,,"2"2>"B23FGOL!55'6"+#-	($ (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
 
	D?'D::D??Ec               :    t        | j                  ||            S )Nr   )r   r   )r;   r   r   s      r*   formzRequest.form  s!     0NNY:NF
 	
r,   c                n   K   | j                   #| j                   j                          d {    y y 7 wr?   )r   closerC   s    r*   r   zRequest.close$  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)Nr6   r   T)r   anyioCancelScopecancelr   rV   )r;   r   css      r*   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)r6   rS   r\   )r:   rV   SERVER_PUSH_HEADERS_TO_COPYr\   getlistr   encoder   )r;   rS   raw_headersrx   values        r*   send_push_promisezRequest.send_push_promise6  s     4::>>,#CC57K3 !\\11$7 E&&Y/i1HI
 **-tT   Ds   BB BB )r:   r   r<   r   r   r   )r{   r}   )r{   r   )r{   z"typing.AsyncGenerator[bytes, None])r{   bytesr   )r   int | floatr   r   r{   r	   )r   r   r   r   r{   z#AwaitableOrContextManager[FormData])r{   r|   )r{   bool)rS   r}   r{   r|   )r/   r0   r1   __annotations__r   r   r=   r   r   r<   r   r   r   r   r   r   r   r   __classcell__)r   s   @r*   r   r      s     0=:		%,	DH	 6 6  ( +/$'<G	> +/$
'
<G
	,
%%
r,   r   )r%   r}   r{   r   )r{   typing.NoReturn)r   r   r{   r   ).
__future__r   r   r   r7   r   r#   r   starlette._utilsr   r   starlette.datastructuresr   r   r	   r
   r   r   starlette.exceptionsr   starlette.formparsersr   r   r   starlette.typesr   r   r   r   multipart.multipartr   ModuleNotFoundErrorTYPE_CHECKINGstarlette.routingr   r   r+   	Exceptionr.   Mappingr}   Anyr4   r   r   r   r2   r,   r*   <module>r      s    "   (  X X X . Q Q 9 9 8
 
( 6	y 	{BV^^CO4 {B|FCyn ym    s   B1 1B;:B;