
    ei0i                       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m	Z	 d dl
mZ d dlmZmZmZmZ d dl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 dd	lmZ d3dZ e            Z ej         d          Z! ej         d          Z"er G d d          Z# G d de$          Z%d Z&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0 ej1                    d4d            Z2d5d6d$Z3d7d'Z4 ej1                    d(             Z5d) Z6 ej1                    d*             Z7 ej1                    d+             Z8 ej1                    d,             Z9d8d.Z: G d/ d0          Z; G d1 d2          Z<dS )9    )annotationsN)SimpleCookie)Path)TYPE_CHECKINGAnyLiteralcast   )ffilib)	CurlECodeCurlHttpVersionCurlInfoCurlOpt
CurlWsFlag)CurlCffiWarningreturnstrc                 D   dD ]F} t           j                            |           }|r#t           j                            |          r|c S Gt          j                    }|j        r+t           j                            |j                  r|j        S t          j	                    S )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      9/usr/local/lib/python3.11/dist-packages/curl_cffi/curl.py_default_cacertr&      s    L  z~~g&& 	BGNN4(( 	KKK +--H 27>>(/::  =??    s   HTTP/\d\.\d [0-9]{3} (.*)s   HTTP/(\d\.\d) ([0-9]{3}) (.*)c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )CurlWsFrameintageflagsoffset	bytesleftlenN)__name__
__module____qualname____annotations__ r'   r%   r)   r)   ,   s=         


r'   r)   c                  (     e Zd ZdZ	 d
d fd	Z xZS )	CurlErrorz$Base exception for curl_cffi packager   msgr   codeint | CurlECode | Literal[0]r   Nonec                P     t                      j        |g|R i | || _        d S N)super__init__r8   )selfr7   r8   argskwargs	__class__s        r%   r>   zCurlError.__init__7   s7     	.t...v...26			r'   )r   )r7   r   r8   r9   r   r:   )r0   r1   r2   __doc__r>   __classcell__)rB   s   @r%   r6   r6   4   sM        .. >?7 7 7 7 7 7 7 7 7 7 7r'   r6                  i  l    i   type_r*   sizec                    t          j        |          }t          j        ||          dd         } |||           dS )z ffi callback for curl debug infoNr   )r   from_handlebuffer)curlrJ   datarK   clientpcallbacktexts          r%   debug_functionrT   L   sD     w''H:dD!!!!!$DHUD1r'   Fbbytes	uppercaseboolc                R    |rdndd                     fd| D                       S )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  B   K   | ]}                     |          V  d S r<   )format).0bytefmts     r%   	<genexpr>zbytes_to_hex.<locals>.<genexpr>[   s/      33CJJt$$333333r'   )join)rU   rW   r_   s     @r%   bytes_to_hexrb   U   s:    
  
-((XC883333333333r'   rP   r:   c                X   t           dt          dt          dt          dt          dt
          dt          di}d}|                    | d          }| t
          t          fv rgt          |d |                   }t          |          |k    rd	nd
}t          j                            | dt          |           d| | d           d S 	 |                    d          }t          j                            | d|            | t           t          t          fvr!t          j                            d           d S d S # t          $ ri t          |d |                   }t          |          |k    rd	nd
}t          j                            | dt          |           d| | d           Y d S w xY w)N*<>z< DATAz> DATAz< SSLz> SSL(    z...z [z	 bytes]: 
zutf-8rZ   )CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTr   rb   r/   sysstderrwritedecodeUnicodeDecodeError)rJ   rP   PREFIXESMAX_SHOW_BYTESprefixhex_strpostfixrS   s           r%   debug_function_defaultr{   ^   s   sCS(8gwH N\\%%%F %'<===tO^O455D		^33""
FNNc$iiNN'N7NNNOOOOO		T;;w''DJ////000],>@STTT
  &&&&& UT! 	T 	T 	T"4#899GII77bbUGJRR#d))RRgRwRRRSSSSSS		Ts   A.D6 6A/F)(F)c                    t          j        |          }|                    t          j        | |          dd                    ||z  S )zAffi callback for curl write function, directly writes to a bufferN)r   rM   rs   rN   )ptrrK   nmembuserdatarN   s        r%   buffer_callbackr   }   sD     _X&&F
LLC''*+++4<r'   c                (    | sdS t          |           S Nr   )r*   )ss    r%   
ensure_intr      s     qq66Mr'   c                   t          j        |          } |t          j        | |          dd                   }t          |          }|t          k    s|t
          k    r|S |||z  k    rt          j        dt          d           ||z  S )zHffi callback for curl write function, calls the callback python functionNzWrote bytes != received bytes.rE   
stacklevel)	r   rM   rN   r   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnr   )r}   rK   r~   r   rR   wrotes         r%   write_callbackr      s     x((HHSZU++AAA.//EuE$$$1E(E(E6TUVVVV4<r'   c                   t          j        |          }||z  }|                    |          }|dS t          |t                    r|S t          |t
                    r|                                }|sdS t          |          |k    r#t          dt          |           d| d          t          j	        | |t          |                     t          |          S )zIffi callback for curl read function, reads from a buffer/file-like objectNr   Read callback returned  bytes, but only  bytes are allowed.)
r   rM   read
isinstancer*   r   encoder/   r6   memmove)r}   rK   r~   r   rN   max_lenrP   s          r%   read_buffer_callbackr      s     _X&&FUlG;;wD|q$ $ {{}} q
4yy7^c$ii^^'^^^
 
 	
 KT3t99%%%t99r'   c                   t          j        |          }||z  } ||          }|dS t          |t                    r|S t          |t                    r|                                }|sdS t          |          |k    r#t          dt          |           d| d          t          j        | |t          |                     t          |          S )zGffi callback for curl read function, calls the callback python functionNr   r   r   r   )	r   rM   r   r*   r   r   r/   r6   r   )r}   rK   r~   r   rR   r   rP   s          r%   read_callbackr      s     x((HUlG8GD|q$ $ {{}} q
4yy7^c$ii^^'^^^
 
 	
 KT3t99%%%t99r'   list[bytes]c                    g }| }|r5|                     t          j        |j                             |j        }|5t          j        |            |S )z%Converts curl slist to a python list.)appendr   stringrP   nextr   curl_slist_free_all)headresultr}   s      r%   slist_to_listr      s[    F
C
 cj**+++h   D!!!Mr'   c                     e Zd ZdZdZd@dAdZdBdZdBdZdBdZdCdZ	dDdZ
dEdZdFdZdGdZdHdId"ZdBd#ZdJdKd&ZdLd'Z	 dJdKd(ZdMd)ZdBd*ZdNd.ZedOd0            ZedPd2            ZdBd3ZdQd5Zej        fdRd:ZdSdTd?ZdS )UCurlz;
    Wrapper for ``curl_easy_*`` functions of libcurl.
    i   rh   FNcacertr   debugrX   r   r:   c                `   |r|nt          j                    | _        t          j        | _        t          j        | _        t          j        | _        |pt          | _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        t          j        dd          | _        || _        |                                  t          j        d| j                  | _        t          j        d          | _        t          j        d          | _        t          j        d          | _        dS )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?   r   r   handles       r%   r>   zCurl.__init__   s      &?VV3+=+?+?
!h/!!"&#'"&!%!% WXs33     #wx1JKK"wz22 #(A B B"wz22r'   c                    t          j        | j        t          j        | j                  }|dk    rt          j        dt          d           | j	        r| 
                                 d S d S )Nr   zFailed to set error bufferrE   r   )r   _curl_easy_setoptr   r   ERRORBUFFERr   r   r   r   r   r   r?   rets     r%   r   zCurl._set_error_buffer   se    #DJ0CTEWXX!88M6TUVVVV; 	JJLLLLL	 	r'   c                    |                      t          j        d           |                      t          j        d           dS )zSet debug to Truer
   TN)setoptr   VERBOSEDEBUGFUNCTIONr?   s    r%   r   z
Curl.debug   s5    GOQ'''G)400000r'   c                .    |                                   d S r<   closer   s    r%   __del__zCurl.__del__      

r'   errcoder*   r@   r   c                :    |dk    rd S  | j         |g|R  }||d S r   )
_get_error)r?   r   r@   errors       r%   _check_errorzCurl._check_error  s<    a<<F/$///K r'   c           	        |dk    rzt          j        | j                                      d          }d                    d |D                       }t          d| d| d| d	t          t          |          
          S d S )Nr   backslashreplaceerrorsrZ   c                ,    g | ]}t          |          S r4   )r   )r]   as     r%   
<listcomp>z#Curl._get_error.<locals>.<listcomp>  s    444!s1vv444r'   z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r8   )r   r   r   rt   ra   r6   r	   r   )r?   r   r@   errmsgactions        r%   r   zCurl._get_error  s    a<<Z 233::BT:UUFXX44t44455FV  g      )W--	    <r'   optionr   valuec                   | j         dS dddddd}|                    |dz  dz            }|dk    s|dk    rt          j        ||          }n|t          j        k    rLt          j        |          }|| _        t          j	        | j         t          j
        t          j                   n|t          j        k    rLt          j        |          }|| _        t          j	        | j         t          j        t          j                   nP|t          j        k    rLt          j        |          }|| _        t          j	        | j         t          j        t          j                   n|t          j
        k    rXt          j        |          }|| _        t          j	        | j         t          j
        t          j                   t          j        }n|t          j        k    rXt          j        |          }|| _        t          j	        | j         t          j        t          j                   t          j        }n$|t          j        k    rXt          j        |          }|| _        t          j	        | j         t          j        t          j                   t          j        }n|t          j        k    rc|d	u rt,          }t          j        |          }|| _        t          j	        | j         t          j        t          j                   t          j        }nI|dk    r0t5          |t6                    r t          j        t          j        t          j        t          j        t          j         t          j!        t          j"        t          j#        t          j$        t          j%        t          j&        t          j'        t          j(        t          j)        h}tT          j+        ,                    d
          r0||v r,t[          j.        d          }|/                    |d          }n|/                                }n|}|t          j0        k    r|| _1        nte          d|           |t          j3        k    rE|D ]!}t          j4        | j5        |          | _5        "t          j	        | j         || j5                  }	n|t          j6        k    rE|D ]!}
t          j4        | j7        |
          | _7        "t          j	        | j         || j7                  }	n|t          j8        k    rn|D ]J}t5          |t6                    r|/                                }t          j4        | j9        |          | _9        Kt          j	        | j         || j9                  }	nt          j	        | j         ||          }	| :                    |	d||           |t          j        k    rd	| _;        |	S )a  Wrapper 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``.
        Nr   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   rT   	DEBUGDATAr   r   CAINFOCAPATHPROXY_CAINFOPROXY_CAPATHSSLCERTSSLKEYCRLFILE
ISSUERCERTSSH_PUBLIC_KEYFILESSH_PRIVATE_KEYFILE
COOKIEFILE	COOKIEJAR
NETRC_FILEUNIX_SOCKET_PATHrq   platform
startswithlocalegetpreferredencodingr   
POSTFIELDSr   NotImplementedError
HTTPHEADERcurl_slist_appendr   PROXYHEADERr   RESOLVEr   r   r   )r?   r   r   input_option
value_typec_valuefilepath_optsencheaderr   proxy_headerresolves               r%   r   zCurl.setopt  s    :1 
 
 "%%v%&?@@
  J*$<$<gj%00GGw(((nU++G!(D!
G133F    w)))nU++G")D!
G2C4G    w'''nU++G 'D!
G0#2J    w,,,nU++G!(D!$*g.CSEWXXX&FFw---nU++G")D!
G2C4F   'FFw+++nU++G 'D!$*g.BCDUVVV%FFw,,,}}.nU++G!(D!$*g.CSEWXXX&FF7""%%%  
 NN((ONO&./&%&,!  <**511 -f6M6M 5e<<C#ll3xl@@GG#llnnGG+++$+!%&EV&E&EFFFW''' M M # 5dmV L L'
FDMJJCCw*** %  &)&;'' '## '
FD<OPPCCw&&  N Ngs++ /%nn..G # 5dmW M M'
FDMJJCC'
FGDDC#x777W^## $D
r'   r   %bytes | int | float | list[str | int]c                   ddddddd}t           j        t          t          t          t          t          d}|dz  }| j        |d	k    rd
S  ||                     S t          j        ||                   }t          j        | j        ||          }| 	                    |d|           |dk    rt          |d                   S |d         t           j        k    rd
S  ||         |d                   S )a  Wrapper 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   Nr  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  zCurl.getinfo  s	    , 
 

 j
 
 x':h&&s/?;/111'*[122#DJ@@#y&111("" ,,,1:!!3+{+GAJ777r'   rV   c                L    t          j        t          j                              S )z#Get the underlying libcurl version.)r   r   r   curl_versionr   s    r%   versionzCurl.version  s    z#*,,---r'   Ttargetdefault_headersc                    | j         dS t          j        | j         |                                t	          |                    S )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.
        Nr   )r   r   curl_easy_impersonater   r*   )r?   r  r  s      r%   impersonatezCurl.impersonate  s?     :1(J_)=)=
 
 	
r'   c                   | j         rd S | j        sx|                     t          j        | j                  }|                     |d           |                     t          j        | j                  }|                     |d           d S d S )Nz
set cacertzset proxy cacert)r   r   r   r   r   r   r   r   r   s     r%   _ensure_cacertzCurl._ensure_cacert  s     	F  	7++gndl;;Cc<000++g2DLAACc#566666		7 	7r'   clear_headersclear_resolvec                   | j         t          d          |                                  t          j        | j                   }	 |                     |d           |                     ||           dS # |                     ||           w xY w)a+  Wrapper 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   r6   r#  r   curl_easy_performr   clean_handles_and_buffers)r?   r$  r%  r   s       r%   r'  zCurl.perform  s     :FGGG 	 #DJ//	Ic9--- **=-HHHHHD**=-HHHHs   A3 3Bc                F    | j         dS t          j        | j                   S r   )r   r   curl_easy_upkeepr   s    r%   upkeepzCurl.upkeep  s"    :1#DJ///r'   c                   d| _         d| _        d| _        d| _        d| _        |r?| j        t          j        k    rt          j	        | j                   t          j        | _        |r| j
        t          j        k    rt          j	        | j
                   t          j        | _
        | j        t          j        k    rt          j	        | j                   t          j        | _        dS dS )zuClean 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?   r$  r%  s      r%   r)  zCurl.clean_handles_and_buffers  s    
 ""!   	%}(('666HDM 	+}(('666HDM"ch..'(;<<<"%(D	+ 	+r'   c                    | j         t          d          t          j        | j                   }t	          | j        | j        |          }|S )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.NzCannot duplicate closed handle.)r   r   r   )r   r6   r   curl_easy_duphandler   r   r   )r?   r   cs      r%   	duphandlezCurl.duphandle  sJ    
 :=>>>,TZ88
DK
KKKr'   c                    d| _         d| _        | j        -t          j        | j                   |                                  t          j        | _        dS )z8Reset all curl options, wrapper for ``curl_easy_reset``.FN)	r   r   r   r   curl_easy_resetr   r   r   r   r   s    r%   resetz
Curl.reset'  sL    !!:!
+++""$$$r'   headersr   r   c                    t                      }|D ]X}|                                                    d          r/|                    |dd                                                    Y|S )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   loadrt   )r?   r5  cookier  s       r%   parse_cookie_headerszCurl.parse_cookie_headers0  sf      ,~~ 	2 	2F||~~((99 2F233K..00111r'   status_linec                h    t                               |           }|r|                    d          ndS )zTExtract reason phrase, like ``OK``, ``Not Found`` from response status
        line.r
   r'   )REASON_PHRASE_REmatchgroup)r<  ms     r%   get_reason_phrasezCurl.get_reason_phrase?  s0     "";//'qwwqzzzC'r'   "tuple[CurlHttpVersion, int, bytes]c                   t                               |           }|st          j        ddfS |                    d          dk    rt          j        }nX|                    d          dk    rt          j        }n2|                    d          dk    rt          j        }nt          j        }t          |                    d                    }|                    d          }|||fS )	zfParse status line.

        Returns:
            http_version, status_code, and reason phrase
        r   r'   r
   z2.0z1.1z1.0rE   rF   )	STATUS_LINE_REr?  r   V1_0r@  V2_0V1_1NONEr*   )r<  rA  http_versionstatus_codereasons        r%   parse_status_linezCurl.parse_status_lineF  s       -- 	0"'C//771::*/LLWWQZZ5  */LLWWQZZ5  */LL*/L!''!**oo[&00r'   c                    |                                   | j        r t          j        | j                   d| _        t	          j        | j                   | j        "t	          j        | j                   d| _        dS dS )zAClose and cleanup curl handle, wrapper for ``curl_easy_cleanup``.N)r)  r   r   curl_easy_cleanupr   releaser   r   r   s    r%   r   z
Curl.close]  s}    &&(((: 	!$*---DJD&'''+K,---#'D    ,+r'   tuple[bytes, CurlWsFrame]c                2   | j         t          d          t          j        | j         | j        | j        | j        | j                  x}r|                     |d           t          j
        | j                  d| j        d                  | j        d         fS )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   r6   r   curl_ws_recvr   r   r   r   r   r   rN   r   s     r%   ws_recvzCurl.ws_recvj  s     :MNNN"J % !
 
 
3 	. c9--- Jt+,,-Ft/CA/F-FG!!$
 	
r'   payloadbytes | memoryviewr,   CurlWsFlag | intc                    | j         t          d          t          j        | j         t	          j        |          t          |          | j        d|          x}r|                     |d           | j        d         S )a  Send 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.
        Nz,Cannot send websocket data on closed handle.r   WS_SEND)	r   r6   r   curl_ws_sendr   from_bufferr/   r   r   )r?   rV  r,   r   s       r%   ws_sendzCurl.ws_send  s     :JKKK"JOG$$LL 
 
 
3 	. c9---#A&&r'     r'   r8   messagec                t    t          j        d|          |z   }|                     |t          j                  S )a  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packr]  r   CLOSE)r?   r8   r_  rV  s       r%   ws_closezCurl.ws_close  s3     +dD))G3||G:+;|<<<r'   )rh   FN)r   r   r   rX   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   rV   )T)r  r   r  rX   r   r*   )TT)r$  rX   r%  rX   r   r:   )r   r*   )r   r   )r5  r   r   r   )r<  rV   r   rV   )r<  rV   r   rC  )r   rQ  )rV  rW  r,   rX  r   r*   )r^  r'   )r8   r*   r_  rV   r   r*   )r0   r1   r2   rC   r   r>   r   r   r   r   r   r   r  r  r!  r#  r'  r,  r)  r1  r4  r;  staticmethodrB  rM  r   rU  r   BINARYr]  rd  r4   r'   r%   r   r      sD         &3 3 3 3 3<   1 1 1 1
      	 	 	 	   B+8 +8 +8 +8Z. . . .
 
 
 
 
 7 7 7 7I I I I I20 0 0 0 AE+ + + + +2	 	 	 	! ! ! !    ( ( ( \( 1 1 1 \1,( ( ( (
 
 
 
8 FPEV' ' ' ' ':= = = = = = =r'   r   c                  b    e Zd ZdZdddZdddddddZedd            ZdddZddZ	ddZ
dS )CurlMimez#Wrapper for the ``curl_mime_`` API.NrO   Curl | Nonec                z    |r|nt                      | _        t          j        | j        j                  | _        dS )z?
        Args:
            curl: Curl instance to use.
        N)r   r   r   curl_mime_init_form)r?   rO   s     r%   r>   zCurlMime.__init__  s3    
 "-TTtvv
'
(899


r'   )content_typefilename
local_pathrP   namer   rn  
str | Nonero  rp  str | bytes | Path | NonerP   bytes | Noner   r:   c                  t          j        | j                  }t          j        ||                                          }|dk    rt          d          |<t          j        ||                                          }|dk    rt          d          |<t          j        ||                                          }|dk    rt          d          |r|rt          d          |t          |t                    rt          |          }n,t          |t                    r|                                }n|}t          |                                          st          d|           t          j        ||                                          }|dk    rt          d          |[t          |t                    s!t          |                                          }t          j        ||t#          |                    }dS dS )a  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_addpartrm  curl_mime_namer   r6   curl_mime_typecurl_mime_filenamer   r   r   rV   rt   r   FileNotFoundErrorcurl_mime_filedatacurl_mime_datar/   )	r?   rq  rn  ro  rp  rP   partr   local_path_strs	            r%   addpartzCurlMime.addpart  s   ( $TZ00 t{{}}55!88/000 #$T<+>+>+@+@AACaxx 3444 (x/@/@AACaxx 3444 	Q$ 	QOPPP !*d++ ,!$ZJ.. ,!+!2!2!4!4!+''..00 O'(M^(M(MNNN(~/D/D/F/FGGCaxx 3444dE** *4yy''))$T4T;;CCC r'   files
list[dict]c                >     |             }|D ]} |j         di | |S )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``r4   )r  )clsr  formfiles       r%   	from_listzCurlMime.from_list  s>     suu 	! 	!DDL  4    r'   c                f    |r|n| j         }|                    t          j        | j                   dS )z,Attach the mime instance to a curl instance.N)r   r   r   MIMEPOSTrm  )r?   rO   r0  s      r%   attachzCurlMime.attach  s1    (DDdj	!4:.....r'   c                Z    t          j        | j                   t          j        | _        dS )zrClose the mime instance and underlying files. This method must be called
        after ``perform`` or ``request``.N)r   curl_mime_freerm  r   r   r   s    r%   r   zCurlMime.close
  s$     	4:&&&X


r'   c                .    |                                   d S r<   r   r   s    r%   r   zCurlMime.__del__  r   r'   r<   )rO   rj  )rq  r   rn  rr  ro  rr  rp  rs  rP   rt  r   r:   )r  r  )rO   rj  r   r:   re  )r0   r1   r2   rC   r>   r  classmethodr  r  r   r   r4   r'   r%   ri  ri    s        --: : : : : $(#04!;< ;< ;< ;< ;< ;<z    [/ / / / /
        r'   ri  )r   r   )rJ   r*   rK   r*   r   r*   )F)rU   rV   rW   rX   r   r   )rJ   r*   rP   rV   r   r:   )r   r   )=
__future__r   r   rera  r   rq   r   http.cookiesr   pathlibr   typingr   r   r   r	   r   r!   _wrapperr   r   constr   r   r   r   r   utilsr   r&   r   compiler>  rE  r)   	Exceptionr6   rj   rk   rl   rm   rn   ro   rp   r   r   CURL_READFUNC_ABORTCURL_READFUNC_PAUSE
def_externrT   rb   r{   r   r   r   r   r   r   r   ri  r4   r'   r%   <module>r     sd   " " " " " "  				  



 



  % % % % % %       4 4 4 4 4 4 4 4 4 4 4 4 				          L L L L L L L L L L L L L L " " " " " "     !""2:;<< =>>        7 7 7 7 7	 7 7 7       ! !         4 4 4 4 4T T T T>           *   ,   _= _= _= _= _= _= _= _=D\ \ \ \ \ \ \ \ \ \r'   