
    XhM                    &   d dl m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j8                         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jZ                         d!d       Z.d"dZ/ ejZ                         d        Z0d Z1 ejZ                         d        Z2d#dZ3 G d d      Z4 G d d       Z5y)$    )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__     F/home/Script/Script_env/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   2   s4     w'H::dD!!$DUDr"   c                    | t         t        fv rt        d|       y | t        t        fv rt        |j                  dd             y t        |j                         d       y )NzSSL OUTzutf-8replace )end)CURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTprintCURLINFO_DATA_INCURLINFO_DATA_OUTdecode)r;   r@   s     r#   debug_function_defaultrL   ;   sM    %'<==i	#%67	7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   r8   writer9   )ptrr=   nmembuserdatar9   s        r#   buffer_callbackrR   D   s8     __X&F
LLC'*+4<r"   c                    | syt        |       S )Nr   )r   )ss    r#   
ensure_intrU   M   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   rU   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnr   )rO   r=   rP   rQ   r?   wrotes         r#   write_callbackr^   S   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resultrO   s      r#   slist_to_listrf   c   sK    F
C
cjj*+hh  D!Mr"   c                      e 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+dZej6                  fd,dZd-d.dZy)/Curlz;
    Wrapper for ``curl_easy_*`` functions of libcurl.
    Nc                   |r|nt        j                         | _        t        j                  | _        t        j                  | _        t        j                  | _        |xs t        | _	        d| _
        d| _        d| _        d| _        d| _        t        j                  dd      | _        || _        | j%                          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``.
        FNchar[]   )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)r+   cacertdebughandles       r#   r)   zCurl.__init__s   s      &V3+=+=+?
!hh/!"&#'"&!% WWXs3 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   rW   )r   _curl_easy_setoptrm   r   ERRORBUFFERrz   r[   r\   r   r{   r~   r+   rets     r#   r|   zCurl._set_error_buffer   sT    ##DJJ0C0CTEWEWX!8MM6TUV;;JJL r"   c                    | j                  t        j                  d       | j                  t        j                  d       y)zSet debug to Truer   TN)setoptr   VERBOSEDEBUGFUNCTIONr+   s    r#   r~   z
Curl.debug   s(    GOOQ'G))40r"   c                $    | j                          y r'   closer   s    r#   __del__zCurl.__del__       

r"   c                2     | j                   |g| }||y r'   )
_get_error)r+   errcoder-   errors       r#   _check_errorzCurl._check_error   s'    /$/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)errors z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r*   )	r   ra   rz   rK   join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                F	   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                         n@|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                  }nT|t        j                  k(  rjt        j
                  |      }|| _        t        j                  | j                  t        j                  t        j                         t        j                  }n|t        j                   k(  rt|du rt"        }t        j
                  |      }|| _        t        j                  | j                  t        j                   t        j&                         t        j(                  }nP|dk(  r=t+        |t,              r|j/                         n|}|t        j0                  k(  r|| _        nt5        d|       |t        j6                  k(  rY|D ]'  }t        j8                  | j:                  |      | _        ) t        j                  | j                  || j:                        }n|t        j<                  k(  rX|D ]'  }t        j8                  | j>                  |      | _        ) t        j                  | j                  || j>                        }n|t        j@                  k(  rx|D ]G  }	t+        |	t,              r|	j/                         }	t        j8                  | jB                  |	      | _!        I t        j                  | j                  || jB                        }n!t        j                  | j                  ||      }| jE                  |d	||       |t        jF                  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``.
        long*zchar*zvoid*int64_t*)r   '  i N  i0u  i@  r   TzOption unsupported: r   )%getr   ry   r   	WRITEDATA
new_handleru   r   r   rm   WRITEFUNCTIONrR   
HEADERDATArv   HEADERFUNCTIONr^   r   rL   rw   rA   	DEBUGDATA
isinstancer   encode
POSTFIELDSrx   NotImplementedError
HTTPHEADERcurl_slist_appendro   PROXYHEADERrp   RESOLVErq   r   CAINFOrt   )
r+   optionvalueinput_option
value_typec_value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"(25#(>ellnEG+++$+!%(<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                z   ddddddd}t         j                  t        t        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**r   zdouble*zstruct curl_slist **r   )         0   @   P   ` )r   r   r   r   r   i   getinfor   r   r"   )r   ra   r   floatry   r   curl_easy_getinform   r   rf   rn   )r+   r   
ret_optionret_cast_optionr   r   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   ra   r   curl_versionr   s    r#   versionzCurl.version$  s    zz#**,--r"   c                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_impersonaterm   r   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)rt   r   r   r   rs   r   PROXY_CAINFOr   s     r#   _ensure_cacertzCurl._ensure_cacert6  sc      ++gnndll;Cc<0++g22DLLACc#56	 !r"   c                    | 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_performrm   r   clean_after_perform)r+   clear_headersr   s      r#   r   zCurl.perform=  sZ     	 ##DJJ/	4c9- $$]3D$$]3s   A A(c                @    t        j                  | j                        S r'   )r   curl_easy_upkeeprm   r   s    r#   upkeepzCurl.upkeepR  s    ##DJJ//r"   c                   d| _         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)zYClean up handles and buffers after ``perform``, called at the end of
        ``perform``.N)
ru   rv   rw   rx   ro   r   rn   r   rc   rp   )r+   r   s     r#   r   zCurl.clean_after_performU  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.)r}   r~   r   )r   curl_easy_duphandlerm   rh   rs   r{   )r+   r   cs      r#   	duphandlezCurl.duphandlee  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)rt   rm   r   curl_easy_resetr|   r   rn   rq   r   s    r#   resetz
Curl.resetn  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   lower
startswithloadrK   )r+   headerscookier   s       r#   parse_cookie_headerszCurl.parse_cookie_headersv  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                   r&t        j                  | j                          d| _         t        j                  | j
                         t        j                  | _        y)zAClose and cleanup curl handle, wrapper for ``curl_easy_cleanup``.N)rm   r   curl_easy_cleanupr   releaserz   rn   rq   r   s    r#   r   z
Curl.close  s?    ::!!$**-DJD&&'r"   c                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.
        rj   size_t *zstruct curl_ws_frame **WS_RECVr   N)r   ry   r   curl_ws_recvrm   r   r9   )r+   nr9   n_recvp_framer   frames          r#   ws_recvzCurl.ws_recv  s     1%$''34tzz61fgF#y) 
zz&!+F1I.55r"   c                    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   ry   from_bufferr   curl_ws_sendrm   r   r   )r+   payloadr   n_sentr9   r   s         r#   ws_sendzCurl.ws_send  s\     $)tzz63v;5Q#y)ayr"   c                R    | j                  t        j                  d|      |z         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pack)r+   r*   messages      r#   ws_closezCurl.ws_close  s#     ||FKKd3g=>>r"   )rD   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   )r   r  r  r  )r  r   )r  rh   )r   list[bytes]r  r   )r   r  r  r  )r   r  r  z"tuple[CurlHttpVersion, int, bytes])i   )r   r   r  ztuple[bytes, CurlWsFrame])r	  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   staticmethodr   r   r   r  r   BINARYr  r  r!   r"   r#   rh   rh   n   s    !,1

	Wr!>F.
74*0+ ! ( ( 1 1,!60 ;E:K:K &?r"   rh   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)rh   rm   r   curl_mime_init_form)r+   r:   s     r#   r)   zCurlMime.__init__  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_addpartr  curl_mime_namer   r%   curl_mime_typecurl_mime_filenamer   r   r   r  rK   existsFileNotFoundErrorcurl_mime_filedatacurl_mime_datar   )	r+   namer  r  r   r<   partr   local_path_strs	            r#   addpartzCurlMime.addpart  s   ( $$TZZ0  t{{}5!8/00 #$$T<+>+>+@ACax 344 ((x/@ACax 344$OPP !*d+!$ZJ.!+!2!2!4!+'..0'*<^<L(MNN((~/D/D/FGCax 344dE*4y'')$$T4T;C r"   c                F     |        }|D ]  } |j                   di |  |S )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``r!   )r-  )clsfilesformfiles       r#   	from_listzCurlMime.from_list0  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)rm   r   r   MIMEPOSTr  )r+   r:   r   s      r#   attachzCurlMime.attach8  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   rn   r   s    r#   r   zCurlMime.close=  s!     	4::&XX
r"   c                $    | j                          y r'   r   r   s    r#   r   zCurlMime.__del__C  r   r"   r'   )r:   Optional[Curl])r*  r   r  Optional[str]r  r;  r   z!Optional[Union[str, bytes, Path]]r<   zOptional[bytes]r  r  )r0  z
list[dict])r:   r:  r  r  r  )r   r   r   r0   r)   r-  classmethodr3  r6  r   r   r!   r"   r#   r  r    s{    -: '+"&8< $;<;< $	;<
  ;< 6;< ;< 
;<z  /
r"   r  )r;   r   r=   r   r  r   )r;   r   r@   r  r  r  )r  r  )6
__future__r   rer  r[   http.cookiesr   pathlibr   typingr   r   r   r	   r
   r   certifi_wrapperr   r   constr   r   r   r   r   utilsr   whererr   compiler   r   r   	Exceptionr%   CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTrI   rJ   rF   rG   rY   rZ   
def_externrA   rL   rR   rU   r^   rf   rh   r  r!   r"   r#   <module>rM     s+   " 	   %  E E   L L "2::;< => 7	 7       ! !   %    w? w?t\ \r"   