
    N j0i                       S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
Jr  S SKJrJrJrJr  S SKrS SKrSSKJrJr  SSKJrJrJrJrJr  SS	KJr  S&S
 jr\" 5       r\R@                  " S5      r!\R@                  " S5      r"\(       a
   " S S5      r# " S S\$5      r%S r&Sr'Sr(Sr)Sr*Sr+Sr,Sr-Sr.Sr/Sr0\Rb                  " 5       S'S j5       r2S(S)S jjr3S*S jr4\Rb                  " 5       S 5       r5S r6\Rb                  " 5       S 5       r7\Rb                  " 5       S 5       r8\Rb                  " 5       S  5       r9S+S! jr: " S" S#5      r; " S$ S%5      r<g),    )annotationsN)SimpleCookie)Path)TYPE_CHECKINGAnyLiteralcast   )ffilib)	CurlECodeCurlHttpVersionCurlInfoCurlOpt
CurlWsFlag)CurlCffiWarningc                    S HS  n [         R                  R                  U 5      nU(       d  M+  [         R                  R	                  U5      (       d  MQ  Us  $    [
        R                  " 5       nUR                  (       a:  [         R                  R	                  UR                  5      (       a  UR                  $ [        R                  " 5       $ )N)SSL_CERT_FILECURL_CA_BUNDLEREQUESTS_CA_BUNDLE)
osenvirongetpathexistssslget_default_verify_pathscafilecertifiwhere)env_varr   defaultss      _/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/curl_cffi/curl.py_default_cacertr$      s    Lzz~~g&4BGGNN4((K M ++-H277>>(//:: ==?    s   HTTP/\d\.\d [0-9]{3} (.*)s   HTTP/(\d\.\d) ([0-9]{3}) (.*)c                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   Srg	)
CurlWsFrame,   intageflagsoffset	bytesleftlen N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r/   r%   r#   r'   r'   ,   s    
r%   r'   c                  @   ^  \ rS rSrSr S     SU 4S jjjrSrU =r$ )	CurlError4   z$Base exception for curl_cffi packagec                :   > [         TU ]  " U/UQ70 UD6  X l        g N)super__init__code)selfmsgr=   argskwargs	__class__s        r#   r<   CurlError.__init__7   s!     	.t.v.26	r%   r=   )r   )r?   strr=   zint | CurlECode | Literal[0]returnNone)r0   r1   r2   r3   __doc__r<   r5   __classcell__)rB   s   @r#   r7   r7   4   s-    . >?77:7	7 7r%   r7                  i  l    i   c                r    [         R                  " U5      n[         R                  " X#5      SS nU" X5        g)z ffi callback for curl debug infoNr   )r   from_handlebuffer)curltype_datasizeclientpcallbacktexts          r#   debug_functionrY   L   s0     w'H::d!!$DUr%   c                P   ^ U(       a  SOSmSR                  U4S jU  5       5      $ )u   
Convert a bytes object to a space-separated hex string, e.g. "0a ff 3c".
If uppercase=True, letters will be A–F instead of a–f.
z{:02X}z{:02x} c              3  F   >#    U  H  nTR                  U5      v   M     g 7fr:   )format).0bytefmts     r#   	<genexpr>bytes_to_hex.<locals>.<genexpr>[   s     3CJJt$$s   !)join)b	uppercaser`   s     @r#   bytes_to_hexrf   U   s#    
  (XC883333r%   c                   [         S[        S[        S[        S[        S[
        S[        S0nSnUR                  U S5      nU [
        [        4;   aU  [        US U 5      n[        U5      U::  a  S	OS
n[        R                  R                  U S[        U5       SU U S35        g  UR                  S5      n[        R                  R                  U SU 35        U [         [        [        4;  a   [        R                  R                  S5        g g ! [         aW    [        US U 5      n[        U5      U::  a  S	OS
n[        R                  R                  U S[        U5       SU U S35         g f = f)N*<>z< DATAz> DATAz< SSLz> SSL(    z...z [z	 bytes]: 
zutf-8r[   )CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTr   rf   r.   sysstderrwritedecodeUnicodeDecodeError)rS   rT   PREFIXESMAX_SHOW_BYTESprefixhex_strpostfixrX   s           r#   debug_function_defaultr   ^   s_   sCS(8gwH N\\%%F %'<==tO^45D	^3"

F82c$i[	'7)2NO		T;;w'DJJxq/0],>@STT

  & U! 	T"4#89GI7bUGJJxr#d)IgYwirRS		Ts   'A)D AE32E3c                    [         R                  " U5      nUR                  [         R                  " X5      SS 5        X!-  $ )zAffi callback for curl write function, directly writes to a bufferN)r   rP   rw   rQ   )ptrrU   nmembuserdatarQ   s        r#   buffer_callbackr   }   s4     __X&F
LLC'*+<r%   c                (    U (       d  g[        U 5      $ Nr   )r)   )ss    r#   
ensure_intr      s    q6Mr%   c                    [         R                  " U5      nU" [         R                  " X5      SS 5      n[        U5      nU[        :X  d
  U[
        :X  a  U$ XRU-  :w  a  [        R                  " S[        SS9  X!-  $ )zHffi callback for curl write function, calls the callback python functionNzWrote bytes != received bytes.rJ   
stacklevel)	r   rP   rQ   r   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnr   )r   rU   r   r   rW   wrotes         r#   write_callbackr      sn     x(HSZZ+A./EuE$$1E(E6TUV<r%   c                   [         R                  " U5      nX-  nUR                  U5      nUc  g[        U[        5      (       a  U$ [        U[
        5      (       a  UR                  5       nU(       d  g[        U5      U:  a  [        S[        U5       SU S35      e[         R                  " X[        U5      5        [        U5      $ )zIffi callback for curl read function, reads from a buffer/file-like objectr   Read callback returned  bytes, but only  bytes are allowed.)
r   rP   read
isinstancer)   rE   encoder.   r7   memmove)r   rU   r   r   rQ   max_lenrT   s          r#   read_buffer_callbackr      s     __X&FlG;;wD|$${{}
4y7%c$i[0A'J]^
 	
 KK3t9%t9r%   c                   [         R                  " U5      nX-  nU" U5      nUc  g[        U[        5      (       a  U$ [        U[        5      (       a  UR                  5       nU(       d  g[        U5      U:  a  [        S[        U5       SU S35      e[         R                  " X[        U5      5        [        U5      $ )zGffi callback for curl read function, calls the callback python functionr   r   r   r   )	r   rP   r   r)   rE   r   r.   r7   r   )r   rU   r   r   rW   r   rT   s          r#   read_callbackr      s     x(HlGGD|$${{}
4y7%c$i[0A'J]^
 	
 KK3t9%t9r%   c                    / nU nU(       aD  UR                  [        R                  " UR                  5      5        UR                  nU(       a  MD  [
        R                  " U 5        U$ )z%Converts curl slist to a python list.)appendr   stringrT   nextr   curl_slist_free_all)headresultr   s      r#   slist_to_listr      sM    F
C
cjj*+hh # D!Mr%   c                  Z   \ rS rSrSrSrSSS jjrSS jrSS jrSS jr	S S	 jr
S!S
 jrS"S jrS#S jrS$S jrS%S&S jjrSS jrS'S(S jjrS)S jr S'     S(S jjrS*S jrSS jrS+S jr\S,S j5       r\S-S j5       rSS jrS.S jr\R:                  4     S/S jjrS0S1S jjrSr g)2Curl   z3
Wrapper for ``curl_easy_*`` functions of libcurl.
i   Nc                   U(       a  UO[         R                  " 5       U l        [        R                  U l        [        R                  U l        [        R                  U l        U=(       d    [        U l	        SU l
        SU l        SU l        SU l        SU l        SU l        SU l        [        R"                  " SS5      U l        X l        U R)                  5         [        R"                  " SU R*                  5      U l        [        R"                  " S5      U l        [        R"                  " S5      U l        [        R"                  " S5      U l        g)z
Parameters:
    cacert: CA cert path to use, by default, certs from ``certifi`` are used.
    debug: whether to show curl debug messages.
    handle: a curl handle instance from ``curl_easy_init``.
FNzchar[]   zsize_t *zstruct curl_ws_frame **)r   curl_easy_init_curlr   NULL_headers_proxy_headers_resolveDEFAULT_CACERT_cacert_is_cert_set_skip_cacert_write_handle_header_handle_debug_handle_body_handle_read_handlenew_error_buffer_debug_set_error_buffer_WS_RECV_BUFFER_SIZE_ws_recv_buffer_ws_recv_n_recv_ws_recv_p_frame_ws_send_n_sent)r>   cacertdebughandles       r#   r<   Curl.__init__   s      &V3+=+=+?
!hh/!!"&#'"&!%!% WWXs3   #wwx1J1JK"wwz2 #(A B"wwz2r%   c                    [         R                  " U R                  [        R                  U R
                  5      nUS:w  a  [        R                  " S[        SS9  U R                  (       a  U R                  5         g g )Nr   zFailed to set error bufferrJ   r   )r   _curl_easy_setoptr   r   ERRORBUFFERr   r   r   r   r   r   r>   rets     r#   r   Curl._set_error_buffer   sT    ##DJJ0C0CTEWEWX!8MM6TUV;;JJL r%   c                    U R                  [        R                  S5        U R                  [        R                  S5        g)zSet debug to Truer
   TN)setoptr   VERBOSEDEBUGFUNCTIONr>   s    r#   r   
Curl.debug   s(    GOOQ'G))40r%   c                $    U R                  5         g r:   closer   s    r#   __del__Curl.__del__      

r%   c                B    US:X  a  g U R                   " U/UQ76 nUb  Ueg r   )
_get_error)r>   errcoder@   errors       r#   _check_errorCurl._check_error  s/    a</$/K r%   c           	        US:w  az  [         R                  " U R                  5      R                  SS9nSR	                  U Vs/ s H  n[        U5      PM     sn5      n[        SU SU SU S3[        [        U5      S	9$ g s  snf )
Nr   backslashreplaceerrorsr[   z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.rD   )	r   r   r   rx   rc   rE   r7   r	   r   )r>   r   r@   errmsgaactions         r#   r   Curl._get_error  s    a<ZZ 2 23::BT:UFXXt4t!s1vt45FVHIgYb A  )W-	  4s   Bc                   U R                   c  gSSSSSS.nUR                  US-  S-  5      nUS:X  d  US:X  a  [        R                  " XB5      nGOU[        R
                  :X  a\  [        R                  " U5      nXPl        [        R                  " U R                   [        R                  [        R                  5        GOhU[        R                  :X  a\  [        R                  " U5      nXPl        [        R                  " U R                   [        R                  [        R                  5        GOU[        R                  :X  a\  [        R                  " U5      nXPl        [        R                  " U R                   [        R"                  [        R$                  5        GOU[        R                  :X  al  [        R                  " U5      nXPl        [        R                  " U R                   [        R                  [        R&                  5        [        R
                  nGOU[        R                  :X  al  [        R                  " U5      nXPl        [        R                  " U R                   [        R                  [        R&                  5        [        R                  nGOU[        R"                  :X  al  [        R                  " U5      nXPl        [        R                  " U R                   [        R"                  [        R(                  5        [        R                  nGOU[        R*                  :X  aw  USL a  [,        n[        R                  " U5      nXPl        [        R                  " U R                   [        R*                  [        R0                  5        [        R2                  nGO}US:X  Gah  [5        U[6        5      (       Ga5  [        R8                  [        R:                  [        R<                  [        R>                  [        R@                  [        RB                  [        RD                  [        RF                  [        RH                  [        RJ                  [        RL                  [        RN                  [        RP                  [        RR                  1n[T        RV                  RY                  S	5      (       a,  X;   a'  [Z        R\                  " S
5      nUR_                  USS9nOUR_                  5       nOUnU[        R`                  :X  a  XPl1        O[e        SU 35      eU[        Rf                  :X  a\  U H)  n[        Rh                  " U Rj                  U5      U l5        M+     [        R                  " U R                   XRj                  5      n	GO$U[        Rl                  :X  a[  U H)  n
[        Rh                  " U Rn                  U
5      U l7        M+     [        R                  " U R                   XRn                  5      n	OU[        Rp                  :X  a  U HN  n[5        U[6        5      (       a  UR_                  5       n[        Rh                  " U Rr                  U5      U l9        MP     [        R                  " U R                   XRr                  5      n	O![        R                  " U R                   X5      n	U Ru                  U	SX5        U[        R8                  :X  a  SU l;        U	$ )zWrapper for ``curl_easy_setopt``.

Args:
    option: option to set, using constants from CurlOpt enum
    value: value to set, strings will be handled automatically

Returns:
    0 if no error, see ``CurlECode``.
r   long*zchar*zvoid*int64_t*)r   '  i N  i0u  i@  r   TwinFstrictr   zOption unsupported: r   )<r   r   r   r   r   	WRITEDATA
new_handler   r   r   WRITEFUNCTIONr   
HEADERDATAr   HEADERFUNCTIONREADDATAr   READFUNCTIONr   r   r   r   r   r   rY   	DEBUGDATAr   rE   CAINFOCAPATHPROXY_CAINFOPROXY_CAPATHSSLCERTSSLKEYCRLFILE
ISSUERCERTSSH_PUBLIC_KEYFILESSH_PRIVATE_KEYFILE
COOKIEFILE	COOKIEJAR
NETRC_FILEUNIX_SOCKET_PATHru   platform
startswithlocalegetpreferredencodingr   
POSTFIELDSr   NotImplementedError
HTTPHEADERcurl_slist_appendr   PROXYHEADERr   RESOLVEr   r   r   )r>   optionvalueinput_option
value_typec_valuefilepath_optsencheaderr   proxy_headerresolves               r#   r   Curl.setopt  s    :: 
 "%%v%&?@
 J*$<ggj0Gw(((nnU+G!(!!

G1133F3F w)))nnU+G")!!

G22C4G4G w'''nnU+G '!!

G00#2J2J w,,,nnU+G!(!!$**g.C.CSEWEWX&&Fw---nnU+G")!!

G22C4F4F ''Fw+++nnU+G '!!$**g.B.BCDUDUV%%Fw,,,}.nnU+G!(!!$**g.C.CSEWEWX&&F7"%%%
 NNNN((((OONNOO&&..//&&%%&&,,!  <<**511f6M 55e<C#ll3xl@G#llnG+++$+!%(<VH&EFFW''' # 5 5dmmV L  ''

FMMJCw*** %&)&;&;'''# !& ''

F<O<OPCw& gs++%nn.G # 5 5dmmW M ! ''

FMMJC''

FDC#x7W^^# $D
r%   c                   SSSSSSS.n[         R                  [        [        [        [        [        S.nUS-  nU R
                  c  US:X  a  g	X4   " 5       $ [         R                  " X$   5      n[        R                  " U R
                  X5      nU R                  US
U5        US:X  a  [        US   5      $ US   [         R                  :X  a  g	X4   " US   5      $ )zWrapper for ``curl_easy_getinfo``. Gets information in response after
curl.perform.

Parameters:
    option: option to get info of, using constants from ``CurlInfo`` enum

Returns:
    value retrieved from last perform.
zchar**r   zdouble*zstruct curl_slist **r   )   i    i  0   @ i  P i  ` i   r  r%   getinfor  r   )r   r   r)   floatlistr   r   r   curl_easy_getinfor   r   r   )r>   r  
ret_optionret_cast_optionoption_typer  r   s          r#   r  Curl.getinfo  s     , 

 jj
 x'::h&"/11''*12##DJJ@#y&1(" ,,1:!+GAJ77r%   c                T    [         R                  " [        R                  " 5       5      $ )z#Get the underlying libcurl version.)r   r   r   curl_versionr   s    r#   versionCurl.version  s    zz#**,--r%   c                    U R                   c  g[        R                  " U R                   UR                  5       [	        U5      5      $ )zSet the browser type to impersonate.

Parameters:
    target: browser to impersonate.
    default_headers: whether to add default headers, like User-Agent.

Returns:
    0 if no error.
r   )r   r   curl_easy_impersonater   r)   )r>   targetdefault_headerss      r#   impersonateCurl.impersonate  s:     ::((JJ_)=
 	
r%   c                <   U R                   (       a  g U R                  (       dy  U R                  [        R                  U R
                  5      nU R                  US5        U R                  [        R                  U R
                  5      nU R                  US5        g g )Nz
set cacertzset proxy cacert)r   r   r   r   r   r   r   r   r   s     r#   _ensure_cacertCurl._ensure_cacert  so      ++gnndll;Cc<0++g22DLLACc#56	 !r%   c                   U R                   c  [        S5      eU R                  5         [        R                  " U R                   5      n U R                  US5        U R                  X5        g! U R                  X5        f = f)zWrapper for ``curl_easy_perform``, performs a curl request.

Parameters:
    clear_headers: clear header slist used in this perform
    clear_resolve: clear resolve slist used in this perform

Raises:
    CurlError: if the perform was not successful.
Nz(Cannot perform request on closed handle.perform)r   r7   r.  r   curl_easy_performr   clean_handles_and_buffers)r>   clear_headersclear_resolver   s       r#   r1  Curl.perform  ss     ::FGG 	 ##DJJ/	Ic9- **=HD**=Hs   
A. .Bc                ^    U R                   c  g[        R                  " U R                   5      $ r   )r   r   curl_easy_upkeepr   s    r#   upkeepCurl.upkeep  s$    ::##DJJ//r%   c                Z   SU l         SU l        SU l        SU l        SU l        U(       aS  U R
                  [        R                  :w  a   [        R                  " U R
                  5        [        R                  U l        U(       a  U R                  [        R                  :w  a   [        R                  " U R                  5        [        R                  U l
        U R                  [        R                  :w  a   [        R                  " U R                  5        [        R                  U l        gg)zmClean up handles and buffers after ``perform`` and ``close``,
called at the end of ``perform`` and ``close``.N)r   r   r   r   r   r   r   r   r   r   r   r   )r>   r4  r5  s      r#   r3  Curl.clean_handles_and_buffers  s    
 ""!  }}(''6HHDM}}(''6HHDM""chh.''(;(;<"%((D r%   c                    U R                   c  [        S5      e[        R                  " U R                   5      n[	        U R
                  U R                  US9nU$ )zWrapper for ``curl_easy_duphandle``.

This is not a full copy of entire curl object in python. For example, headers
handle is not copied, you have to set them again.zCannot duplicate closed handle.)r   r   r   )r   r7   r   curl_easy_duphandler   r   r   )r>   r   cs      r#   	duphandleCurl.duphandle  sI    
 ::=>>,,TZZ8
DKK
Kr%   c                    SU l         SU l        U R                  b0  [        R                  " U R                  5        U R                  5         [        R                  U l        g)z8Reset all curl options, wrapper for ``curl_easy_reset``.FN)	r   r   r   r   curl_easy_resetr   r   r   r   r   s    r#   reset
Curl.reset'  sE    !!::!

+""$r%   c                    [        5       nU HK  nUR                  5       R                  S5      (       d  M)  UR                  USS R	                  5       5        MM     U$ )zExtract ``cookies.SimpleCookie`` from header lines.

Parameters:
    headers: list of headers in bytes.

Returns:
    A parsed cookies.SimpleCookie instance.
s   set-cookie:    N)r   lowerr  loadrx   )r>   headerscookier  s       r#   parse_cookie_headersCurl.parse_cookie_headers0  sN      ,~F||~((99F23K..01  r%   c                `    [         R                  U 5      nU(       a  UR                  S5      $ S$ )zLExtract reason phrase, like ``OK``, ``Not Found`` from response status
line.r
   r%   )REASON_PHRASE_REmatchgroup)status_linems     r#   get_reason_phraseCurl.get_reason_phrase?  s)     "";/qwwqz'C'r%   c                   [         R                  U 5      nU(       d  [        R                  SS4$ UR	                  S5      S:X  a  [        R
                  nO\UR	                  S5      S:X  a  [        R                  nO6UR	                  S5      S:X  a  [        R                  nO[        R                  n[        UR	                  S5      5      nUR	                  S5      nX#U4$ )	zNParse status line.

Returns:
    http_version, status_code, and reason phrase
r   r%   r
   z2.0z1.1z1.0rJ   rK   )	STATUS_LINE_RErP  r   V1_0rQ  V2_0V1_1NONEr)   )rR  rS  http_versionstatus_codereasons        r#   parse_status_lineCurl.parse_status_lineF  s       -"''C//771:*//LWWQZ5 *//LWWQZ5 *//L*//L!''!*o&00r%   c                >   U R                  5         U R                  (       a'  [        R                  " U R                  5        SU l        [        R
                  " U R                  5        U R                  b(  [        R
                  " U R                  5        SU l        gg)zAClose and cleanup curl handle, wrapper for ``curl_easy_cleanup``.N)r3  r   r   curl_easy_cleanupr   releaser   r   r   s    r#   r   
Curl.close]  sk    &&(::!!$**-DJD&&'+KK,,-#'D  ,r%   c                z   U R                   c  [        S5      e[        R                  " U R                   U R                  U R
                  U R                  U R                  5      =n(       a  U R                  US5        [        R                  " U R                  5      SU R                  S    U R                  S   4$ )zReceive a frame from a websocket connection.

Returns:
    a tuple of frame content and curl frame meta struct.

Raises:
    CurlError: if failed.
Nz/Cannot receive websocket data on closed handle.WS_RECVr   )r   r7   r   curl_ws_recvr   r   r   r   r   r   rQ   r   s     r#   ws_recvCurl.ws_recvj  s     ::MNN""JJ  %%  !!
 
3 
 c9- JJt++,-Ft/C/CA/FG!!!$
 	
r%   c                   U R                   c  [        S5      e[        R                  " U R                   [        R
                  " U5      [        U5      U R                  SU5      =n(       a  U R                  US5        U R                  S   $ )zSend data to a websocket connection.

Args:
    payload: content to send.
    flags: websocket flag to set for the frame, default: binary.

Returns:
    The number of bytes sent.

Raises:
    CurlError: if failed.
z,Cannot send websocket data on closed handle.r   WS_SEND)	r   r7   r   curl_ws_sendr   from_bufferr.   r   r   )r>   payloadr+   r   s       r#   ws_sendCurl.ws_send  s     ::JKK""JJOOG$L  
 
3 
 c9-##A&&r%   c                r    [         R                  " SU5      U-   nU R                  U[        R                  S9$ )aC  Close a websocket connection. Shorthand for :meth:`ws_send`
with close code and message. Note that to completely close the connection,
you must close the curl handle after this call with :meth:`close`.

Args:
    code: close code.
    message: close message.

Returns:
    0 if no error.

Raises:
    CurlError: if failed.
z!H)r+   )structpackro  r   CLOSE)r>   r=   messagern  s       r#   ws_closeCurl.ws_close  s2     ++dD)G3||G:+;+;|<<r%   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )rl   FN)r   rE   r   boolrF   rG   rF   rG   )r   r)   r@   r   rF   rG   )r   r)   r@   r   )r  r   r  r   rF   r)   )r  r   rF   z%bytes | int | float | list[str | int])rF   bytes)T)r)  rE   r*  rx  rF   r)   )TT)r4  rx  r5  rx  rF   rG   )rF   r)   )rF   r   )rJ  list[bytes]rF   r   )rR  rz  rF   rz  )rR  rz  rF   z"tuple[CurlHttpVersion, int, bytes])rF   ztuple[bytes, CurlWsFrame])rn  zbytes | memoryviewr+   zCurlWsFlag | intrF   r)   )i  r%   )r=   r)   ru  rz  rF   r)   )!r0   r1   r2   r3   rH   r   r<   r   r   r   r   r   r   r  r%  r+  r.  r1  r9  r3  r@  rD  rL  staticmethodrT  r_  r   rh  r   BINARYro  rv  r5   r/   r%   r#   r   r      s     &3<1
	B+8Z.
 7I20 AE+!+9=+	+2	! ( ( 1 1,(
8 FPEVEV')'2B'	':= =r%   r   c                      \ rS rSrSrSSS jjrSSSSS.           SS jjr\SS j5       rSSS jjr	SS	 jr
SS
 jrSrg)CurlMimei  z#Wrapper for the ``curl_mime_`` API.Nc                    U(       a  UO	[        5       U l        [        R                  " U R                  R                  5      U l        g)z'
Args:
    curl: Curl instance to use.
N)r   r   r   curl_mime_init_form)r>   rR   s     r#   r<   CurlMime.__init__  s-    
 "Ttv
''

(8(89
r%   )content_typefilename
local_pathrT   c                  [         R                  " U R                  5      n[         R                  " XaR	                  5       5      nUS:w  a  [        S5      eUb5  [         R                  " XbR	                  5       5      nUS:w  a  [        S5      eUb5  [         R                  " XcR	                  5       5      nUS:w  a  [        S5      eU(       a  U(       a  [        S5      eUb  [        U[        5      (       a  [        U5      nO([        U[        5      (       a  UR                  5       nOUn[        U5      R                  5       (       d  [        SU 35      e[         R                  " XhR	                  5       5      nUS:w  a  [        S5      eUbO  [        U[        5      (       d  [        U5      R	                  5       n[         R                   " Xe[#        U5      5      ngg)aM  Add a mime part for a mutlipart html form.

Note: You can only use either local_path or data, not both.

Args:
    name: name of the field.
    content_type: content_type for the field. for example: ``image/png``.
    filename: filename for the server.
    local_path: file to upload on local disk.
    data: file content to upload.
r   zAdd field failed.Nz1Can not use local_path and data at the same time.zFile not found at )r   curl_mime_addpartr  curl_mime_namer   r7   curl_mime_typecurl_mime_filenamer   r   rE   rz  rx   r   FileNotFoundErrorcurl_mime_filedatacurl_mime_datar.   )	r>   namer  r  r  rT   partr   local_path_strs	            r#   addpartCurlMime.addpart  s   ( $$TZZ0  {{}5!8/00 #$$T+>+>+@ACax 344 ((/@ACax 344$OPP !*d++!$ZJ..!+!2!2!4!+'..00'*<^<L(MNN((/D/D/FGCax 344dE**4y'')$$TT;C r%   c                J    U " 5       nU H  nUR                   " S0 UD6  M     U$ )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``r/   )r  )clsfilesformfiles       r#   	from_listCurlMime.from_list  s)     uDLL 4  r%   c                    U(       a  UOU R                   nUR                  [        R                  U R                  5        g)z,Attach the mime instance to a curl instance.N)r   r   r   MIMEPOSTr  )r>   rR   r?  s      r#   attachCurlMime.attach  s'    Ddjj	!!4::.r%   c                n    [         R                  " U R                  5        [        R                  U l        g)zjClose the mime instance and underlying files. This method must be called
after ``perform`` or ``request``.N)r   curl_mime_freer  r   r   r   s    r#   r   CurlMime.close
  s!     	4::&XX
r%   c                $    U R                  5         g r:   r   r   s    r#   r   CurlMime.__del__  r   r%   )r   r  r:   )rR   Curl | None)r  rE   r  
str | Noner  r  r  zstr | bytes | Path | NonerT   zbytes | NonerF   rG   )r  z
list[dict])rR   r  rF   rG   ry  )r0   r1   r2   r3   rH   r<   r  classmethodr  r  r   r   r5   r/   r%   r#   r  r    s{    -: $(#04!;<;< !	;<
 ;< .;< ;< 
;<z  /
r%   r  )rF   rE   )rS   r)   rU   r)   rF   r)   )F)rd   rz  re   rx  rF   rE   )rS   r)   rT   rz  rF   rG   )rF   r{  )=
__future__r   r  rerr  r   ru   r   http.cookiesr   pathlibr   typingr   r   r   r	   r   r   _wrapperr   r   constr   r   r   r   r   utilsr   r$   r   compilerO  rW  r'   	Exceptionr7   rn   ro   rp   rq   rr   rs   rt   r   r   CURL_READFUNC_ABORTCURL_READFUNC_PAUSE
def_externrY   rf   r   r   r   r   r   r   r   r   r  r/   r%   r#   <module>r     sw   "  	  
 
  %  4 4 	   L L "  !"::;< => 7	 7       ! !       4T>      *  ,_= _=D\ \r%   