
    Ng"6                    ^   d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZ d dlmZ d dlZddlmZ e
j        rddlmZ dd	d
Ze                    d  ed          D                         ej        d                    d e                                D                                 Z	 dGdHdZdGdIdZdJdZdKdZdLdZ dMdZ!dNd!Z"dOd#Z#d$d%hZ$dPd)Z%dQd-Z&dRd/Z'dSd1Z(dTd3Z)dUdVd5Z*dUdWd6Z+dXd9Z,dYd:Z-dZd<Z.d[d?Z/ G d@ dA          Z0 G dB dC          Z1d\dEZ2d\dFZ3dS )]    )annotationsN)Path)
getproxies   )PrimitiveDataURLz%22z\\)"\c                `    i | ]+}|d k    t          |          d                    |          ,S )   z%{:02X})chrformat.0cs     H/var/www/html/ai-engine/env/lib/python3.11/site-packages/httpx/_utils.py
<dictcomp>r      s3    GGGQQ$YYSVVYa  YYY        |c                6    g | ]}t          j        |          S  )reescaper   s     r   
<listcomp>r      s     NNNry||NNNr   valuestr | byteslowerboolencoding
str | Nonereturnbytesc                    t          | t                    r| }n|                     |pd          }|r|                                n|S )zE
    Coerce str/bytes into a strictly byte-wise HTTP header key.
    ascii)
isinstancer$   encoder   )r   r   r!   bytes_values       r   normalize_header_keyr*      sO     % 8ll8#6w77"'8;[8r   c                ^    t          | t                    r| S |                     |pd          S )zG
    Coerce str/bytes into a strictly byte-wise HTTP header value.
    r&   )r'   r$   r(   r   r!   s     r   normalize_header_valuer-   /   s2     % <<+G,,,r   r   strc                @    | du rdS | du rdS | dS t          |           S )z
    Coerce a primitive data type into a string value.

    Note that we prefer JSON-style 'true'/'false' for boolean values here.
    TtrueFfalseN )r.   r   s    r   primitive_value_to_strr4   8   s6     }}v	%w	ru::r   c                T    	 t          j        |            n# t          $ r Y dS w xY wdS )z7
    Return `True` if `encoding` is a known codec.
    FT)codecslookupLookupError)r!   s    r   is_known_encodingr9   G   sA    h   uu4s    
%%namec                t    dd}t                               ||          }|  d| d                                S )	z;
    Encode a name/value pair within a multipart form.
    matchtyping.Match[str]r#   r.   c                B    t           |                     d                   S )Nr   )!_HTML5_FORM_ENCODING_REPLACEMENTSgroup)r<   s    r   replacerz#format_form_param.<locals>.replacerW   s    0Q@@r   z="r
   )r<   r=   r#   r.   )_HTML5_FORM_ENCODING_REsubr(   )r:   r   rA   s      r   format_form_paramrD   R   sT    
A A A A $''%88Ee%%'''r   c                 F   dt           j        v rBt          t           j        d                   } |                                 rt	          |           S dt           j        v rBt          t           j        d                   }|                                rt	          |          S d S )NSSL_CERT_FILESSL_CERT_DIR)osenvironr   is_filer.   is_dir)ssl_filessl_paths     r   get_ca_bundle_from_envrN   ^   s    "*$$
?344 	!x== ##
>233?? 	!x== 4r   list[dict[str, str]]c                   g }d}|                      |          } | s|S t          j        d|           D ]}	 |                    dd          \  }}n# t          $ r |d}}Y nw xY wd|                     d          i}|                    d          D ]X}	 |                    d          \  }} n# t          $ r Y  n0w xY w|                      |          ||                     |          <   Y|                    |           |S )	a7  
    Returns a list of parsed link headers, for more info see:
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link
    The generic syntax of those is:
    Link: < uri-reference >; param1=value1; param2="value2"
    So for instance:
    Link; '<http:/.../front.jpeg>; type="image/jpeg",<http://.../back.jpeg>;'
    would return
        [
            {"url": "http:/.../front.jpeg", "type": "image/jpeg"},
            {"url": "http://.../back.jpeg"},
        ]
    :param value: HTTP Link entity-header field
    :return: list of parsed link headers
    z '"z, *<;r   r2   urlz<> '"=)stripr   split
ValueErrorappend)	r   linksreplace_charsvalrR   paramslinkparamkeys	            r   parse_header_linksr_   j   s=     #%EMKK&&E x&&  	"))C++KC 	" 	" 	"rCCC	"syy**+\\#&& 	H 	HE"[[--
UU   -2[[-G-GD=))**TLs#   AA! A!B,,
B:9B:content_typec                t    t           j                                        }| |d<   |                    d           S )Nzcontent-type)failobj)emailmessageMessageget_content_charset)r`   msgs     r   parse_content_type_charsetrh      s8     -


!
!C&C""4"000r   authorizationzproxy-authorizationitems4typing.Iterable[tuple[typing.AnyStr, typing.AnyStr]]4typing.Iterator[tuple[typing.AnyStr, typing.AnyStr]]c              #     K   | D ]D\  }}t          |                                          t          v rt          d|          }||fV  Ed S )Nz[secure])match_type_of)to_strr   SENSITIVE_HEADERSto_bytes_or_str)rj   kvs      r   obfuscate_sensitive_headersrt      sb         1!'')) 111
!<<<Ad



 r   rR   r	   
int | Nonec                X    | j         | j         S ddd                    | j                  S )NP     )httphttps)portgetscheme)rR   s    r   port_or_defaultr~      s/    
xx%%))#*555r   otherc                    | j         |j         k    o/| j        |j        k    ot          |           t          |          k    S )z@
    Return 'True' if the given URLs share the same origin.
    )r}   hostr~   )rR   r   s     r   same_originr      sC    
 	
el" 	;H
"	;C  OE$:$::r   locationc                    | j         |j         k    rdS | j        dk    o0t          |           dk    o|j        dk    ot          |          dk    S )zA
    Return 'True' if 'location' is a HTTPS upgrade of 'url'
    Fry   rw   rz   rx   )r   r}   r~   )rR   r   s     r   is_https_redirectr      sd     x8=  u 	
f 	-C  B&	-Ow&	- H%%,	r   dict[str, str | None]c                    t                      } i }dD ]0}|                     |          r| |         }d|v r|nd| || d<   1d |                     dd                              d          D             }|D ]r}|dk    ri c S |rdd|v rd	||<   t          |          r	d	|d
| <   0t	          |          r
d	|d| d<   I|                                dk    r	d	|d
| <   jd	|d| <   s|S )z+Gets proxy information from the environment)ry   rz   allz://zhttp://c                6    g | ]}|                                 S r   )rT   )r   r   s     r   r   z+get_environment_proxies.<locals>.<listcomp>   s     SSStdjjllSSSr   nor2   ,*Nzall://zall://[]	localhostzall://*)r   r|   rU   is_ipv4_hostnameis_ipv6_hostnamer   )
proxy_infomountsr}   hostnameno_proxy_hostss        r   get_environment_proxiesr      sv    J$&F*  >>&!! 	!&)H!X--3GX3G3G f>>>" TSz~~dB/G/G/M/Mc/R/RSSSN" 4 4 s??
 III 	4   #'x  !(++ 4.2***++!(++ 404,,,,--!![00.2***++/3+++,Mr   utf-8c                Z    t          | t                    r|                     |          n| S Nr'   r.   r(   r,   s     r   to_bytesr      s(    %/s%;%;F5<<!!!Fr   c                Z    t          | t                    r| n|                     |          S r   )r'   r.   decoder,   s     r   ro   ro      s'    uc**F55X0F0FFr   rn   typing.AnyStrc                X    t          |t                    r| n|                                 S r   r   )r   rn   s     r   rq   rq      s#    }c22F55Fr   c                R    | d         | d         cxk    rdk    rn n
| dd         n| S )Nr   r
   r   r   r3   s    r   unquoter      s=    (eBi666636666652;;EAr   filenamec                B    | rt          j        |           d         pdS d S )Nr   zapplication/octet-stream)	mimetypes
guess_type)r   s    r   guess_content_typer     s,     O#H--a0N4NN4r   stream
typing.Anyc                Z   	 |                                  }t          j        |          j        }n{# t          t
          f$ rg 	 |                                 }|                     dt          j                  }|                     |           n# t          t
          f$ r Y Y dS w xY wY nw xY w|S )zs
    Given a file-like stream object, return its length in number of bytes
    without reading it into memory.
    r   N)	filenorH   fstatst_sizeAttributeErrorOSErrortellseekSEEK_END)r   fdlengthoffsets       r   peek_filelike_lengthr   
  s    
]]__"%G$ 
 
 
	 [[]]F[[BK00FKK( 	 	 	444	  
 Ms4   -0 B(A	BB(B"B(!B""B('B(c                  6    e Zd Zd
dZddZddZd
dZd
dZd	S )Timerr#   floatc                   K   t          j                    }|dk    rdd l}|                                S dd l}|                                                                S )Ntrior   )sniffiocurrent_async_libraryr   current_timeasyncioget_event_looptime)selflibraryr   r   s       r   	_get_timezTimer._get_time$  sa      /11fKKK$$&&&NNN))++00222r   Nonec                6    t          j                    | _        d S r   r   perf_counterstartedr   s    r   
sync_startzTimer.sync_start/  s    (**r   c                H   K   |                                   d {V | _        d S r   r   r   r   s    r   async_startzTimer.async_start2  s-      !^^--------r   c                <    t          j                    }|| j        z
  S r   r   r   nows     r   sync_elapsedzTimer.sync_elapsed5  s    !!T\!!r   c                N   K   |                                   d {V }|| j        z
  S r   r   r   s     r   async_elapsedzTimer.async_elapsed9  s4      NN$$$$$$$$T\!!r   N)r#   r   )r#   r   )__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   #  sx        	3 	3 	3 	3+ + + +. . . ." " " "" " " " " "r   r   c                  R    e Zd ZdZddZdd
Zedd            ZddZddZ	ddZ
dS )
URLPatterna  
    A utility class currently used for making lookups against proxy keys...

    # Wildcard matching...
    >>> pattern = URLPattern("all://")
    >>> pattern.matches(httpx.URL("http://example.com"))
    True

    # Witch scheme matching...
    >>> pattern = URLPattern("https://")
    >>> pattern.matches(httpx.URL("https://example.com"))
    True
    >>> pattern.matches(httpx.URL("http://example.com"))
    False

    # With domain matching...
    >>> pattern = URLPattern("https://example.com")
    >>> pattern.matches(httpx.URL("https://example.com"))
    True
    >>> pattern.matches(httpx.URL("http://example.com"))
    False
    >>> pattern.matches(httpx.URL("https://other.com"))
    False

    # Wildcard scheme, with domain matching...
    >>> pattern = URLPattern("all://example.com")
    >>> pattern.matches(httpx.URL("https://example.com"))
    True
    >>> pattern.matches(httpx.URL("http://example.com"))
    True
    >>> pattern.matches(httpx.URL("https://other.com"))
    False

    # With port matching...
    >>> pattern = URLPattern("https://example.com:1234")
    >>> pattern.matches(httpx.URL("https://example.com:1234"))
    True
    >>> pattern.matches(httpx.URL("https://example.com"))
    False
    patternr.   r#   r   c                   ddl m} |rd|vrt          d| d| d           ||          }|| _        |j        dk    rdn|j        | _        |j        d	k    rdn|j        | _        |j        | _        |j        r|j        d	k    r	d | _        d S |j                            d
          r@t          j
        |j        dd                    }t          j        d| d          | _        d S |j                            d	          r@t          j
        |j        dd                    }t          j        d| d          | _        d S t          j
        |j                  }t          j        d| d          | _        d S )Nr   r   :zUProxy keys should use proper URL forms rather than plain scheme strings. Instead of "z", use "z://"r   r2   r   z*.   z^.+\.$z^(.+\.)?^)_urlsr	   rV   r   r}   r   r{   
host_regex
startswithr   r   compile)r   r   r	   rR   domains        r   __init__zURLPattern.__init__h  s    	s'))>&> >07> > >   c'llJ%//bbSZ(c//BBsx	H	x 	838s??:>DOOOX  && 	8Ysx|,,F j);&);););<<DOOOX  %% 	8Ysx|,,F j)>V)>)>)>??DOOO Ysx((F jV77DOOOr   r   r	   r    c                    | j         r| j         |j         k    rdS | j        r(| j        !| j                            |j                  sdS | j        | j        |j        k    rdS dS )NFT)r}   r   r   r<   r{   r   r   s     r   matcheszURLPattern.matches  sr    ; 	4;%,665I	+O))%*55 , 59 TY%*%<%<5tr   tuple[int, int, int]c                v    | j         dnd}t          | j                   }t          | j                   }|||fS )z
        The priority allows URLPattern instances to be sortable, so that
        we can match from most specific to least specific.
        Nr   r   )r{   lenr   r}   )r   port_priorityhost_priorityscheme_prioritys       r   priorityzURLPattern.priority  sB     "Y2TYt{+++}o>>r   intc                *    t          | j                  S r   )hashr   r   s    r   __hash__zURLPattern.__hash__  s    DL!!!r   c                "    | j         |j         k     S r   )r   r   s     r   __lt__zURLPattern.__lt__  s    }u~--r   r   c                L    t          |t                    o| j        |j        k    S r   )r'   r   r   r   s     r   __eq__zURLPattern.__eq__  s     %,,N1NNr   N)r   r.   r#   r   )r   r	   r#   r    )r#   r   )r#   r   )r   r   r#   r    )r   r   r#   r    )r   r   r   __doc__r   r   propertyr   r   r   r   r   r   r   r   r   >  s        ' 'R8 8 8 8<    ? ? ? X?" " " ". . . .O O O O O Or   r   r   c                    	 t          j        |                     d          d                    n# t          $ r Y dS w xY wdS N/r   FT)	ipaddressIPv4AddressrU   	Exceptionr   s    r   r   r     S    hnnS11!45555   uu4   -0 
>>c                    	 t          j        |                     d          d                    n# t          $ r Y dS w xY wdS r   )r   IPv6AddressrU   r   r   s    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:   r.   r   r.   r#   r$   )r#   r"   )r   r.   r#   rO   )r`   r.   r#   r"   )rj   rk   r#   rl   )rR   r	   r#   ru   )rR   r	   r   r	   r#   r    )rR   r	   r   r	   r#   r    )r#   r   )r   )r   r   r!   r.   r#   r$   )r   r   r!   r.   r#   r.   )r   r.   rn   r   r#   r   )r   r.   r#   r.   )r   r"   r#   r"   )r   r   r#   ru   )r   r.   r#   r    )4
__future__r   r6   email.messagerc   r   r   rH   r   r   typingpathlibr   urllib.requestr   r   _typesr   TYPE_CHECKINGr   r	   r?   updateranger   joinkeysrB   r*   r-   r4   r9   rD   rN   r_   rh   rp   rt   r~   r   r   r   r   ro   rq   r   r   r   r   r   r   r   r   r   r   <module>r     s   " " " " " "              				 				         % % % % % %  ! ! ! ! ! !	  +0v$>$> ! ! ( (GG%%//GGG   %"*IINN%F%K%K%M%MNNNOO    9 9 9 9 9 - - - - -      	( 	( 	( 	(	 	 	 	" " " "J1 1 1 1 %&;<    6 6 6 6      . . . .bG G G G GG G G G GG G G GB B B B      2" " " " " " " "6jO jO jO jO jO jO jO jOZ        r   