
    >OOfG                        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 d dlZddlmZmZ ddlmZmZmZmZ  ej*                         Z e j.                  d      Z e j.                  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jJ                         de&de&fd       Z' ejJ                         d        Z(d Z) ejJ                         d        Z*dee+   fdZ, G d d      Z- G d d      Z.y)    N)SimpleCookie)Path)AnyListOptionalTupleUnion   )ffilib)CurlHttpVersionCurlInfoCurlOpt
CurlWsFlags   HTTP/\d\.\d [0-9]{3} (.*)s   HTTP/(\d\.\d) ([0-9]{3}) (.*)c                   *     e Zd ZdZddef fdZ xZS )	CurlErrorz$Base exception for curl_cffi packagecodec                 :    t        |   |g|i | || _        y N)super__init__r   )selfmsgr   argskwargs	__class__s        O/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/curl_cffi/curl.pyr   zCurlError.__init__   s!    .t.v.	    )r   )__name__
__module____qualname____doc__intr   __classcell__)r   s   @r   r   r      s    .#  r   r                  i  l    typereturnc                     t        j                  ||      dd }|t        t        fv rt	        d|       y|t
        t        fv rt	        |j                  dd             yt	        |j                         d       y)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)curlr*   datasizeclientptexts         r   debug_functionr<   %   su     ::dD!!$D$&;<<i
 	 
"$56	6dkk'9-.  	dkkm$r   c                     t        j                  |      }|j                  t        j                  | |      dd        ||z  S )zAffi callback for curl write function, directly writes to a bufferN)r   from_handlewriter0   )ptrr9   nmembuserdatar0   s        r   buffer_callbackrC   2   s8     __X&F
LLC'*+4<r   c                     | syt        |       S )Nr   )r#   )ss    r   
ensure_intrF   ;   s    q6Mr   c                     t        j                  |      } |t        j                  | |      dd       }t        |      }|t        k(  s	|t
        k(  r|S |||z  k7  rt        j                  dt               ||z  S )zHffi callback for curl write function, calls the callback python functionNzWrote bytes != received bytes.)	r   r>   r0   rF   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnRuntimeWarning)r@   r9   rA   rB   callbackwrotes         r   write_callbackrO   A   sq     x(HSZZU+A./EuE$$1E(E6G4<r   c                     g }| }|r=|j                  t        j                  |j                               |j                  }|r=t        j                  |        |S )z%Converts curl slist to a python list.)appendr   stringr8   nextr   curl_slist_free_all)headresultr@   s      r   slist_to_listrW   Q   sK    F
C
cjj*+hh  D!Mr   c                      e Zd ZdZd(dededdfdZd)dZd)dZd)d	Z	d
e
deddfdZd
e
defdZdedede
fdZdedeee
eef   fdZdefdZd*dedede
fdZd)dZd*deddfdZd*deddfdZd+dZd)dZdee   defdZededefd       Z edede!e"e
ef   fd        Z#d)d!Z$d,d"e
de!eef   fd#Z%e&jN                  fd$ed%e&de
fd&Z(d)d'Z)y)-Curlz;
    Wrapper for ``curl_easy_*`` functions of libcurl.
    Ncacertdebugr+   c                 v   |st        j                         n|| _        t        j                  | _        t        j                  | _        t        j                  | _        |xs t        | _	        d| _
        d| _        d| _        d| _        t        j                  dd      | _        || _        | j#                          y)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   rZ   r[   handles       r   r   zCurl.__init__a   s     28S'')V
!hh/!!"  WWXs3 r   c                 ~   t        j                  | j                  t        j                  | j
                        }|dk7  rt        j                  d       | j                  r^| j                  t        j                  d       t        j                  | j                  t        j                  t         j                         y y )Nr   zFailed to set error bufferr
   )r   _curl_easy_setoptr`   r   ERRORBUFFERrl   rJ   rK   rm   setoptVERBOSEDEBUGFUNCTIONr<   r   rets     r   rn   zCurl._set_error_bufferv   sz    ##DJJ0C0CTEWEWX!8MM67;;KK+!!$**g.C.CSEWEWX r   c                     | j                  t        j                  d       t        j                  | j
                  t        j                  t        j                         y)zSet debug to Truer
   N)rs   r   rt   r   rq   r`   ru   r<   r   s    r   r[   z
Curl.debug~   s6    GOOQ'djj'*?*?ASASTr   c                 $    | j                          y r   closery   s    r   __del__zCurl.__del__       

r   errcoder   c                 2     | j                   |g| }||y r   )
_get_error)r   r   r   errors       r   _check_errorzCurl._check_error   s'    /$/K r   c           	          |dk7  rlt        j                  | j                        j                         }dj	                  |D cg c]  }t        |       c}      }t        d| d| d| d|      S y c c}w )Nr    z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r   )r   rR   rl   r6   joinstrr   )r   r   r   errmsgaactions         r   r   zCurl._get_error   s{    a<ZZ 2 23::<FXXt4!s1v45FVHIgYb A\ \  4s   A3optionvaluec                 >   ddddd}|j                  t        |dz        dz        }|dk(  rt        j                  d|      }n'|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                         nK|t        j                  k(  rjt        j                  |      }|| _        t        j                  | j                  t        j                  t        j                          t        j
                  }n|t        j                  k(  rjt        j                  |      }|| _        t        j                  | j                  t        j                  t        j                          t        j                  }nQ|dk(  r>t#        |t$              r|j'                         }n|}|t        j(                  k(  r|| _        nt-        d|z        |t        j.                  k(  rY|D ]'  }t        j0                  | j2                  |      | _        ) t        j                  | j                  || j2                        }n|t        j4                  k(  rX|D ]'  }t        j0                  | j6                  |      | _        ) t        j                  | j                  || j6                        }n|t        j8                  k(  rx|D ]G  }	t#        |	t$              r|	j'                         }	t        j0                  | j:                  |	      | _        I t        j                  | j                  || j:                        }n!t        j                  | j                  ||      }| j=                  |d||       |t        j>                  k(  rd| _         |S )	a  Wrapper 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``.
        zint*zchar*zvoid*)r   '  i N  i0u  r   zOption unsupported: %srs   T)!getr#   r   rk   r   	WRITEDATA
new_handlerh   r   rq   r`   WRITEFUNCTIONrC   
HEADERDATAri   HEADERFUNCTIONrO   
isinstancer   encode
POSTFIELDSrj   NotImplementedError
HTTPHEADERcurl_slist_appendrb   PROXYHEADERrc   RESOLVErd   r   CAINFOrg   )
r   r   r   input_option
value_typec_valueheaderrw   proxy_headerresolves
             r   rs   zCurl.setopt   s     
 "%%c&5.&9E&AB
ggfe,Gw(((nnU+G!(D!!$**g.C.CSEXEXYw)))nnU+G")D!!$**g.D.DcFYFYZw,,,nnU+G!(D!!$**g.C.CSEWEWX&&Fw---nnU+G")D!!$**g.C.CSEWEWX''F7"%%,,.+++$+!%&>&GHHW''' M # 5 5dmmV LM''

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

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

FDMMJC''

FGDC#x7W^^# $D
r   c                 b   ddddd}t         j                  t        t        d}t        j                  ||dz           }t        j                  | j                  ||      }| j                  |d|       |dz  d	k(  rt        |d
         S |d
   t         j                  k(  ry ||dz     |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**zlong*zdouble*zstruct curl_slist **)         0   @ )r   r   r   i   getinfor   r   r   )r   rR   r#   floatrk   r   curl_easy_getinfor`   r   rW   ra   )r   r   
ret_optionret_cast_optionr   rw   s         r   r   zCurl.getinfo   s     ,	

 jj

 ''*Vh%678##DJJ@#y&1H( ,,1:!1v01'!*==r   c                 P    t        j                  t        j                               S )z#Get the underlying libcurl version.)r   rR   r   curl_versionry   s    r   versionzCurl.version   s    zz#**,--r   targetdefault_headersc                 r    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   curl_easy_impersonater`   r   r#   )r   r   r   s      r   impersonatezCurl.impersonate  s(     ((V]]_c/FZ[[r   c                    | j                   sy| j                  t        j                  | j                        }| j                  |d       | j                  t        j                  | j                        }| j                  |d       y y )Nz
set cacertzset proxy cacert)rg   rs   r   r   rf   r   PROXY_CAINFOrv   s     r   _ensure_cacertzCurl._ensure_cacert  sc      ++gnndll;Cc<0++g22DLLACc#56	 !r   clear_headersc                     | j                          t        j                  | j                        }	 | j	                  |d       | j                  |       y# | j                  |       w xY w)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_performr`   r   clean_after_perform)r   r   rw   s      r   r   zCurl.perform  sZ     	 ##DJJ/	4c9- $$]3D$$]3s   A A(c                 x   d| _         d| _        d| _        |r| j                  t        j
                  k7  rt        j                  | j                         t        j
                  | _        | j                  t        j
                  k7  rt        j                  | j                         t        j
                  | _        yy)zKClean up handles and buffers after perform, called at the end of `perform`.N)	rh   ri   rj   rb   r   ra   r   rT   rc   )r   r   s     r   r   zCurl.clean_after_perform+  s    !" }}(''6HHDM""chh.''(;(;<"%((D r   c                     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.)rZ   r[   ro   )r   curl_easy_duphandler`   rY   rf   rm   )r   r   cs      r   	duphandlezCurl.duphandle9  s3    
 ,,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)rg   r`   r   curl_easy_resetrn   r   ra   rd   ry   s    r   resetz
Curl.resetB  s=    !::!

+""$r   headersc                     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   lower
startswithloadr6   )r   r   cookier   s       r   parse_cookie_headerszCurl.parse_cookie_headersJ  sP      ,~ 	2F||~((9F23K..01	2 r   status_linec                 V    t         j                  |       }|r|j                  d      S dS )zLExtract reason phrase, like ``OK``, ``Not Found`` from response status line.r
   r   )REASON_PHRASE_REmatchgroup)r   ms     r   get_reason_phrasezCurl.get_reason_phraseY  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.0r%   r&   )	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                   r&t        j                  | j                          d| _         t        j                  | j
                         t        j                  | _        y)zAClose and cleanup curl handle, wrapper for ``curl_easy_cleanup``.N)r`   r   curl_easy_cleanupr   releaserl   ra   rd   ry   s    r   r|   z
Curl.closev  s?    ::!!$**-DJD&&'r   nc                 0   t        j                  d|      }t        j                  d      }t        j                  d      }t        j                  | j                  ||||      }| j                  |d       |d   }t        j                  |      d|d    |fS )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.
        r]   int *zstruct curl_ws_frame **WS_RECVr   N)r   rk   r   curl_ws_recvr`   r   r0   )r   r   r0   n_recvp_framerw   frames          r   ws_recvzCurl.ws_recv~  s     1%!''34tzz61fgF#y) 
zz&!+F1I.55r   payloadflagsc                     t        j                  d      }t        j                  |      }t        j                  | j
                  |t        |      |d|      }| j                  |d       |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.
        r   r   WS_SEND)r   rk   from_bufferr   curl_ws_sendr`   lenr   )r   r   r   n_sentr0   rw   s         r   ws_sendzCurl.ws_send  s\     !)tzz63v;5Q#y)ayr   c                 D    | j                  dt        j                         y)zSend the close frame.r   N)r   r   CLOSEry   s    r   ws_closezCurl.ws_close  s    S***+r   )r.   FNr+   N)T)r+   rY   )i   )*r   r    r!   r"   r   boolr   rn   r[   r}   r#   r   r   r   r   rs   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   rY   rY   \   s   !s ! !d !*YU
C   
# c JW JS JS JX>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   rY   c                       e Zd ZdZddee   fdZddddddedee   dee   d	eeee	e
f      d
ee	   ddfdZedee   fd       Zddee   ddfdZddZddZy)CurlMimez#Wrapper for the ``curl_mime_`` API.Nr7   c                     |r|n	t               | _        t        j                  | j                  j                        | _        y)z?
        Args:
            curl: Curl instance to use.
        N)rY   r`   r   curl_mime_init_form)r   r7   s     r   r   zCurlMime.__init__  s-    
 "Ttv
''

(8(89
r   )content_typefilename
local_pathr8   namer  r  r  r8   r+   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_addpartr  curl_mime_namer   r   curl_mime_typecurl_mime_filenamer   r   r   r   r6   existsFileNotFoundErrorcurl_mime_filedatacurl_mime_datar   )	r   r  r  r  r  r8   partrw   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   filesc                 F     |        }|D ]  } |j                   di |  |S )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``r   )r  )clsr  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`   rs   r   MIMEPOSTr  )r   r7   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_freer  r   ra   ry   s    r   r|   zCurlMime.close  s!     	4::&XX
r   c                 $    | j                          y r   r{   ry   s    r   r}   zCurlMime.__del__	  r~   r   r   r   )r   r    r!   r"   r   rY   r   r   r	   r   r   r  classmethodr   dictr  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   )/rerJ   http.cookiesr   pathlibr   typingr   r   r   r   r	   certifi_wrapperr   r   constr   r   r   r   wherere   compiler   r   	Exceptionr   CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTr4   r5   r1   r2   rH   rI   
def_externr#   r<   rC   rF   rO   r   rW   rY   r   r   r   r   <module>r.     s)   	  %  4 4   A A2::;< =>	        ! !  	s 	C 	 	    4; O, O,d
\ \r   