
    )Jf$.                        d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	 ddl
mZmZ ddlmZmZmZ e j                            e j                            e          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e"de"fd            Z# ej!                    d             Z$ ej!                    d             Z%dee&         fdZ' G d d          Z(dS )    N)SimpleCookie)AnyListTupleUnion   )ffilib)CurlHttpVersionCurlInfoCurlOptz
cacert.pemc                   *     e Zd ZdZddef fdZ xZS )	CurlErrorz$Base exception for curl_cffi packager   codec                 P     t                      j        |g|R i | || _        d S N)super__init__r   )selfmsgr   argskwargs	__class__s        Q/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/curl_cffi/curl.pyr   zCurlError.__init__   s5    .t...v...			    )r   )__name__
__module____qualname____doc__intr   __classcell__)r   s   @r   r   r      sO        .. #          r   r                  i  l    typereturnc                 ,   t          j        ||          d d          }|t          t          fv rt	          d|           nU|t
          t          fv r"t	          |                                           n#t	          |                                d           dS )NzSSL OUT )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_functionr8   !   s    :dD!!!!!$D$&;<<<i	"$56	6	6dkkmmdkkmm$$$$1r   c                     t          j        |          }|                    t          j        | |          d d                     ||z  S r   )r	   from_handlewriter,   )ptrr5   nmembuserdatar,   s        r   buffer_callbackr?   -   sD     _X&&F
LLC''*+++4<r   c                     t          j        |          } |t          j        | |          d d                    }|t          k    s|t          k    r|S ||z  S r   )r	   r:   r,   CURL_WRITEFUNC_PAUSECURL_WRITEFUNC_ERROR)r<   r5   r=   r>   callbackwrotes         r   write_callbackrE   5   s]     x((HHSZU++AAA.//E$$$1E(E(E4<r   c                     g }| }|r5|                     t          j        |j                             |j        }|5t          j        |            |S r   )appendr	   stringr4   nextr
   curl_slist_free_all)headresultr<   s      r   slist_to_listrM   @   s[    F
C
 cj**+++h   D!!!Mr   c                   N   e Zd ZdZeddfdedefdZd Zd Z	d	e
d
efdZd	e
d
efdZ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 Zd#defdZd#defdZd Z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" Z$dS )$Curlz9
    Wrapper for `curl_easy_*` functions of libcurl.
    FNcacertdebugc                 2   |st          j                    n|| _        t          j        | _        t          j        | _        || _        d| _        d| _	        d| _
        d| _        t          j        dd          | _        || _        |                                  dS )z
        Parameters:
            cacert: CA cert path to use, by default, curl_cffi uses its own bundled cert.
            debug: whether to show curl debug messages.
        FNzchar[]   )r
   curl_easy_init_curlr	   NULL_headers_resolve_cacert_is_cert_set_write_handle_header_handle_body_handlenew_error_buffer_debug_set_error_buffer)r   rP   rQ   handles       r   r   zCurl.__init__O   s     28CS')))V
!!"  WXs33     r   c                 >   t          j        | j        t          j        | j                  }|dk    rt          j        d           | j        rQ| 	                    t          j
        d           t          j        | j        t          j        t           j                   d S d S )Nr   zFailed to set error bufferr   )r
   _curl_easy_setoptrU   r   ERRORBUFFERr_   warningswarnr`   setoptVERBOSEDEBUGFUNCTIONr8   r   rets     r   ra   zCurl._set_error_bufferb   s    #DJ0CTEWXX!88M6777; 	YKK+++!$*g.CSEWXXXXX	Y 	Yr   c                 .    |                                   d S r   )closer   s    r   __del__zCurl.__del__j   s    

r   errcodeactionc                 :    |                      ||          }||d S r   )
_get_error)r   rq   rr   errors       r   _check_errorzCurl._check_errorm   s(    00K r   c           	          |dk    rFt          j        | j                                                  }t	          d| d| d| d|          S d S )Nr   z
Failed to z, ErrCode: z, Reason: 'zi'. This may be a libcurl error, See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r   )r	   rH   r_   r2   r   )r   rq   rr   errmsgs       r   rt   zCurl._get_errorr   s    a<<Z 233::<<F\V \ \ \ \F \ \ \ 	    <r   optionvaluec                    ddddd}|                     t          |dz            dz            }|dk    rt          j        d|          }n|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    rWt          j        |          }|| _        t          j	        | j
        t          j        t          j                   t          j        }n|t          j        k    rWt          j        |          }|| _        t          j	        | j
        t          j        t          j                   t          j        }n\|dk    rDt#          |t$                    r|                                }n|}|t          j        k    r|| _        nt-          d|z            |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|d|d	           |t          j        k    rd
| _        |S )zWrapper for curl_easy_setopt.

        Parameters:
            option: option to set, use the constants from CurlOpt enum
            value: value to set, strings will be handled automatically
        zint*zchar*zvoid*)r   '  i N  i0u  r|   zOption unsupported: %szsetopt(z, )T)getr    r	   r^   r   	WRITEDATA
new_handler[   r
   rd   rU   WRITEFUNCTIONr?   
HEADERDATAr\   HEADERFUNCTIONrE   
isinstancestrencode
POSTFIELDSr]   NotImplementedError
HTTPHEADERcurl_slist_appendrW   RESOLVErX   rv   CAINFOrZ   )	r   ry   rz   input_option
value_typec_valueheaderrl   resolves	            r   rh   zCurl.setopt|   s    
 
 "%%c&5.&9&9E&ABB
gfe,,GG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.CSEWXXX'FF7""%%%  ,,..+++$+!%&>&GHHHW''' M M # 5dmV L L'
FDMJJCCw&&  N Ngs++ /%nn..G # 5dmW M M'
FDMJJCC'
FGDDC##666555ABBBW^## $D
r   r(   c                    ddddd}t           j        t          t          d}t          j        ||dz                     }t          j        | j        ||          }|                     |d|z  	           |dz  d
k    rt          |d                   S |d         t           j
        k    rdS  ||dz           |d                   S )zWrapper for curl_easy_getinfo. Gets information in response after curl perform.

        Parameters:
            option: option to get info of, use the constants from CurlInfo enum
        zchar**zlong*zdouble*zstruct curl_slist **)         0   @ )r   r   r   i   zgetinfo(%s)rr   r   r   r   )r	   rH   r    floatr^   r
   curl_easy_getinforU   rv   rM   rV   )r   ry   
ret_optionret_cast_optionr   rl   s         r   getinfozCurl.getinfo   s     ,	
 

 j
 

 '*Vh%6788#DJ@@#mf&<===H(( ,,,1:!!31v01'!*===r   c                 L    t          j        t          j                              S )z#Get the underlying libcurl version.)r	   rH   r
   curl_versionro   s    r   versionzCurl.version   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.
        )r
   curl_easy_impersonaterU   r   r    )r   r   r   s      r   impersonatezCurl.impersonate   s2     (J_)=)=
 
 	
r   c                     | j         s>|                     t          j        | j                  }|                     |d           d S d S )Nz
set cacertr   )rZ   rh   r   r   rY   rv   rk   s     r   _ensure_cacertzCurl._ensure_cacert   sM      	8++gndl;;Cc,77777	8 	8r   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
        performr   N)r   r
   curl_easy_performrU   rv   clean_after_perform)r   r   rl   s      r   r   zCurl.perform   s~     	 #DJ//	4c)444 $$]33333D$$]3333s   A A4c                     d| _         d| _        d| _        |rA| j        t          j        k    rt          j        | j                   t          j        | _        dS dS )zKClean up handles and buffers after perform, called at the end of `perform`.N)r[   r\   r]   rW   r	   rV   r
   rJ   )r   r   s     r   r   zCurl.clean_after_perform  s[    !"  	%}(('666HDMMM	% 	%r   c                 p    t          j        | j                  }t          | j        | j        |          }|S )zThis is not a full copy of entire curl object in python. For example, headers
        handle is not copied, you have to set them again.)rP   rQ   rb   )r
   curl_easy_duphandlerU   rO   rY   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 )z4Reset all curl options, wrapper for curl_easy_reset.FN)rZ   rU   r
   curl_easy_resetra   r	   rV   rX   ro   s    r   resetz
Curl.reset  sD    !:!
+++""$$$r   headersc                     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loadr2   )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                 ^    t          j        d|           }|r|                    d          ndS )HExtract reason phrase, like `OK`, `Not Found` from response status line.s   HTTP/\d\.\d [0-9]{3} (.*)r   r   )rematchgroup)r   ms     r   get_reason_phrasezCurl.get_reason_phrase.  s/     H2K@@'qwwqzzzC'r   c                    t          j        d|           }|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 )
r   s   HTTP/(\d\.\d) ([0-9]{3}) (.*)r   r   r   z2.0z1.1z1.0r"   r#   )	r   r   r   V1_0r   V2_0V1_1NONEr    )r   r   http_versionstatus_codereasons        r   parse_status_linezCurl.parse_status_line4  s     H6DD 	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 )z<Close and cleanup curl handle, wrapper for curl_easy_cleanupN)rU   r
   curl_easy_cleanupr	   releaser_   rV   rX   ro   s    r   rn   z
Curl.closeG  sF    : 	!$*---DJD&'''r   )T)%r   r   r   r   DEFAULT_CACERTr   boolr   ra   rp   r    rv   rt   r   r   rh   r   r   bytesr   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   rn    r   r   rO   rO   J   s`         &45SW ! !s !D ! ! ! !&Y Y Y  C     
# s    GW GS G G G GR>h >5UD1H+I > > > >6. . . . .	
 	
# 	
 	
 	
 	
 	
 	
8 8 8
4 4T 4 4 4 4$% % % % % %  ! ! !DK L     (u ( ( ( ( \(
 1u 1U7R1S 1 1 1 \1$! ! ! ! !r   rO   ))osr   rf   http.cookiesr   typingr   r   r   r   _wrapperr	   r
   constr   r   r   pathjoindirname__file__r   	Exceptionr   CURLINFO_TEXTCURLINFO_HEADER_INCURLINFO_HEADER_OUTr0   r1   r-   r.   rA   rB   
def_externr    r8   r?   rE   r   rM   rO   r   r   r   <module>r      s   				 				  % % % % % % * * * * * * * * * * * *         5 5 5 5 5 5 5 5 5 5bgooh77FF    	          ! !  s C          4;    C! C! C! C! C! C! C! C! C! C!r   