
    T>qjw                    |   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Z0d Z1dZ2dZ3dZ4d Z5dZ6d Z7e4e6z  Z8e5e7z  Z9 G d d      Z:d,dZ; ejx                   e;d             d-d       Z=d.d/dZ>d0dZ? ejx                   e;e.            d         Z@d! ZA ejx                   e;e.            d"        ZB ejx                   e;e/            d#        ZC ejx                   e;e/            d$        ZD ejx                   e;e2            d1d%       ZEd2d&ZF G d' d(      ZG G d) d*      ZHy)3    )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      M/opt/rentech/trading_bot/.venv/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                      e Zd ZddZy)_CallbackContextc                     || _         d | _        y r6   )callback	exception)r:   rL   s     r#   r8   z_CallbackContext.__init__Y   s     /3r%   N)rL   r   r@   rA   )r.   r/   r0   r8   r2   r%   r#   rJ   rJ   X   s    4r%   rJ   c                      fd}|S )Nc                    |U|j                   j                  }|j                  d|j                  d            }|t        j                  |      }||_        S )Nuserdataclientp)tb_framef_localsr   r   from_handlerM   )exc_type	exc_value	tracebackcallback_argsrP   contextreturn_values         r#   onerrorz&_store_callback_error.<locals>.onerror_   s[      &..77M$((]5F5Fy5QRH#//(3$-!r%   r2   )rZ   r[   s   ` r#   _store_callback_errorr\   ^   s    	 Nr%   )r[   c                    t        j                  |      }|j                  y|j                  }t        j                  ||      dd } |||       y)z ffi callback for curl debug infoNr   )r   rT   rM   rL   buffer)curltype_datasizerQ   rY   rL   texts           r#   debug_functionrd   n   sN     oog&G$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	uppercaserk   s     @r#   bytes_to_hexrp   z   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-8rf   )CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTr   rp   r-   sysstderrwritedecodeUnicodeDecodeError)r`   ra   PREFIXESMAX_SHOW_BYTESprefixhex_strpostfixrc   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E,+E,c                    t        j                  |      j                  }|j                  t        j                  | |      dd        ||z  S )zAffi callback for curl write function, directly writes to a bufferN)r   rT   rL   r   r^   )ptrrb   nmembrP   r^   s        r#   buffer_callbackr      s>     __X&//F
LLC'*+4<r%   c                    | syt        |       S Nr   )r(   )ss    r#   
ensure_intr      s    q6Mr%   c                   t        j                  |      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   rT   rL   r^   r   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnr   )r   rb   r   rP   rL   wrotes         r#   write_callbackr      sz     x(11HSZZU+A./EuE$$1E(E6TUV4<r%   c                   t        j                  |      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   rT   rL   read
isinstancer(   r?   encoder-   r4   memmove)r   rb   r   rP   r^   max_lenra   s          r#   read_buffer_callbackr      s     __X&//FUlG;;wD|$${{}
4y7%c$i[0A'J]^
 	
 KKT3t9%t9r%   c                r   t        j                  |      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   rT   rL   r   r(   r?   r   r-   r4   r   )r   rb   r   rP   rL   r   ra   s          r#   read_callbackr      s     x(11HUlGGD|$${{}
4y7%c$i[0A'J]^
 	
 KKT3t9%t9r%   c                    t        j                  |       j                  }	 |j                  ||       t        S # t        t
        f$ r	 t        cY S w xY w)zDffi callback for curl seek function, seeks a file-like upload source)r   rT   rL   seekAttributeErrorOSErrorCURL_SEEKFUNC_CANTSEEKCURL_SEEKFUNC_OK)rP   r+   originsources       r#   seek_buffer_callbackr      sO     __X&//F&FF#  G$ &%%&s   9 AAc                    g }| }|r=|j                  t        j                  |j                               |j                  }|r=t        j                  |        |S )z%Converts curl slist to a python list.)appendr   stringra   nextr   curl_slist_free_all)headresultr   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Zd&d'dZddZd(d)dZ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d0dZej<                  f	 	 	 	 	 d1dZd2d3dZ y)4Curlz;
    Wrapper for ``curl_easy_*`` functions of libcurl.
    i   Nc                   |r|nt        j                         | _        t        j                  | _        t        j                  | _        t        j                  | _        t        j                  | _        t        j                  | _	        |xs t        | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t        j(                  dd      | _        || _        | j/                          t        j(                  d| j0                        | _        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_http3_headers_ws_headers_proxy_headers_resolveDEFAULT_CACERT_cacert_is_cert_set_skip_cacert_write_handle_header_handle_debug_handle_body_handle_read_handle_seek_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88!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.debug2  s(    GOOQ'G))40r%   c                $    | j                          y r6   closer   s    r#   __del__zCurl.__del__7      

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errorsrf   z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r9   )	r   r   r   r   rm   r?   r4   r	   r   )r:   r   r<   errmsgaactions         r#   r   zCurl._get_errorB  s    a<ZZ 2 23::BT:UFXXt4!s1v45FVHIgYb A  )W-	  4s   Bc                    | j                   | j                  | j                  | j                  | j                  fD ]*  }|t        j                  |      j                  }|(|c S  y r6   )r   r   r   r   r   r   rT   rM   )r:   r   rM   s      r#   _get_callback_exceptionzCurl._get_callback_exceptionM  sm    
 
	%F !OOF3==	($$
	% r%   c                >   | j                   ydddddd}|j                  |dz  dz        }|dk(  s|dk(  rt        j                  ||      }nu|t        j
                  k(  rdt        j                  t        |            }|| _        t        j                  | j                   t        j                  t        j                         n|t        j                  k(  rdt        j                  t        |            }|| _        t        j                  | j                   t        j                  t        j                         n|t        j                   k(  rdt        j                  t        |            }|| _        t        j                  | j                   t        j$                  t        j&                         n|t        j(                  k(  rdt        j                  t        |            }|| _        t        j                  | j                   t        j,                  t        j.                         n|t        j                  k(  rtt        j                  t        |            }|| _        t        j                  | j                   t        j                  t        j0                         t        j
                  }n|t        j                  k(  rtt        j                  t        |            }|| _        t        j                  | j                   t        j                  t        j0                         t        j                  }n|t        j$                  k(  rtt        j                  t        |            }|| _        t        j                  | j                   t        j$                  t        j2                         t        j                   }n|t        j4                  k(  r~|du rt6        }t        j                  t        |            }|| _        t        j                  | j                   t        j4                  t        j:                         t        j<                  }ns|dk(  r_t?        |t@              r1t        jB                  t        jD                  t        jF                  t        jH                  t        jJ                  t        jL                  t        jN                  t        jP                  t        jR                  t        jT                  t        jV                  t        jX                  t        jZ                  t        j\                  h}t^        j`                  jc                  d	      r-||v r)te        jf                  d
      }|ji                  |d      }n|ji                         }n|}|t        jj                  k(  r|| _6        nto        d|       t        jp                  dt        jr                  dt        jt                  di}||v r^||   }	tw        | |	      }
|D ]  }t        jx                  |
|      }
 t{        | |	|
       t        j                  | j                   ||
      }n|t        j|                  k(  rX|D ]'  }t        jx                  | j~                  |      | _?        ) t        j                  | j                   || j~                        }n|t        j                  k(  rx|D ]G  }t?        |t@              r|ji                         }t        jx                  | j                  |      | _A        I t        j                  | j                   || j                        }n!t        j                  | j                   ||      }| j                  |d||       |t        jB                  k(  rd| _C        |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   )Dr   r   r   r   r   	WRITEDATA
new_handlerJ   r   r   r   WRITEFUNCTIONr   
HEADERDATAr   HEADERFUNCTIONREADDATAr   READFUNCTIONr   SEEKDATAr   SEEKFUNCTIONr   r   r   r   r   r   rd   	DEBUGDATAr   r?   CAINFOCAPATHPROXY_CAINFOPROXY_CAPATHSSLCERTSSLKEYCRLFILE
ISSUERCERTSSH_PUBLIC_KEYFILESSH_PRIVATE_KEYFILE
COOKIEFILE	COOKIEJAR
NETRC_FILEUNIX_SOCKET_PATHr   platform
startswithlocalegetpreferredencodingr   
POSTFIELDSr   NotImplementedError
HTTPHEADERHTTP3_HTTPHEADERWS_HTTPHEADERgetattrcurl_slist_appendsetattrPROXYHEADERr   RESOLVEr   r   r   )r:   optionvalueinput_option
value_typec_valuefilepath_optsencheader_optionsheaders_attrheadersheaderr   proxy_headerresolves                  r#   r   zCurl.setopt[  s    :: 
 "%%v%&?@
 J*$<ggj%0Gw(((nn%5e%<=G!(D!!

G1133F3F w)))nn%5e%<=G")D!!

G22C4G4G w'''nn%5e%<=G 'D!!

G00#2J2J w'''nn%5e%<=G 'D!!

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

G22C4F4F ''Fw+++nn%5e%<=G 'D!!$**g.B.BCDUDUV%%Fw,,,}.nn%5e%<=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 
$$&6!!=

 ^#)&1LdL1G A//@AD,0''

FGDC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   r1  r%   getinfor2  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#   r3  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                0   | j                   t        d      | j                          t        j                  | 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   rC  r   curl_easy_performr   r   clean_handles_and_buffers)r:   clear_headersclear_resolver   callback_exceptions        r#   rE  zCurl.perform4  s     ::FGG 	 ##DJJ/	I!%!=!=!?!-((c9- **=-HD**=-Hs   &B Bc                Z    | j                   yt        j                  | j                         S r   )r   r   curl_easy_upkeepr   s    r#   upkeepzCurl.upkeepP  s$    ::##DJJ//r%   c                    | j                   yt        j                  | j                   |      }| j                  |d       |S )z-Pause or resume data transfer on this handle.r   pause)r   r   curl_easy_pauser   )r:   r   r   s      r#   rO  z
Curl.pauseU  s:    ::!!$**f5#w'
r%   c                   d| _         d| _        d| _        d| _        d| _        d| _        |rQ| j                  t        j                  k7  rt        j                  | j                         t        j                  | _        |rYd}|D ]Q  }t        | |      }|t        j                  k7  rt        j                  |       t        | |t        j                         S 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   r  r   )r:   rH  rI  header_attrsheader_attrr,  s         r#   rG  zCurl.clean_handles_and_buffers]  s    
 ""!   }}(''6HHDML  , 5!$4chh&++G4k3884	5 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  loadr   )r:   r,  cookier-  s       r#   parse_cookie_headerszCurl.parse_cookie_headers  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_RErc  r   V1_0rd  V2_0V1_1NONEr(   )re  rf  http_versionstatus_codereasons        r#   parse_status_linezCurl.parse_status_line  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)rG  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   r^   r   s     r#   ws_recvzCurl.ws_recv  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packr~  r   CLOSE)r:   r9   messager}  s       r#   ws_closezCurl.ws_close  s2     ++dD)G3||G:+;+;|<<r%   )rv   FN)r   r?   r   boolr@   rA   r@   rA   )r   r(   r<   r   r@   rA   )r   r(   r<   r   )r@   zBaseException | None)r#  r   r$  r   r@   r(   )r#  r   r@   z%bytes | int | float | list[str | int])r@   bytes)T)r?  r?   r@  r  r@   r(   )TT)rH  r  rI  r  r@   rA   )r@   r(   )r   r(   r@   r(   )r@   r   )r,  list[bytes]r@   r   )re  r  r@   r  )re  r  r@   z"tuple[CurlHttpVersion, int, bytes])r@   ztuple[bytes, CurlWsFrame])r}  zbytes | memoryviewr*   zCurlWsFlag | intr@   r(   )i  r%   )r9   r(   r  r  r@   r(   )!r.   r/   r0   rB   r   r8   r   r   r   r   r   r   r   r3  r<  rA  rC  rE  rM  rO  rG  rW  rZ  r`  staticmethodrg  rq  r   rx  r   BINARYr~  r  r2   r%   r#   r   r     s     &3B1
	M^+8Z.
 7I80
 AE5!59=5	5<	! ( ( 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:   r_   s     r#   r8   zCurlMime.__init__  s-    
 "Ttv
''

(8(89
r%   )content_typefilename
local_pathra   c               p   t        j                  | j                        }t        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      |4t        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_addpartr  curl_mime_namer   r4   curl_mime_typer   r   r?   r  r   r   FileNotFoundErrorcurl_mime_filedatacurl_mime_filenamecurl_mime_datar-   )	r:   namer  r  r  ra   partr   local_path_strs	            r#   addpartzCurlMime.addpart  s   ( $$TZZ0  t{{}5!8/00 #$$T<+>+>+@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 ((x/@AC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   )r  )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   MIMEPOSTr  )r:   r_   rV  s      r#   attachzCurlMime.attachd  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_freer  r   r   r   s    r#   r   zCurlMime.closei  s!     	4::&XX
r%   c                $    | j                          y r6   r   r   s    r#   r   zCurlMime.__del__o  r   r%   r6   )r_   Curl | None)r  r?   r  
str | Noner  r  r  zstr | bytes | Path | Nonera   zbytes | Noner@   rA   )r  z
list[dict])r_   r  r@   rA   r  )r.   r/   r0   rB   r8   r  classmethodr  r  r   r   r2   r%   r#   r  r    s{    -: $(#04!;<;< !	;<
 ;< .;< ;< 
;<z  /
r%   r  )r@   r?   )rZ   r(   )r`   r(   rb   r(   r@   r(   )F)rn   r  ro   r  r@   r?   )r`   r(   ra   r  r@   rA   )r+   r(   r   r(   r@   r(   )r@   r  )I
__future__r   r  rer  r   r   r   http.cookiesr   pathlibr   typingr   r   r   r	   r   r   _wrapperr   r   constr   r   r   r   r   utilsr   r$   r   compilerb  ri  r'   	Exceptionr4   rx   ry   rz   r{   r|   r}   r~   r   r   CURL_READFUNC_ABORTCURL_READFUNC_PAUSEr   CURL_SEEKFUNC_FAILr   CURLPAUSE_RECVCURLPAUSE_RECV_CONTCURLPAUSE_SENDCURLPAUSE_SEND_CONTCURLPAUSE_ALLCURLPAUSE_CONTrJ   r\   
def_externrd   rp   r   r   r   r   r   r   r   r   r   r  r2   r%   r#   <module>r     s(   "  	  
 
  %  4 4 	   L L "  !"2::;< => 7	 7       ! !          /$'::4 4  -a01 24T> -.BCD E -.BCD E -.ABC D* -.ABC D* -.@AB CN= N=b\ \r%   