
    AHj0i                       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 d&d
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jb                         d'd       Z2d(d)dZ3d*dZ4 ejb                         d        Z5d Z6 ejb                         d        Z7 ejb                         d        Z8 ejb                         d         Z9d+d!Z: G d" d#      Z; G d$ d%      Z<y),    )annotationsN)SimpleCookie)Path)TYPE_CHECKINGAnyLiteralcast   )ffilib)	CurlECodeCurlHttpVersionCurlInfoCurlOpt
CurlWsFlag)CurlCffiWarningc                 l   dD ]G  } t         j                  j                  |       }|s%t         j                  j	                  |      sE|c S  t        j                         }|j                  r5t         j                  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      F/root/tools/cai/cai_env/lib/python3.12/site-packages/curl_cffi/curl.py_default_cacertr$      s|    L zz~~g&BGGNN4(K ++-H277>>(//: ==?    s   HTTP/\d\.\d [0-9]{3} (.*)s   HTTP/(\d\.\d) ([0-9]{3}) (.*)c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)CurlWsFrameintageflagsoffset	bytesleftlenN)__name__
__module____qualname____annotations__ r%   r#   r'   r'   ,   s    
r%   r'   c                  2     e Zd ZdZ	 d	 	 	 	 	 d fdZ xZS )	CurlErrorz$Base exception for curl_cffi packagec                :    t        |   |g|i | || _        y N)super__init__code)selfmsgr9   argskwargs	__class__s        r#   r8   zCurlError.__init__7   s#     	.t.v.26	r%   )r   )r;   strr9   zint | CurlECode | Literal[0]returnNone)r.   r/   r0   __doc__r8   __classcell__)r>   s   @r#   r4   r4   4   s-    . >?77:7	7 7r%   r4                  i  l    i   c                r    t        j                  |      }t        j                  ||      dd } |||       y)z ffi callback for curl debug infoNr   )r   from_handlebuffer)curltype_datasizeclientpcallbacktexts          r#   debug_functionrS   L   s4     w'H::dD!!$DUDr%   c                D    |rdnddj                  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  @   K   | ]  }j                  |        y wr6   )format).0bytefmts     r#   	<genexpr>zbytes_to_hex.<locals>.<genexpr>[   s     3CJJt$3s   )join)b	uppercaserZ   s     @r#   bytes_to_hexr_   U   s#    
  (XC883333r%   c                   t         dt        dt        dt        dt        dt
        dt        di}d}|j                  | d      }| t
        t        fv rTt        |d |       }t        |      |k  rd	nd
}t        j                  j                  | dt        |       d| | d       y 	 |j                  d      }t        j                  j                  | d|        | t         t        t        fvr t        j                  j                  d       y y # t        $ rV t        |d |       }t        |      |k  rd	nd
}t        j                  j                  | dt        |       d| | d       Y y w xY w)N*<>z< DATAz> DATAz< SSLz> SSL(    z...z [z	 bytes]: 
zutf-8rU   )CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTr   r_   r-   sysstderrwritedecodeUnicodeDecodeError)rM   rN   PREFIXESMAX_SHOW_BYTESprefixhex_strpostfixrR   s           r#   debug_function_defaultrx   ^   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E,+E,c                    t        j                  |      }|j                  t        j                  | |      dd        ||z  S )zAffi callback for curl write function, directly writes to a bufferN)r   rJ   rp   rK   )ptrrO   nmembuserdatarK   s        r#   buffer_callbackr}   }   s8     __X&F
LLC'*+4<r%   c                    | syt        |       S Nr   )r(   )ss    r#   
ensure_intr      s    q6Mr%   c                    t        j                  |      } |t        j                  | |      dd       }t        |      }|t        k(  s	|t
        k(  r|S |||z  k7  rt        j                  dt        d       ||z  S )zHffi callback for curl write function, calls the callback python functionNzWrote bytes != received bytes.rD   
stacklevel)	r   rJ   rK   r   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnr   )rz   rO   r{   r|   rQ   wrotes         r#   write_callbackr      st     x(HSZZU+A./EuE$$1E(E6TUV4<r%   c                p   t        j                  |      }||z  }|j                  |      }|yt        |t              r|S t        |t
              r|j                         }|syt        |      |kD  rt        dt        |       d| d      t        j                  | |t        |             t        |      S )zIffi callback for curl read function, reads from a buffer/file-like objectr   Read callback returned  bytes, but only  bytes are allowed.)
r   rJ   read
isinstancer(   r?   encoder-   r4   memmove)rz   rO   r{   r|   rK   max_lenrN   s          r#   read_buffer_callbackr      s     __X&FUlG;;wD|$${{}
4y7%c$i[0A'J]^
 	
 KKT3t9%t9r%   c                ^   t        j                  |      }||z  } ||      }|yt        |t              r|S t        |t              r|j                         }|syt        |      |kD  rt        dt        |       d| d      t        j                  | |t        |             t        |      S )zGffi callback for curl read function, calls the callback python functionr   r   r   r   )	r   rJ   r   r(   r?   r   r-   r4   r   )rz   rO   r{   r|   rQ   r   rN   s          r#   read_callbackr      s     x(HUlGGD|$${{}
4y7%c$i[0A'J]^
 	
 KKT3t9%t9r%   c                    g }| }|r=|j                  t        j                  |j                               |j                  }|r=t        j                  |        |S )z%Converts curl slist to a python list.)appendr   stringrN   nextr   curl_slist_free_all)headresultrz   s      r#   slist_to_listr      sK    F
C
cjj*+hh  D!Mr%   c                     e Zd ZdZdZdddZddZddZddZddZ	dd	Z
d d
Zd!dZd"dZd#d$dZddZd%d&dZd'dZ	 d%	 	 	 	 	 d&dZd(dZddZd)dZed*d       Zed+d       ZddZd,dZej8                  f	 	 	 	 	 d-dZd.d/dZy)0Curlz;
    Wrapper for ``curl_easy_*`` functions of libcurl.
    i   Nc                   |r|nt        j                         | _        t        j                  | _        t        j                  | _        t        j                  | _        |xs t        | _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        t        j"                  dd      | _        || _        | j)                          t        j"                  d| j*                        | _        t        j"                  d      | _        t        j"                  d      | _        t        j"                  d      | _        y)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#   r8   zCurl.__init__   s      &V3+=+=+?
!hh/!!"&#'"&!%!% WWXs3   #wwx1J1JK"wwz2 #(A B"wwz2r%   c                    t        j                  | j                  t        j                  | j
                        }|dk7  rt        j                  dt        d       | j                  r| j                          y y )Nr   zFailed to set error bufferrD   r   )r   _curl_easy_setoptr   r   ERRORBUFFERr   r   r   r   r   r   r:   rets     r#   r   zCurl._set_error_buffer   sT    ##DJJ0C0CTEWEWX!8MM6TUV;;JJL r%   c                    | j                  t        j                  d       | j                  t        j                  d       y)zSet debug to Truer
   TN)setoptr   VERBOSEDEBUGFUNCTIONr:   s    r#   r   z
Curl.debug   s(    GOOQ'G))40r%   c                $    | j                          y r6   closer   s    r#   __del__zCurl.__del__      

r%   c                >    |dk(  ry  | j                   |g| }||y r   )
_get_error)r:   errcoder<   errors       r#   _check_errorzCurl._check_error  s1    a</$/K r%   c           	        |dk7  r|t        j                  | j                        j                  d      }dj	                  |D cg c]  }t        |       c}      }t        d| d| d| dt        t        |      	      S y c c}w )
Nr   backslashreplaceerrorsrU   z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r9   )	r   r   r   rq   r\   r?   r4   r	   r   )r:   r   r<   errmsgaactions         r#   r   zCurl._get_error  s    a<ZZ 2 23::BT:UFXXt4!s1v45FVHIgYb A  )W-	  4s   Bc                   | j                   ydddddd}|j                  |dz  dz        }|dk(  s|dk(  rt        j                  ||      }n|t        j
                  k(  r[t        j                  |      }|| _        t        j                  | j                   t        j                  t        j                         nQ|t        j                  k(  r[t        j                  |      }|| _        t        j                  | j                   t        j                  t        j                         n|t        j                  k(  r[t        j                  |      }|| _        t        j                  | j                   t        j"                  t        j$                         nu|t        j                  k(  rkt        j                  |      }|| _        t        j                  | j                   t        j                  t        j&                         t        j
                  }n|t        j                  k(  rkt        j                  |      }|| _        t        j                  | j                   t        j                  t        j&                         t        j                  }ny|t        j"                  k(  rkt        j                  |      }|| _        t        j                  | j                   t        j"                  t        j(                         t        j                  }n|t        j*                  k(  ru|du rt,        }t        j                  |      }|| _        t        j                  | j                   t        j*                  t        j0                         t        j2                  }ns|dk(  r_t5        |t6              r1t        j8                  t        j:                  t        j<                  t        j>                  t        j@                  t        jB                  t        jD                  t        jF                  t        jH                  t        jJ                  t        jL                  t        jN                  t        jP                  t        jR                  h}tT        jV                  jY                  d	      r-||v r)t[        j\                  d
      }|j_                  |d      }n|j_                         }n|}|t        j`                  k(  r|| _1        nte        d|       |t        jf                  k(  rY|D ]'  }t        jh                  | jj                  |      | _5        ) t        j                  | j                   || jj                        }	n|t        jl                  k(  rX|D ]'  }
t        jh                  | jn                  |
      | _7        ) t        j                  | j                   || jn                        }	n|t        jp                  k(  rx|D ]G  }t5        |t6              r|j_                         }t        jh                  | jr                  |      | _9        I t        j                  | j                   || jr                        }	n!t        j                  | j                   ||      }	| ju                  |	d||       |t        j8                  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``.
        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   rx   r   rS   	DEBUGDATAr   r?   CAINFOCAPATHPROXY_CAINFOPROXY_CAPATHSSLCERTSSLKEYCRLFILE
ISSUERCERTSSH_PUBLIC_KEYFILESSH_PRIVATE_KEYFILE
COOKIEFILE	COOKIEJAR
NETRC_FILEUNIX_SOCKET_PATHrn   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   zCurl.setopt  s    :: 
 "%%v%&?@
 J*$<ggj%0Gw(((nnU+G!(D!!

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

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

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

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

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

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

FDMMJC''

FGDC#x7W^^# $D
r%   c                   ddddddd}t         j                  t        t        t        t        t        d}|dz  }| j
                  |dk(  ry	 ||          S t        j                  ||         }t        j                  | j
                  ||      }| j                  |d
|       |dk(  rt        |d         S |d   t         j                  k(  ry	 ||   |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   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  zCurl.getinfo  s     , 

 jj
 x'::h&/?;/11''*[12##DJJ@#y&1(" ,,1:!+{+GAJ77r%   c                P    t        j                  t        j                               S )z#Get the underlying libcurl version.)r   r   r   curl_versionr   s    r#   versionzCurl.version  s    zz#**,--r%   c                    | j                   yt        j                  | 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.
        r   )r   r   curl_easy_impersonater   r(   )r:   targetdefault_headerss      r#   impersonatezCurl.impersonate  s:     ::((JJ_)=
 	
r%   c                (   | j                   ry | j                  sy| j                  t        j                  | j
                        }| j                  |d       | j                  t        j                  | j
                        }| j                  |d       y y )Nz
set cacertzset proxy cacert)r   r   r   r   r   r   r   r   r   s     r#   _ensure_cacertzCurl._ensure_cacert  so      ++gnndll;Cc<0++g22DLLACc#56	 !r%   c                   | j                   t        d      | j                          t        j                  | j                         }	 | j                  |d       | j                  ||       y# | j                  ||       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   r4   r  r   curl_easy_performr   clean_handles_and_buffers)r:   clear_headersclear_resolver   s       r#   r  zCurl.perform  sw     ::FGG 	 ##DJJ/	Ic9- **=-HD**=-Hs   A- -Bc                Z    | j                   yt        j                  | j                         S r   )r   r   curl_easy_upkeepr   s    r#   upkeepzCurl.upkeep  s$    ::##DJJ//r%   c                :   d| _         d| _        d| _        d| _        d| _        |rQ| j
                  t        j                  k7  rt        j                  | j
                         t        j                  | _        |r| j                  t        j                  k7  rt        j                  | j                         t        j                  | _
        | j                  t        j                  k7  rt        j                  | j                         t        j                  | _        yy)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HHDM}}(''6HHDM""chh.''(;(;<"%((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.zCannot duplicate closed handle.)r   r   r   )r   r4   r   curl_easy_duphandler   r   r   )r:   r   cs      r#   	duphandlezCurl.duphandle  sI    
 ::=>>,,TZZ8
DKK
Kr%   c                    d| _         d| _        | j                  /t        j                  | j                         | j                          t        j                  | _        y)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'  sE    !!::!

+""$r%   c                    t               }|D ]D  }|j                         j                  d      s#|j                  |dd j	                                F |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   loadrq   )r:   headerscookier  s       r#   parse_cookie_headerszCurl.parse_cookie_headers0  sP      ,~ 	2F||~((9F23K..01	2 r%   c                V    t         j                  |       }|r|j                  d      S dS )zTExtract reason phrase, like ``OK``, ``Not Found`` from response status
        line.r
   r%   )REASON_PHRASE_REmatchgroup)status_linems     r#   get_reason_phrasezCurl.get_reason_phrase?  s)     "";/qwwqz'C'r%   c                   t         j                  |       }|st        j                  ddfS |j	                  d      dk(  rt        j
                  }nZ|j	                  d      dk(  rt        j                  }n5|j	                  d      dk(  rt        j                  }nt        j                  }t        |j	                  d            }|j	                  d      }|||fS )	zfParse status line.

        Returns:
            http_version, status_code, and reason phrase
        r   r%   r
   z2.0z1.1z1.0rD   rE   )	STATUS_LINE_REr7  r   V1_0r8  V2_0V1_1NONEr(   )r9  r:  http_versionstatus_codereasons        r#   parse_status_linezCurl.parse_status_lineF  s       -"''C//771:*//LWWQZ5 *//LWWQZ5 *//L*//L!''!*o[&00r%   c                ,   | j                          | j                  r&t        j                  | j                         d| _        t	        j
                  | j                         | j                  't	        j
                  | j                         d| _        yy)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]  sk    &&(::!!$**-DJD&&'+KK,,-#'D  ,r%   c                j   | j                   t        d      t        j                  | j                   | j                  | j
                  | j                  | j                        x}r| j                  |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   r4   r   curl_ws_recvr   r   r   r   r   r   rK   r   s     r#   ws_recvzCurl.ws_recvj  s     ::MNN""JJ  %%  !!
 
3 
 c9- JJt++,-Ft/C/CA/FG!!!$
 	
r%   c                
   | j                   t        d      t        j                  | j                   t	        j
                  |      t        |      | j                  d|      x}r| j                  |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.
        z,Cannot send websocket data on closed handle.r   WS_SEND)	r   r4   r   curl_ws_sendr   from_bufferr-   r   r   )r:   payloadr*   r   s       r#   ws_sendzCurl.ws_send  s     ::JKK""JJOOG$L  
 
3 
 c9-##A&&r%   c                v    t        j                  d|      |z   }| j                  |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packrR  r   CLOSE)r:   r9   messagerQ  s       r#   ws_closezCurl.ws_close  s2     ++dD)G3||G:+;+;|<<r%   )re   FN)r   r?   r   boolr@   rA   r@   rA   )r   r(   r<   r   r@   rA   )r   r(   r<   r   )r   r   r   r   r@   r(   )r   r   r@   z%bytes | int | float | list[str | int])r@   bytes)T)r  r?   r  rY  r@   r(   )TT)r!  rY  r"  rY  r@   rA   )r@   r(   )r@   r   )r2  list[bytes]r@   r   )r9  r[  r@   r[  )r9  r[  r@   z"tuple[CurlHttpVersion, int, bytes])r@   ztuple[bytes, CurlWsFrame])rQ  zbytes | memoryviewr*   zCurlWsFlag | intr@   r(   )i  r%   )r9   r(   rW  r[  r@   r(   )r.   r/   r0   rB   r   r8   r   r   r   r   r   r   r  r  r  r  r  r%  r   r*  r-  r4  staticmethodr;  rE  r   rL  r   BINARYrR  rX  r2   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                  p    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
y)CurlMimez#Wrapper for the ``curl_mime_`` API.Nc                    |r|n	t               | _        t        j                  | j                  j                        | _        y)z?
        Args:
            curl: Curl instance to use.
        N)r   r   r   curl_mime_init_form)r:   rL   s     r#   r8   zCurlMime.__init__  s-    
 "Ttv
''

(8(89
r%   )content_typefilename
local_pathrN   c               p   t        j                  | j                        }t        j                  ||j	                               }|dk7  rt        d      |4t        j                  ||j	                               }|dk7  rt        d      |4t        j                  ||j	                               }|dk7  rt        d      |r|rt        d      |t        |t              rt        |      }n#t        |t              r|j                         }n|}t        |      j                         st        d|       t        j                  ||j	                               }|dk7  rt        d      |Jt        |t              st        |      j	                         }t        j                   ||t#        |            }yy)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_addpartrc  curl_mime_namer   r4   curl_mime_typecurl_mime_filenamer   r   r?   r[  rq   r   FileNotFoundErrorcurl_mime_filedatacurl_mime_datar-   )	r:   namerd  re  rf  rN   partr   local_path_strs	            r#   addpartzCurlMime.addpart  s   ( $$TZZ0  t{{}5!8/00 #$$T<+>+>+@ACax 344 ((x/@ACax 344$OPP !*d+!$ZJ.!+!2!2!4!+'..0'*<^<L(MNN((~/D/D/FGCax 344dE*4y'')$$T4T;C r%   c                F     |        }|D ]  } |j                   di |  |S )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``r2   )rr  )clsfilesformfiles       r#   	from_listzCurlMime.from_list  s0     u 	!DDLL 4 	!r%   c                x    |r|n| j                   }|j                  t        j                  | j                         y)z,Attach the mime instance to a curl instance.N)r   r   r   MIMEPOSTrc  )r:   rL   r)  s      r#   attachzCurlMime.attach  s'    Ddjj	!!4::.r%   c                l    t        j                  | j                         t        j                  | _        y)zrClose the mime instance and underlying files. This method must be called
        after ``perform`` or ``request``.N)r   curl_mime_freerc  r   r   r   s    r#   r   zCurlMime.close
  s!     	4::&XX
r%   c                $    | j                          y r6   r   r   s    r#   r   zCurlMime.__del__  r   r%   r6   )rL   Curl | None)ro  r?   rd  
str | Nonere  r  rf  zstr | bytes | Path | NonerN   zbytes | Noner@   rA   )ru  z
list[dict])rL   r  r@   rA   rZ  )r.   r/   r0   rB   r8   rr  classmethodrx  r{  r   r   r2   r%   r#   r`  r`    s{    -: $(#04!;<;< !	;<
 ;< .;< ;< 
;<z  /
r%   r`  )r@   r?   )rM   r(   rO   r(   r@   r(   )F)r]   r[  r^   rY  r@   r?   )rM   r(   rN   r[  r@   rA   )r@   r\  )=
__future__r   r   rerT  r   rn   r   http.cookiesr   pathlibr   typingr   r   r   r	   r   r   _wrapperr   r   constr   r   r   r   r   utilsr   r$   r   compiler6  r=  r'   	Exceptionr4   rg   rh   ri   rj   rk   rl   rm   r   r   CURL_READFUNC_ABORTCURL_READFUNC_PAUSE
def_externrS   r_   rx   r}   r   r   r   r   r   r   r`  r2   r%   r#   <module>r     s   "  	  
 
  %  4 4 	   L L "  !"2::;< => 7	 7       ! !       4T>      *  ,_= _=D\ \r%   