
    di^                    @   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mZ d dl	m
Z
 d dlmZmZmZmZmZm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  ej<                         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. ej^                         d"d       Z0d#d$dZ1d%dZ2 ej^                         d        Z3d Z4 ej^                         d        Z5d&dZ6 G d d      Z7 G d  d!      Z8y)'    )annotationsN)SimpleCookie)Path)TYPE_CHECKINGAnyLiteralOptionalUnioncast   )ffilib)	CurlECodeCurlHttpVersionCurlInfoCurlOpt
CurlWsFlag)CurlCffiWarnings   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__     E/root/funda.leads/venv/lib/python3.12/site-packages/curl_cffi/curl.pyr   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 packagec                :    t        |   |g|i | || _        y N)super__init__code)selfmsgr*   argskwargs	__class__s        r#   r)   zCurlError.__init__#   s!    .t.v.26	r"   )r   )r*   zUnion[CurlECode, Literal[0]])r   r   r   __doc__r)   __classcell__)r/   s   @r#   r%   r%       s    .7 7r"   r%                  i  l    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_functionrA   4   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r'   )format).0bytefmts     r#   	<genexpr>zbytes_to_hex.<locals>.<genexpr>C   s     3CJJt$3s   )join)b	uppercaserH   s     @r#   bytes_to_hexrM   =   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-8rC   )CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTgetrM   r   sysstderrwritedecodeUnicodeDecodeError)r;   r<   PREFIXESMAX_SHOW_BYTESprefixhex_strpostfixr@   s           r#   debug_function_defaultrg   F   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   r8   r_   r9   )ptrr=   nmembuserdatar9   s        r#   buffer_callbackrl   e   s8     __X&F
LLC'*+4<r"   c                    | syt        |       S Nr   )r   )ss    r#   
ensure_intrp   n   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.r2   
stacklevel)	r   r8   r9   rp   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnr   )ri   r=   rj   rk   r?   wrotes         r#   write_callbackry   t   st     x(HSZZU+A./EuE$$1E(E6TUV4<r"   c                    g }| }|r=|j                  t        j                  |j                               |j                  }|r=t        j                  |        |S )z%Converts curl slist to a python list.)appendr   stringr<   nextr   curl_slist_free_all)headresultri   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                j   |r|nt        j                         | _        t        j                  | _        t        j                  | _        t        j                  | _        |xs t        | _	        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_write_handle_header_handle_debug_handle_body_handlenew_error_buffer_debug_set_error_buffer_WS_RECV_BUFFER_SIZE_ws_recv_buffer_ws_recv_n_recv_ws_recv_p_frame_ws_send_n_sent)r+   cacertdebughandles       r#   r)   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 bufferr2   rr   )r   _curl_easy_setoptr   r   ERRORBUFFERr   rv   rw   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 r'   closer   s    r#   __del__zCurl.__del__       

r"   c                >    |dk(  ry  | j                   |g| }||y rn   )
_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errorsrC   z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r*   )	r   r|   r   r`   rJ   strr%   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                         ne|t        j                  k(  r[t        j                  |      }|| _        t        j                  | 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        j&                         t        j(                  }ns|dk(  r_t+        |t,              r1t        j.                  t        j0                  t        j2                  t        j4                  t        j6                  t        j8                  t        j:                  t        j<                  t        j>                  t        j@                  t        jB                  t        jD                  t        jF                  t        jH                  h}tJ        jL                  jO                  d	      r-||v r)tQ        jR                  d
      }|jU                  |d      }n|jU                         }n|}|t        jV                  k(  r|| _,        nt[        d|       |t        j\                  k(  rY|D ]'  }t        j^                  | j`                  |      | _0        ) t        j                  | j                   || j`                        }	n|t        jb                  k(  rX|D ]'  }
t        j^                  | jd                  |
      | _2        ) t        j                  | j                   || jd                        }	n|t        jf                  k(  rx|D ]G  }t+        |t,              r|jU                         }t        j^                  | jh                  |      | _4        I t        j                  | j                   || jh                        }	n!t        j                  | j                   ||      }	| jk                  |	d||       |t        j.                  k(  rd| _6        |	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   )7r   r\   r   r   r   	WRITEDATA
new_handler   r   r   WRITEFUNCTIONrl   
HEADERDATAr   HEADERFUNCTIONry   r   rg   r   rA   	DEBUGDATA
isinstancer   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getpreferredencodingencode
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.C.CSEWEWX&&Fw---nnU+G")D!!

G22C4F4F ''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.getinfoJ  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.versionw  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                   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   s     r#   _ensure_cacertzCurl._ensure_cacert  sc      ++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   r%   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 rn   )r   r   curl_easy_upkeepr   s    r#   upkeepzCurl.upkeep  s$    ::##DJJ//r"   c                ,   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  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   r%   r   curl_easy_duphandler   r   r   )r+   r   cs      r#   	duphandlezCurl.duphandle  sI    
 ::=>>,,TZZ8
DKK
Kr"   c                    d| _         | j                  /t        j                  | j                         | j	                          t
        j                  | _        y)z8Reset all curl options, wrapper for ``curl_easy_reset``.FN)r   r   r   curl_easy_resetr   r   r   r   r   s    r#   resetz
Curl.reset  s=    !::!

+""$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+   headers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.0r2   r3   )	STATUS_LINE_REr  r   V1_0r  V2_0V1_1NONEr   )r  r  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)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                        }| j                  |d       | j                  d   }t        j                  | 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   r%   r   curl_ws_recvr   r   r   r   r   r   r9   )r+   r   frames      r#   ws_recvzCurl.ws_recv  s     ::MNNJJ  %%  !!
 	#y) %%a(zz$../0I$2F2Fq2IJEQQr"   c                
   | j                   t        d      t        j                  |      }t	        j
                  | j                   |t        |      | j                  d|      }| 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:
            0 if no error.

        Raises:
            CurlError: if failed.
        z,Cannot send websocket data on closed handle.r   WS_SEND)	r   r%   r   from_bufferr   curl_ws_sendr   r   r   )r+   payloadr   r9   r   s        r#   ws_sendzCurl.ws_send-  sv     ::JKK)JJGd.B.BAu
 	#y)##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packr5  r   CLOSE)r+   r*   messager4  s       r#   ws_closezCurl.ws_closeD  s2     ++dD)G3||G:+;+;|<<r"   )rS   FN)r   r   r   boolreturnNoner=  r>  )r   r   r-   r   r=  r>  )r   r   r-   r   )r   r   r   r   r=  r   )r   r   r=  zUnion[bytes, int, float, list])r=  bytes)T)r   r   r   r<  r=  r   )TT)r  r<  r  r<  r=  r>  )r=  r   )r=  r   )r  list[bytes]r=  r   )r  r@  r=  r@  )r  r@  r=  z"tuple[CurlHttpVersion, int, bytes])r=  ztuple[bytes, CurlWsFrame])r4  r@  r   r   r=  r   )i  r"   )r*   r   r:  r@  r=  r   )r   r   r   r0   r   r)   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  staticmethodr  r'  r   r/  r   BINARYr5  r;  r!   r"   r#   r   r      s     &381
	tl+8Z.
 7I20 AE+!+9=+	+0	! ( ( 1 1,(R0 ;E:K:K '.=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#   r)   zCurlMime.__init__Z  s-    
 "Ttv
''

(8(89
r"   )content_typefilename
local_pathr<   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_addpartrH  curl_mime_namer   r%   curl_mime_typecurl_mime_filenamer   r   r   r@  r`   existsFileNotFoundErrorcurl_mime_filedatacurl_mime_datar   )	r+   namerI  rJ  rK  r<   partr   local_path_strs	            r#   addpartzCurlMime.addpartb  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``r!   )rX  )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   MIMEPOSTrH  )r+   r:   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_freerH  r   r   r   s    r#   r   zCurlMime.close  s!     	4::&XX
r"   c                $    | j                          y r'   r   r   s    r#   r   zCurlMime.__del__  r   r"   r'   )r:   Optional[Curl])rU  r   rI  Optional[str]rJ  rf  rK  z!Optional[Union[str, bytes, Path]]r<   zOptional[bytes]r=  r>  )r[  z
list[dict])r:   re  r=  r>  r?  )r   r   r   r0   r)   rX  classmethodr^  ra  r   r   r!   r"   r#   rE  rE  W  s{    -: '+"&8< $;<;< $	;<
  ;< 6;< ;< 
;<z  /
r"   rE  )r;   r   r=   r   r=  r   )F)rK   r@  rL   r<  r=  r   )r;   r   r<   r@  r=  r>  )r=  rA  )9
__future__r   rer   r7  r]   rv   http.cookiesr   pathlibr   typingr   r   r   r	   r
   r   certifi_wrapperr   r   constr   r   r   r   r   utilsr   wherer   compiler  r  r   	Exceptionr%   rU   rV   rW   rX   rY   rZ   r[   rt   ru   
def_externrA   rM   rg   rl   rp   ry   r   r   rE  r!   r"   r#   <module>ru     s7   " 	   
  %  E E   L L "2::;< => 7	 7       ! !   4T>    E= E=P\ \r"   