
    tc7C              	          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	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	 dCde
j        eef         dede
j         e         defdZ!	 dCde
j        eef         de
j         e         defdZ"dddefdZ#dedefdZ$dededefdZ%dZ&e&dz  Z'e&dz  Z(dede
j         e         fdZ) G d d          Z*de
j         e         fd Z+dede
j,        e
j-        eef                  fd!Z.d"ede
j         e         fd#Z/d$d%hZ0d&e
j1        e
j2        e
j3        e
j3        f                  de
j4        e
j2        e
j3        e
j3        f                  fd'Z5d(a6d)Z7 G d* d+ej8                  Z8dede8fd,Z9d-d.de
j         e:         fd/Z;d-d.d0d.defd1Z<d-d.d2d.defd3Z=de
j-        ee
j         e         f         fd4Z>dDde
j        eef         dedefd6Z?dDde
j        eef         dedefd7Z@ded8e
j3        de
j3        fd9ZAdedefd:ZBd;e
j         e         de
j         e         fd<ZCd=e
jD        de
j         e:         fd>ZE G d? d@          ZF G dA dB          ZGdS )E    N)Path)
getproxies   )PrimitiveDataURLz%22z\\)"\c                 `    i | ]+}|d k    t          |          d                    |          ,S )   z%{:02X})chrformat.0cs     ./usr/lib/python3/dist-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lowerencodingreturnc                     t          | t                    r| }n|                     |pd          }|r|                                n|S )zE
    Coerce str/bytes into a strictly byte-wise HTTP header key.
    ascii)
isinstancebytes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   c                 @    | 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 )strr   s    r   primitive_value_to_strr0   :   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_encodingr5   I   sA    h   uu4s    
%%namec                     dt           j        t                   dt          fd}t                              ||          }|  d| d                                S )z;
    Encode a name/value pair within a multipart form.
    matchr   c                 B    t           |                     d                   S )Nr   )!_HTML5_FORM_ENCODING_REPLACEMENTSgroup)r8   s    r   replacerz#format_form_param.<locals>.replacerY   s    0Q@@r   z="r	   )typingMatchr.   _HTML5_FORM_ENCODING_REsubr$   )r6   r   r<   s      r   format_form_paramrA   T   sk    
AS) Ac A A A A $''%88Ee%%'''r             datac                    | d d         }|t           j        t           j        fv rdS |d d         t           j        k    rdS |d d         t           j        t           j        fv rdS |                    t                    }|dk    rdS |dk    r,|d d d         t          k    rd	S |d
d d         t          k    rdS |dk    r*|d d         t          k    rdS |d
d          t          k    rdS d S )N   zutf-32rD   z	utf-8-sigrC   zutf-16r   utf-8z	utf-16-ber   z	utf-16-lez	utf-32-bez	utf-32-le)
r2   BOM_UTF32_LEBOM_UTF32_BEBOM_UTF8BOM_UTF16_LEBOM_UTF16_BEcount_null_null2_null3)rE   sample	nullcounts      r   guess_json_utfrT   f   s    "1"XF&%v':;;;xbqbzV_$${bqbzf)6+>???xU##IA~~wA~~##A#;&  ;!$Q$<6!!;A~~"1":;!"":;4r   c                       e Zd Zddej        ej        e                  ddfdZedej        e	j	                 fd            Z
dedej        ej        eef                  fdZdS )		NetRCInfoNfilesr   c                 H    |t          j        dd          ddg}|| _        d S )NNETRCr-   z~/.netrcz~/_netrc)osgetenvnetrc_files)selfrW   s     r   __init__zNetRCInfo.__init__   s-    =Yw++ZDE r   c                 F   t          | d          sd | _        | j        D ]|}t          |                                          }	 |                                r(t          j        t          |                    | _         na# t          j        t          f$ r Y yw xY w| j        S )N_netrc_info)
hasattrr`   r\   r   
expanduseris_filenetrcr.   NetrcParseErrorIOError)r]   	file_pathexpanded_paths      r   
netrc_infozNetRCInfo.netrc_info   s    t]++ 
	#D!-  	 $Y : : < <$,,.. +0;s=7I7I+J+J( -w7   D s   :B  BBhostc                     | j         d S | j                             |          }||d         d S |d         |d         fS )NrC   r   )ri   authenticators)r]   rj   	auth_infos      r   get_credentialszNetRCInfo.get_credentials   sK    ?"4O22488		! 44!il++r   N)__name__
__module____qualname__r=   OptionalListr.   r^   propertyrd   ri   Tuplern   r   r   r   rV   rV      s        ! !fofk#.>? !4 ! ! ! !
  FOEK8       X ,C ,FOFLc<R,S , , , , , ,r   rV   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)rZ   environr   rc   r.   is_dir)ssl_filessl_paths     r   get_ca_bundle_from_envr~      s    "*$$
?344 	!x== ##
>233?? 	!x== 4r   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   r-   urlz<> '"=)stripr   split
ValueErrorappend)	r   linksreplace_charsvalr   paramslinkparamkeys	            r   parse_header_linksr      s=     13E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_charsetr      s8     -


!
!C&C""4"000r   authorizationzproxy-authorizationitemsc              #      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)r   kvs      r   obfuscate_sensitive_headersr      sb         1!'')) 111
!<<<Ad



 r   F   c                   :    e Zd Zdedej        dej        ddfdZdS )Loggerr   argskwargsr   Nc                     d S ro   r   )r]   r   r   r   s       r   tracezLogger.trace   s    r   )rp   rq   rr   r.   r=   Anyr   r   r   r   r   r      sH        S  vz d      r   r   c                    t           sda t          j        t          d           t          j                            dd                                          }|dv rt          j        d          	                    |dk    rt          j
        nt                     t          j        t          j                  }|                    t          j        dd	
                                         |           t          j        |           dt"          dt$          j        dt$          j        ddffd}|_        t%          j        t,                    S )z
    Get a `logging.Logger` instance, and optionally
    set up debug logging based on the HTTPX_LOG_LEVEL environment variable.
    TTRACEHTTPX_LOG_LEVELr-   )DEBUGr   httpxr   z2%(levelname)s [%(asctime)s] %(name)s - %(message)sz%Y-%m-%d %H:%M:%S)fmtdatefmtr   r   r   r   Nc                 6     j         t          | g|R i | d S ro   )logTRACE_LOG_LEVEL)r   r   r   loggers      r   r   zget_logger.<locals>.trace  s-    
?G=d===f=====r   )_LOGGER_INITIALIZEDloggingaddLevelNamer   rZ   rz   getupper	getLoggersetLevelr   StreamHandlersysstderrsetFormatter	Formatter
addHandlerr.   r=   r   r   castr   )r6   	log_levelhandlerr   r   s       @r   
get_loggerr      sJ     '"_g666JNN#4b99??AA	***&w//FOOY'-A-AGMMWWW+CJ77G  !L/     g&&&t$$F>s >6: > > > > > > > > FL;vv&&&r   r   r   c                 X    | j         | j         S ddd                    | j                  S )NP     )httphttps)portr   scheme)r   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   rj   r   )r   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'
    Fr   r   r   r   )rj   r   r   )r   r   s     r   is_https_redirectr   $  sd     x8=  u 	
f 	-C  B&	-Ow&	- H%%,	r   c                  $   t                      } i }dD ]0}|                     |          r| |         }d|v r|nd| || d<   1d |                     dd                              d          D             }|D ]}|dk    ri c S |rd	|d
| <   |S )z+Gets proxy information from the environment)r   r   allz://zhttp://c                 6    g | ]}|                                 S r   )r   )r   rj   s     r   r   z+get_environment_proxies.<locals>.<listcomp>D  s     SSStdjjllSSSr   nor-   ,*Nzall://*)r   r   r   )
proxy_infomountsr   hostnameno_proxy_hostss        r   get_environment_proxiesr   3  s     J57F*  >>&!! 	!&)H!X--3GX3G3G f>>>" TSz~~dB/G/G/M/Mc/R/RSSSN" 0 0 s??
 III 	0 ,0F'X''(Mr   rH   c                 Z    t          | t                    r|                     |          n| S ro   r"   r.   r$   r(   s     r   to_bytesr   Y  s(    %/s%;%;F5<<!!!Fr   c                 Z    t          | t                    r| n|                     |          S ro   )r"   r.   decoder(   s     r   r   r   ]  s'    uc**F55X0F0FFr   r   c                 X    t          |t                    r| n|                                 S ro   r   )r   r   s     r   r   r   a  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   r/   s    r   unquoter   e  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   i  s,     O#H--a0N4NN4r   streamc                 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)	filenorZ   fstatst_sizeAttributeErrorOSErrortellseekSEEK_END)r   fdlengthoffsets       r   peek_filelike_lengthr   o  s    
]]__"%G$ 
 
 
	 [[]]F[[BK00FKK( 	 	 	444	  
 Ms4   -0 B(A	BB(B"B(!B""B('B(c                   B    e Zd ZdefdZddZddZdefdZdefdZdS )	Timerr   c                 4  K   t          j                    }|dk    rdd l}|                                S |dk    r6dd l}t          j        t          |                                 d {V           S dd l	}|
                                                                S )Ntrior   curio)sniffiocurrent_async_libraryr   current_timer   r=   r   floatclockasyncioget_event_looptime)r]   libraryr   r   r  s        r   	_get_timezTimer._get_time  s      /11fKKK$$&&&LLL;uEKKMM&9&9&9&9&9&9:::%%'',,...r   Nc                 6    t          j                    | _        d S ro   r  perf_counterstartedr]   s    r   
sync_startzTimer.sync_start  s    (**r   c                 H   K   |                                   d {V | _        d S ro   r	  r  r  s    r   async_startzTimer.async_start  s-      !^^--------r   c                 <    t          j                    }|| j        z
  S ro   r  r]   nows     r   sync_elapsedzTimer.sync_elapsed  s    !!T\!!r   c                 N   K   |                                   d {V }|| j        z
  S ro   r  r  s     r   async_elapsedzTimer.async_elapsed  s4      NN$$$$$$$$T\!!r   )r   N)	rp   rq   rr   r  r	  r  r  r  r  r   r   r   r   r     s        / / / / /+ + + +. . . ."e " " " ""U " " " " " "r   r   c                       e Zd ZdZdeddfdZdddefdZede	j
        eeef         fd	            Zdefd
Zdd defdZde	j        def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   Nc                    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   r-   r   z*.rC   z^.+\.$z^(.+\.)?^)_urlsr   r   r  r   rj   r   
host_regex
startswithr   r   compile)r]   r  r   r   domains        r   r^   zURLPattern.__init__  s    	s'))>&> >07> > >   c'llJ%//bbSZ(c//BBsx	H	x 	838s??DHDOOOX  && 	8Ysx|,,F j);&);););<<DOOOX  %% 	8Ysx|,,F j)>V)>)>)>??DOOO Ysx((F jV77DOOOr   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   rj   r!  r8   r   r]   r   s     r   matcheszURLPattern.matches  sr    ; 	4;%,665I	+O))%*55 , 59 TY%*%<%<5tr   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   lenrj   r   )r]   port_priorityhost_priorityscheme_prioritys       r   priorityzURLPattern.priority  sB     "Y2TYt{+++}o>>r   c                 *    t          | j                  S ro   )hashr  r  s    r   __hash__zURLPattern.__hash__
  s    DL!!!r   c                 "    | j         |j         k     S ro   )r-  r&  s     r   __lt__zURLPattern.__lt__  s    }u~--r   c                 L    t          |t                    o| j        |j        k    S ro   )r"   r  r  r&  s     r   __eq__zURLPattern.__eq__  s     %,,N1NNr   )rp   rq   rr   __doc__r.   r^   boolr'  ru   r=   rv   intr-  r0  r2  r   r4  r   r   r   r  r    s        ' 'R8 8 8 8 8 8<U t     ?&,sC}5 ? ? ? X?"# " " " ".L .T . . . .OFJ O4 O O O O O Or   r  ro   )rH   )Hr2   email.messager   r   r   rd   rZ   r   r   r  r=   pathlibr   urllib.requestr   r   _typesr   TYPE_CHECKINGr   r   r:   updateranger#  joinkeysr?   Unionr.   r#   r6  rs   r&   r)   r0   r5   rA   rO   rP   rQ   rT   rV   r~   rt   Dictr   r   r   Iterablerv   AnyStrIteratorr   r   r   r   r   r7  r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   <module>rF     sE              				 				 



         % % % % % %  ! ! ! ! ! !	  +0v$>$> ! ! ( (GG%%//GGG   %"*IINN%F%K%K%M%MNNNOO   &*9 9<U
#99 oc"9 	9 9 9 9" GK- -<U
#-/5s/C-
- - - -/ c         	(C 	( 	( 	( 	( 	( 	( 			 6?3#7    :, , , , , , , ,>	 4 	 	 	 	"c "fk&+c3h2G&H " " " "J1S 1V_S5I 1 1 1 1 %&;< ?6<v}(DEF_V\&-">?@         W^   'S 'V ' ' ' 'D6 66?3#7 6 6 6 6U 5 T    5 E d    #S&/#2F-F!G # # # #LG GFLe, G G% G G G GG G&,sEz* Gc G G G G GG3 Gv} G G G G GB3 B3 B B B B!5 &/#:N     0D    2" " " " " " " ">jO jO jO jO jO jO jO jO jO jOr   