
    vKgG                         S SK r S SKrS SKJr  S SKJr  S SKJrJrJ	r	J
r
JrJrJr  S SKrSSKJrJr  SSKJrJrJrJrJr  \R0                  " 5       r\ R4                  " S5      r\ R4                  " S	5      r " S
 S\5      rS rSr Sr!Sr"Sr#Sr$Sr%Sr&Sr'\RP                  " 5       S\)S\)4S j5       r*\RP                  " 5       S 5       r+S r,\RP                  " 5       S 5       r-S\\.   4S jr/ " S S5      r0 " S S5      r1g)    N)SimpleCookie)Path)AnyListLiteralOptionalTupleUnioncast   )ffilib)	CurlECodeCurlHttpVersionCurlInfoCurlOpt
CurlWsFlags   HTTP/\d\.\d [0-9]{3} (.*)s   HTTP/(\d\.\d) ([0-9]{3}) (.*)c                   H   ^  \ rS rSrSrSS\\\S   4   4U 4S jjjrSr	U =r
$ )	CurlError   z$Base exception for curl_cffi packager   codec                 :   > [         TU ]  " U/UQ70 UD6  X l        g N)super__init__r   )selfmsgr   argskwargs	__class__s        N/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/curl_cffi/curl.pyr   CurlError.__init__   s    .t.v.26	    r   )r   )__name__
__module____qualname____firstlineno____doc__r
   r   r   r   __static_attributes____classcell__)r    s   @r!   r   r      s%    .7%	71:(="> 7 7r#   r                  i  l    typereturnc                     [         R                  " X#5      SS nU[        [        4;   a  [	        SU5        gU[
        [        4;   a  [	        UR                  SS5      5        g[	        UR                  5       SS9  g)z ffi callback for curl debug infoNzSSL OUTzutf-8replace )endr   )r   bufferCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTprintCURLINFO_DATA_INCURLINFO_DATA_OUTdecode)curlr1   datasizeclientptexts         r!   debug_functionrC   %   ss     ::d!!$D$&;<<i
 	 
"$56	6dkk'9-.  	dkkm$r#   c                     [         R                  " U5      nUR                  [         R                  " X5      SS 5        X!-  $ )zAffi callback for curl write function, directly writes to a bufferN)r   from_handlewriter7   )ptrr@   nmembuserdatar7   s        r!   buffer_callbackrJ   2   s4     __X&F
LLC'*+<r#   c                 (    U (       d  g[        U 5      $ )Nr   )int)ss    r!   
ensure_intrN   ;   s    q6Mr#   c                     [         R                  " U5      nU" [         R                  " X5      SS 5      n[        U5      nU[        :X  d
  U[
        :X  a  U$ XRU-  :w  a  [        R                  " S[        SS9  X!-  $ )zHffi callback for curl write function, calls the callback python functionNzWrote bytes != received bytes.r,   
stacklevel)	r   rE   r7   rN   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnRuntimeWarning)rG   r@   rH   rI   callbackwrotes         r!   write_callbackrY   A   sn     x(HSZZ+A./EuE$$1E(E6STU<r#   c                     / nU nU(       aD  UR                  [        R                  " UR                  5      5        UR                  nU(       a  MD  [
        R                  " U 5        U$ )z%Converts curl slist to a python list.)appendr   stringr?   nextr   curl_slist_free_all)headresultrG   s      r!   slist_to_listra   Q   sM    F
C
cjj*+hh # D!Mr#   c                      \ rS rSrSrS*S\S\SS4S jjrS+S jrS+S	 jr	S+S
 jr
S\S\SS4S jrS\S\4S jrS\S\S\4S jrS\S\\\\\4   4S jrS\4S jrS,S\S\S\4S jjrS+S jrS,S\SS4S jjrS,S\SS4S jjrS-S jrS+S jrS\\   S\4S jr\ S\S\4S  j5       r!\ S\S\"\#\\4   4S! j5       r$S+S" jr%S.S#\S\"\\4   4S$ jjr&\'RP                  4S%\S&\'S\4S' jjr)S+S( jr*S)r+g)/Curl\   z3
Wrapper for ``curl_easy_*`` functions of libcurl.
Ncacertdebugr2   c                    U(       a  UO[         R                  " 5       U l        [        R                  U l        [        R                  U l        [        R                  U l        U=(       d    [        U l	        SU l
        SU l        SU l        SU l        [        R                  " SS5      U l        X l        U R#                  5         g)z
Parameters:
    cacert: CA cert path to use, by default, curl_cffi uses certs from ``certifi``.
    debug: whether to show curl debug messages.
    handle: a curl handle instance from ``curl_easy_init``.
FNchar[]   )r   curl_easy_init_curlr   NULL_headers_proxy_headers_resolveDEFAULT_CACERT_cacert_is_cert_set_write_handle_header_handle_body_handlenew_error_buffer_debug_set_error_buffer)r   re   rf   handles       r!   r   Curl.__init__a   s      &V3+=+=+?
!hh/!!"  WWXs3 r#   c                    [         R                  " U R                  [        R                  U R
                  5      nUS:w  a  [        R                  " SSS9  U R                  (       a_  U R                  [        R                  S5        [         R                  " U R                  [        R                  [         R                  5        g g )Nr   zFailed to set error bufferr,   rP   r   )r   _curl_easy_setoptrk   r   ERRORBUFFERrw   rT   rU   rx   setoptVERBOSEDEBUGFUNCTIONrC   r   rets     r!   ry   Curl._set_error_bufferv   s|    ##DJJ0C0CTEWEWX!8MM61E;;KK+!!$**g.C.CSEWEWX r#   c                     U R                  [        R                  S5        [        R                  " U R
                  [        R                  [        R                  5        g)zSet debug to Truer   N)r   r   r   r   r}   rk   r   rC   r   s    r!   rf   
Curl.debug~   s6    GOOQ'djj'*?*?ASASTr#   c                 $    U R                  5         g r   closer   s    r!   __del__Curl.__del__       

r#   errcoder   c                 4    U R                   " U/UQ76 nUb  Ueg r   )
_get_error)r   r   r   errors       r!   _check_errorCurl._check_error   s%    /$/K r#   c           	         US:w  az  [         R                  " U R                  5      R                  5       nSR	                  U Vs/ sH  n[        U5      PM     sn5      n[        SU SU SU S3[        [        U5      S9$ g s  snf )Nr    z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.r$   )	r   r\   rw   r=   joinstrr   r   r   )r   r   r   errmsgaactions         r!   r   Curl._get_error   s    a<ZZ 2 23::<FXXt4t!s1vt45FVHIgYb A\ \)W-  4s   Boptionvaluec                 x   SSSSSS.nUR                  US-  S-  5      nUS:X  d  US:X  a  [        R                  " XB5      nGO4U[        R                  :X  a\  [        R
                  " U5      nXPl        [        R                  " U R                  [        R                  [        R                  5        GOU[        R                  :X  a\  [        R
                  " U5      nXPl        [        R                  " U R                  [        R                  [        R                  5        GOTU[        R                  :X  ak  [        R
                  " U5      nXPl        [        R                  " U R                  [        R                  [        R                  5        [        R                  nOU[        R                  :X  ak  [        R
                  " U5      nXPl        [        R                  " U R                  [        R                  [        R                  5        [        R                  nOVUS:X  aB  [!        U["        5      (       a  UR%                  5       OUnU[        R&                  :X  a  XPl        O[+        SU 35      eU[        R,                  :X  a\  U H)  n[        R.                  " U R0                  U5      U l        M+     [        R                  " U R                  XR0                  5      nGO$U[        R2                  :X  a[  U H)  n[        R.                  " U R4                  U5      U l        M+     [        R                  " U R                  XR4                  5      nOU[        R6                  :X  a  U HN  n	[!        U	["        5      (       a  U	R%                  5       n	[        R.                  " U R8                  U	5      U l        MP     [        R                  " U R                  XR8                  5      nO![        R                  " U R                  X5      nU R;                  USX5        U[        R<                  :X  a  S	U l        U$ )
zWrapper for ``curl_easy_setopt``.

Parameters:
    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``.
long*zchar*zvoid*zint64_t*)r   '  i N  i0u  i@  r   zOption unsupported: r   T) getr   rv   r   	WRITEDATA
new_handlers   r   r}   rk   WRITEFUNCTIONrJ   
HEADERDATArt   HEADERFUNCTIONrY   
isinstancer   encode
POSTFIELDSru   NotImplementedError
HTTPHEADERcurl_slist_appendrm   PROXYHEADERrn   RESOLVEro   r   CAINFOrr   )
r   r   r   input_option
value_typec_valueheaderr   proxy_headerresolves
             r!   r   Curl.setopt   s    
 "%%v%&?@
 J*$<ggj0Gw(((nnU+G!(!!$**g.C.CSEXEXYw)))nnU+G")!!$**g.D.DcFYFYZw,,,nnU+G!(!!$**g.C.CSEWEWX&&Fw---nnU+G")!!$**g.C.CSEWEWX''F7"(25#(>(>ellnEG+++$+!%(<VH&EFFW''' # 5 5dmmV L  ''

FMMJCw*** %&)&;&;D<O<OQ]&^# !&''

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

FMMJC''

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

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

Returns:
    value retrieved from last perform.
zchar**r   zdouble*zstruct curl_slist **)         0   @ )r   r   r   i   getinfor   r   r#   )r   r\   rL   floatrv   r   curl_easy_getinfork   r   ra   rl   )r   r   
ret_optionret_cast_optionr   r   s         r!   r   Curl.getinfo   s     ,	

 jj

 ''*h%678##DJJ@#y&1H( ,,1:!01'!*==r#   c                 T    [         R                  " [        R                  " 5       5      $ )z#Get the underlying libcurl version.)r   r\   r   curl_versionr   s    r!   versionCurl.version   s    zz#**,--r#   targetdefault_headersc                 t    [         R                  " U R                  UR                  5       [	        U5      5      $ )zSet the browser type to impersonate.

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

Returns:
    0 if no error.
)r   curl_easy_impersonaterk   r   rL   )r   r   r   s      r!   impersonateCurl.impersonate  s(     ((V]]_c/FZ[[r#   c                    U R                   (       dy  U R                  [        R                  U R                  5      nU R                  US5        U R                  [        R                  U R                  5      nU R                  US5        g g )Nz
set cacertzset proxy cacert)rr   r   r   r   rq   r   PROXY_CAINFOr   s     r!   _ensure_cacertCurl._ensure_cacert  sc      ++gnndll;Cc<0++g22DLLACc#56	 !r#   clear_headersc                     U R                  5         [        R                  " U R                  5      n U R	                  US5        U R                  U5        g! U R                  U5        f = f)zWrapper for ``curl_easy_perform``, performs a curl request.

Parameters:
    clear_headers: clear header slist used in this perform

Raises:
    CurlError: if the perform was not successful.
performN)r   r   curl_easy_performrk   r   clean_after_perform)r   r   r   s      r!   r   Curl.perform  sZ     	 ##DJJ/	4c9- $$]3D$$]3s   A A)c                    SU l         SU l        SU l        U(       a  U R                  [        R
                  :w  a   [        R                  " U R                  5        [        R
                  U l        U R                  [        R
                  :w  a   [        R                  " U R                  5        [        R
                  U l        gg)zKClean up handles and buffers after perform, called at the end of `perform`.N)	rs   rt   ru   rm   r   rl   r   r^   rn   )r   r   s     r!   r   Curl.clean_after_perform)  s    !" }}(''6HHDM""chh.''(;(;<"%((D r#   c                     [         R                  " U R                  5      n[        U R                  U R
                  US9nU$ )zWrapper for ``curl_easy_duphandle``.

This is not a full copy of entire curl object in python. For example, headers
handle is not copied, you have to set them again.)re   rf   rz   )r   curl_easy_duphandlerk   rc   rq   rx   )r   r   cs      r!   	duphandleCurl.duphandle7  s3    
 ,,TZZ8
DKK
Kr#   c                     SU l         U R                  b0  [        R                  " U R                  5        U R	                  5         [
        R                  U l        g)z8Reset all curl options, wrapper for ``curl_easy_reset``.FN)rr   rk   r   curl_easy_resetry   r   rl   ro   r   s    r!   reset
Curl.reset@  s=    !::!

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

Parameters:
    headers: list of headers in bytes.

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

Returns:
    http_version, status_code, and reason phrase
r   r#   r   z2.0z1.1z1.0r,   r-   )	STATUS_LINE_REr   r   V1_0r   V2_0V1_1NONErL   )r   r   http_versionstatus_codereasons        r!   parse_status_lineCurl.parse_status_line]  s       -"''C//771:*//LWWQZ5 *//LWWQZ5 *//L*//L!''!*o&00r#   c                     U R                   (       a'  [        R                  " U R                   5        SU l         [        R                  " U R
                  5        [        R                  U l        g)zAClose and cleanup curl handle, wrapper for ``curl_easy_cleanup``.N)rk   r   curl_easy_cleanupr   releaserw   rl   ro   r   s    r!   r   
Curl.closet  s?    ::!!$**-DJD&&'r#   nc                 6   [         R                  " SU5      n[         R                  " S5      n[         R                  " S5      n[        R                  " U R                  X!X45      nU R                  US5        US   n[         R                  " U5      SUS    U4$ )zReceive a frame from a websocket connection.

Args:
    n: maximum data to receive.

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

Raises:
    CurlError: if failed.
rh   int *zstruct curl_ws_frame **WS_RECVr   N)r   rv   r   curl_ws_recvrk   r   r7   )r   r  r7   n_recvp_framer   frames          r!   ws_recvCurl.ws_recv|  s     1%!''34tzz6fF#y) 
zz&!+F1I.55r#   payloadflagsc                     [         R                  " S5      n[         R                  " U5      n[        R                  " U R
                  U[        U5      USU5      nU R                  US5        US   $ )zSend 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.
r  r   WS_SEND)r   rv   from_bufferr   curl_ws_sendrk   lenr   )r   r  r  n_sentr7   r   s         r!   ws_sendCurl.ws_send  s\     !)tzz63v;5Q#y)ayr#   c                 D    U R                  S[        R                  5        g)zSend the close frame.r#   N)r  r   CLOSEr   s    r!   ws_closeCurl.ws_close  s    S***+r#   )ru   rq   rk   rx   rw   rt   rm   rr   rn   ro   rs   )r5   FNr2   N)T)r2   rc   )i   ),r%   r&   r'   r(   r)   r   boolr   ry   rf   r   rL   r   r   r   r   r   r   r
   bytesr   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r	   r   r   r   r	  r   BINARYr  r  r*    r#   r!   rc   rc   \   s   !s ! !d !*YU
C   
# c HW HS HS HT>h >5UD1H+I ><. .
\# 
\ 
\ 
\74T 4T 4*+ + +!DK L  (u ( ( (
 1u 1U7R1S 1 1,!6 6eSj(9 60 ;E:K:K u Z PS &,r#   rc   c                       \ rS rSrSrSS\\   4S jjrSSSSS.S\S\\   S	\\   S
\\	\\
\4      S\\
   SS4S jjr\S\\   4S j5       rSS\\   SS4S jjrSS jrSS jrSrg)CurlMimei  z#Wrapper for the ``curl_mime_`` API.Nr>   c                     U(       a  UO	[        5       U l        [        R                  " U R                  R                  5      U l        g)z'
Args:
    curl: Curl instance to use.
N)rc   rk   r   curl_mime_init_form)r   r>   s     r!   r   CurlMime.__init__  s-    
 "Ttv
''

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

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

Args:
    name: name of the field.
    content_type: content_type for the field. for example: ``image/png``.
    filename: filename for the server.
    local_path: file to upload on local disk.
    data: file content to upload.
r   zAdd field failed.Nz1Can not use local_path and data at the same time.zFile not found at )r   curl_mime_addpartr#  curl_mime_namer   r   curl_mime_typecurl_mime_filenamer   r   r   r  r=   existsFileNotFoundErrorcurl_mime_filedatacurl_mime_datar  )	r   r(  r%  r&  r'  r?   partr   local_path_strs	            r!   addpartCurlMime.addpart  s   ( $$TZZ0  {{}5!8/00 #$$T+>+>+@ACax 344 ((/@ACax 344$OPP !*d++!$ZJ..!+!2!2!4!+'..00'*<^<L(MNN((/D/D/FGCax 344dE**4y'')$$TT;C r#   filesc                 J    U " 5       nU H  nUR                   " S0 UD6  M     U$ )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``r  )r4  )clsr6  formfiles       r!   	from_listCurlMime.from_list  s)     uDLL 4  r#   c                     U(       a  UOU R                   nUR                  [        R                  U R                  5        g)z,Attach the mime instance to a curl instance.N)rk   r   r   MIMEPOSTr#  )r   r>   r   s      r!   attachCurlMime.attach  s'    Ddjj	!!4::.r#   c                 n    [         R                  " U R                  5        [        R                  U l        g)zjClose the mime instance and underlying files. This method must be called after
``perform`` or ``request``.N)r   curl_mime_freer#  r   rl   r   s    r!   r   CurlMime.close  s!     	4::&XX
r#   c                 $    U R                  5         g r   r   r   s    r!   r   CurlMime.__del__  r   r#   )rk   r#  r   r  )r%   r&   r'   r(   r)   r   rc   r   r   r
   r  r   r4  classmethodr   dictr;  r?  r   r   r*   r  r#   r!   r   r     s    -:Xd^ : '+"&8< $;<;< sm	;<
 3-;< U3t#345;< uo;< 
;<z d4j  /8D> /T /
r#   r   )2rerT   http.cookiesr   pathlibr   typingr   r   r   r   r	   r
   r   certifi_wrapperr   r   constr   r   r   r   r   whererp   compiler   r   	Exceptionr   CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTr;   r<   r8   r9   rR   rS   
def_externrL   rC   rJ   rN   rY   r  ra   rc   r   r  r#   r!   <module>rV     s    	  %  C C C   L L::;< =>7	 7       ! !  	s 	C 	 	    4; M, M,`
\ \r#   