
    hR                    L   d dl m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            Z/d0d1d"Z0d2d%Z1 ej.                    d&             Z2d' Z3 ej.                    d(             Z4d3d*Z5 G d+ d,          Z6 G d- d.          Z7dS )4    )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                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )CurlWsFrameintageflagsoffset	bytesleftlenN)__name__
__module____qualname____annotations__     L/var/www/html/marketdash/venv/lib/python3.11/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 packager   codeUnion[CurlECode, Literal[0]]c                P     t                      j        |g|R i | || _        d S N)super__init__r&   )selfmsgr&   argskwargs	__class__s        r#   r+   zCurlError.__init__"   s5    .t...v...26			r"   )r   )r&   r'   )r   r   r   __doc__r+   __classcell__)r0   s   @r#   r%   r%      sH        ..7 7 7 7 7 7 7 7 7 7 7r"   r%                  i  l    type_r   sizereturnc                    t          j        |          }t          j        ||          dd         } |||           dS )z ffi callback for curl debug infoNr   )r   from_handlebuffer)curlr8   datar9   clientpcallbacktexts          r#   debug_functionrC   3   sD     w''H:dD!!!!!$DHUD1r"   Fbbytes	uppercaseboolstrc                R    |rdndd                     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  B   K   | ]}                     |          V  d S r)   )format).0bytefmts     r#   	<genexpr>zbytes_to_hex.<locals>.<genexpr>B   s/      33CJJt$$333333r"   )join)rD   rF   rO   s     @r#   bytes_to_hexrR   <   s:    
  
-((XC883333333333r"   r?   Nonec                X   t           dt          dt          dt          dt          dt
          dt          di}d}|                    | d          }| t
          t          fv rgt          |d |                   }t          |          |k    rd	nd
}t          j                            | dt          |           d| | d           d S 	 |                    d          }t          j                            | d|            | t           t          t          fvr!t          j                            d           d S d S # t          $ ri t          |d |                   }t          |          |k    rd	nd
}t          j                            | dt          |           d| | d           Y d S w xY w)N*<>z< DATAz> DATAz< SSLz> SSL(    z...z [z	 bytes]: 
zutf-8rJ   )CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTCURLINFO_DATA_INCURLINFO_DATA_OUTCURLINFO_SSL_DATA_INCURLINFO_SSL_DATA_OUTgetrR   r   sysstderrwritedecodeUnicodeDecodeError)r8   r?   PREFIXESMAX_SHOW_BYTESprefixhex_strpostfixrB   s           r#   debug_function_defaultrm   E   s   sCS(8gwH N\\%%%F %'<===tO^O455D		^33""
FNNc$iiNN'N7NNNOOOOO		T;;w''DJ////000],>@STTT
  &&&&& UT! 	T 	T 	T"4#899GII77bbUGJRR#d))RRgRwRRRSSSSSS		Ts   A.D6 6A/F)(F)c                    t          j        |          }|                    t          j        | |          dd                    ||z  S )zAffi callback for curl write function, directly writes to a bufferN)r   r<   re   r=   )ptrr9   nmembuserdatar=   s        r#   buffer_callbackrr   d   sD     _X&&F
LLC''*+++4<r"   c                (    | sdS t          |           S )Nr   )r   )ss    r#   
ensure_intru   m   s     qq66Mr"   c                   t          j        |          } |t          j        | |          dd                   }t          |          }|t          k    s|t
          k    r|S |||z  k    rt          j        dt          d           ||z  S )zHffi callback for curl write function, calls the callback python functionNzWrote bytes != received bytes.r3   
stacklevel)	r   r<   r=   ru   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERRORwarningswarnr   )ro   r9   rp   rq   rA   wrotes         r#   write_callbackr~   s   s     x((HHSZU++AAA.//EuE$$$1E(E(E6TUVVVV4<r"   list[bytes]c                    g }| }|r5|                     t          j        |j                             |j        }|5t          j        |            |S )z%Converts curl slist to a python list.)appendr   stringr?   nextr   curl_slist_free_all)headresultro   s      r#   slist_to_listr      s[    F
C
 cj**+++h   D!!!Mr"   c                     e Zd ZdZd?d@dZdAdZdAdZdAdZdBdZdCdZ	dDdZ
dEdZdFdZdGdHd!ZdAd"ZdGdId$ZdJd%ZdGdId&ZdKd'ZdAd(ZdLd,ZedMd.            ZedNd0            ZdAd1ZdOdPd5Zej        fdQd9ZdRdSd>ZdS )TCurlz;
    Wrapper for ``curl_easy_*`` functions of libcurl.
    rY   FNcacertrH   debugrG   r:   rS   c                p   |r|nt          j                    | _        t          j        | _        t          j        | _        t          j        | _        |pt          | _	        d| _
        d| _        d| _        d| _        d| _        t          j        dd          | _        || _        |                                  dS )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,   r   r   handles       r#   r+   zCurl.__init__   s      &?VV3+=+?+?
!h/!"&#'"&!% WXs33     r"   c                    t          j        | j        t          j        | j                  }|dk    rt          j        dt          d           | j	        r| 
                                 d S d S )Nr   zFailed to set error bufferr3   rw   )r   _curl_easy_setoptr   r   ERRORBUFFERr   r{   r|   r   r   r   r,   rets     r#   r   zCurl._set_error_buffer   se    #DJ0CTEWXX!88M6TUVVVV; 	JJLLLLL	 	r"   c                    |                      t          j        d           |                      t          j        d           dS )zSet debug to Truer   TN)setoptr   VERBOSEDEBUGFUNCTIONr,   s    r#   r   z
Curl.debug   s5    GOQ'''G)400000r"   c                .    |                                   d S r)   closer   s    r#   __del__zCurl.__del__       

r"   errcoder   r.   r   c                *     | j         |g|R  }||d S r)   )
_get_error)r,   r   r.   errors       r#   _check_errorzCurl._check_error   s.    /$///K r"   c           	        |dk    rzt          j        | j                                      d          }d                    d |D                       }t          d| d| d| d	t          t          |          
          S d S )Nr   backslashreplace)errorsrJ   c                ,    g | ]}t          |          S r!   )rH   )rM   as     r#   
<listcomp>z#Curl._get_error.<locals>.<listcomp>   s    444!s1vv444r"   z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r&   )r   r   r   rf   rQ   r%   r   r   )r,   r   r.   errmsgactions        r#   r   zCurl._get_error   s    a<<Z 233::BT:UUFXX44t44455FV  g      )W--	    <r"   optionr   valuec                   dddddd}|                     |dz  dz            }|dk    s|dk    rt          j        ||          }nT|t          j        k    rLt          j        |          }|| _        t          j        | j	        t          j
        t          j                   n|t          j        k    rLt          j        |          }|| _        t          j        | j	        t          j        t          j                   n|t          j
        k    rXt          j        |          }|| _        t          j        | j	        t          j
        t          j                   t          j        }n4|t          j        k    rWt          j        |          }|| _        t          j        | j	        t          j        t          j                   t          j        }n|t          j        k    rb|du rt"          }t          j        |          }|| _        t          j        | j	        t          j        t          j                   t          j        }n[|dk    rCt+          |t,                    r|                                n|}|t          j        k    r|| _        nt5          d|           |t          j        k    rE|D ]!}t          j        | j        |          | _        "t          j        | j	        || j                  }n|t          j        k    rE|D ]!}t          j        | j        |          | _        "t          j        | j	        || j                  }n|t          j         k    rn|D ]J}	t+          |	t,                    r|	                                }	t          j        | j!        |	          | _!        Kt          j        | j	        || j!                  }nt          j        | j	        ||          }| "                    |d	||           |t          j#        k    rd| _$        |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``.
        long*zchar*zvoid*int64_t*)r   '  i N  i0u  i@  r   TzOption unsupported: r   )%rb   r   r   r   	WRITEDATA
new_handler   r   r   r   WRITEFUNCTIONrr   
HEADERDATAr   HEADERFUNCTIONr~   r   rm   r   rC   	DEBUGDATA
isinstancerH   encode
POSTFIELDSr   NotImplementedError
HTTPHEADERcurl_slist_appendr   PROXYHEADERr   RESOLVEr   r   CAINFOr   )
r,   r   r   input_option
value_typec_valueheaderr   proxy_headerresolves
             r#   r   zCurl.setopt   s    
 
 "%%v%&?@@
  J*$<$<gj%00GGw(((nU++G!(D!
G133F    w)))nU++G")D!
G2C4G    w,,,nU++G!(D!$*g.CSEWXXX&FFw---nU++G")D!
G2C4F   'FFw,,,}}.nU++G!(D!$*g.CSEWXXX&FF7""(25#(>(>IellnnnEG+++$+!%&EV&E&EFFFW''' M M # 5dmV L L'
FDMJJCCw*** %  &)&;'' '## '
FD<OPPCCw&&  N Ngs++ /%nn..G # 5dmW M M'
FDMJJCC'
FGDDC#x777W^## $D
r"   r   Union[bytes, int, float, list]c                   ddddddd}t           j        t          t          t          t          d}t          j        ||dz                     }t          j        | j        ||          }|                     |d	|           |dz  d
k    rt          |d                   S |d         t           j
        k    rdS  ||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   r   r   floatr   r   curl_easy_getinfor   r   r   r   )r,   r   
ret_optionret_cast_optionr   r   s         r#   r   zCurl.getinfo!  s     , 
 

 j
 
 '*Vh%6788#DJ@@#y&111H(( ,,,1:!!31v01'!*===r"   rE   c                L    t          j        t          j                              S )z#Get the underlying libcurl version.)r   r   r   curl_versionr   s    r#   versionzCurl.versionD  s    z#*,,---r"   Ttargetdefault_headersc                v    t          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.impersonateH  s2     (J_)=)=
 
 	
r"   c                   | j         sx|                     t          j        | j                  }|                     |d           |                     t          j        | j                  }|                     |d           d S d S )Nz
set cacertzset proxy cacert)r   r   r   r   r   r   PROXY_CAINFOr   s     r#   _ensure_cacertzCurl._ensure_cacertV  sy      	7++gndl;;Cc<000++g2DLAACc#566666		7 	7r"   clear_headersc                    |                                   t          j        | j                  }	 |                     |d           |                     |           dS # |                     |           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   r   s      r#   r   zCurl.perform]  s{     	 #DJ//	4c9--- $$]33333D$$]3333s   A A3c                4    t          j        | j                  S r)   )r   curl_easy_upkeepr   r   s    r#   upkeepzCurl.upkeepr  s    #DJ///r"   c                B   d| _         d| _        d| _        d| _        |r| j        t
          j        k    rt          j        | j                   t
          j        | _        | j	        t
          j        k    rt          j        | j	                   t
          j        | _	        dS dS )zYClean up handles and buffers after ``perform``, called at the end of
        ``perform``.N)
r   r   r   r   r   r   r   r   r   r   )r,   r   s     r#   r   zCurl.clean_after_performu  s     ""!  	+}(('666HDM"ch..'(;<<<"%(D	+ 	+r"   c                p    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_duphandler   r   r   r   )r,   r   cs      r#   	duphandlezCurl.duphandle  s3    
 ,TZ88
DK
KKKr"   c                    d| _         | j        -t          j        | j                   |                                  t
          j        | _        dS )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  sD    !:!
+++""$$$r"   headersr   r   c                    t                      }|D ]X}|                                                    d          r/|                    |dd                                                    Y|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loadrf   )r,   r   cookier   s       r#   parse_cookie_headerszCurl.parse_cookie_headers  sf      ,~~ 	2 	2F||~~((99 2F233K..00111r"   status_linec                h    t                               |           }|r|                    d          ndS )zTExtract 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_phrase  s0     "";//'qwwqzzzC'r"   "tuple[CurlHttpVersion, int, bytes]c                   t                               |           }|st          j        ddfS |                    d          dk    rt          j        }nX|                    d          dk    rt          j        }n2|                    d          dk    rt          j        }nt          j        }t          |                    d                    }|                    d          }|||fS )	zfParse status line.

        Returns:
            http_version, status_code, and reason phrase
        r   r"   r   z2.0z1.1z1.0r3   r4   )	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       -- 	0"'C//771::*/LLWWQZZ5  */LLWWQZZ5  */LL*/L!''!**oo[&00r"   c                    | j         r t          j        | j                    d| _         t          j        | j                   t          j        | _        dS )zAClose and cleanup curl handle, wrapper for ``curl_easy_cleanup``.N)r   r   curl_easy_cleanupr   releaser   r   r   r   s    r#   r   z
Curl.close  sF    : 	!$*---DJD&'''r"      ntuple[bytes, CurlWsFrame]c                :   t          j        d|          }t          j        d          }t          j        d          }t          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   size_t *zstruct curl_ws_frame **WS_RECVr   N)r   r   r   curl_ws_recvr   r   r=   )r,   r  r=   n_recvp_framer   frames          r#   ws_recvzCurl.ws_recv  s     1%%$$'344tz61fgFF#y))) 
z&!!+F1I+.55r"   payloadr   r   c                    t          j        d          }t          j        |          }t          j        | j        |t          |          |d|          }|                     |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   r   from_bufferr   curl_ws_sendr   r   r   )r,   r(  r   n_sentr=   r   s         r#   ws_sendzCurl.ws_send  sd     $$))tz63w<<ERR#y)))ayr"     r"   r&   messagec                X    |                      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&   r0  s      r#   ws_closezCurl.ws_close  s'     ||FKd33g=>>>r"   )rY   FN)r   rH   r   rG   r:   rS   r:   rS   )r   r   r.   r   r:   rS   )r   r   r.   r   )r   r   r   r   r:   r   )r   r   r:   r   )r:   rE   )T)r   rH   r   rG   r:   r   )r   rG   r:   rS   )r:   r   )r:   r   )r   r   r:   r   )r  rE   r:   rE   )r  rE   r:   r  )r  )r  r   r:   r  )r(  rE   r   r   r:   r   )r/  r"   )r&   r   r0  rE   r:   r   )r   r   r   r1   r+   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  staticmethodr  r  r   r'  r   BINARYr.  r4  r!   r"   r#   r   r      s4        ! ! ! ! !,   1 1 1 1
      
	 	 	 	W W W Wr!> !> !> !>F. . . .
 
 
 
 
7 7 7 74 4 4 4 4*0 0 0 0+ + + + +    ! ! ! !    ( ( ( \( 1 1 1 \1,! ! ! !6 6 6 6 60 ;E:K     &? ? ? ? ? ? ?r"   r   c                  b    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
dS )CurlMimez#Wrapper for the ``curl_mime_`` API.Nr>   Optional[Curl]c                z    |r|nt                      | _        t          j        | j        j                  | _        dS )z?
        Args:
            curl: Curl instance to use.
        N)r   r   r   curl_mime_init_form)r,   r>   s     r#   r+   zCurlMime.__init__  s3    
 "-TTtvv
'
(899


r"   )content_typefilename
local_pathr?   namerH   r>  Optional[str]r?  r@  !Optional[Union[str, bytes, Path]]r?   Optional[bytes]r:   rS   c                  t          j        | j                  }t          j        ||                                          }|dk    rt          d          |<t          j        ||                                          }|dk    rt          d          |<t          j        ||                                          }|dk    rt          d          |r|rt          d          |t          |t                    rt          |          }n,t          |t                    r|                                }n|}t          |                                          st          d|           t          j        ||                                          }|dk    rt          d          |[t          |t                    s!t          |                                          }t          j        ||t#          |                    }dS dS )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   rH   rE   rf   existsFileNotFoundErrorcurl_mime_filedatacurl_mime_datar   )	r,   rA  r>  r?  r@  r?   partr   local_path_strs	            r#   addpartzCurlMime.addpart  s   ( $TZ00 t{{}}55!88/000 #$T<+>+>+@+@AACaxx 3444 (x/@/@AACaxx 3444 	Q$ 	QOPPP !*d++ ,!$ZJ.. ,!+!2!2!4!4!+''..00 O'(M^(M(MNNN(~/D/D/F/FGGCaxx 3444dE** *4yy''))$T4T;;CCC r"   files
list[dict]c                >     |             }|D ]} |j         di | |S )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``r!   )rP  )clsrQ  formfiles       r#   	from_listzCurlMime.from_listP  s>     suu 	! 	!DDL  4    r"   c                f    |r|n| j         }|                    t          j        | j                   dS )z,Attach the mime instance to a curl instance.N)r   r   r   MIMEPOSTr=  )r,   r>   r   s      r#   attachzCurlMime.attachX  s1    (DDdj	!4:.....r"   c                Z    t          j        | j                   t          j        | _        dS )zrClose the mime instance and underlying files. This method must be called
        after ``perform`` or ``request``.N)r   curl_mime_freer=  r   r   r   s    r#   r   zCurlMime.close]  s$     	4:&&&X


r"   c                .    |                                   d S r)   r   r   s    r#   r   zCurlMime.__del__c  r   r"   r)   )r>   r:  )rA  rH   r>  rB  r?  rB  r@  rC  r?   rD  r:   rS   )rQ  rR  )r>   r:  r:   rS   r5  )r   r   r   r1   r+   rP  classmethodrW  rZ  r   r   r!   r"   r#   r9  r9    s        --: : : : : '+"&8< $;< ;< ;< ;< ;< ;<z    [/ / / / /
        r"   r9  )r8   r   r9   r   r:   r   )F)rD   rE   rF   rG   r:   rH   )r8   r   r?   rE   r:   rS   )r:   r   )8
__future__r   rer2  rc   r{   http.cookiesr   pathlibr   typingr   r   r   r	   r
   r   certifi_wrapperr   r   constr   r   r   r   r   utilsr   wherer   compiler
  r  r   	Exceptionr%   r[   r\   r]   r^   r_   r`   ra   ry   rz   
def_externrC   rR   rm   rr   ru   r~   r   r   r9  r!   r"   r#   <module>rl     s   " " " " " " 				  



  % % % % % %       E E E E E E E E E E E E E E E E          L L L L L L L L L L L L L L " " " " " "2:;<< =>>        7 7 7 7 7	 7 7 7       ! !     4 4 4 4 4T T T T>           w? w? w? w? w? w? w? w?t\ \ \ \ \ \ \ \ \ \r"   