o
    Z�¿jûx  ã                   @  sF  d dl mZ d dlZd dl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 d dl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 dGdd„Zeƒ Ze  d¡Z!e  d¡Z"eruG dd„ dƒZ#G dd„ de$ƒZ%d Z&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1dZ2dZ3dZ4d Z5dZ6d Z7e4e6B Z8e5e7B Z9G dd„ dƒZ:dHd d!„Z;ej<e;d ƒd"�dId%d&„ƒZ=dJdKd,d-„Z>dLd0d1„Z?ej<e;e.ƒd"�d2d3„ ƒZ@d4d5„ ZAej<e;e.ƒd"�d6d7„ ƒZBej<e;e/ƒd"�d8d9„ ƒZCej<e;e/ƒd"�d:d;„ ƒZDej<e;e2ƒd"�dMd>d?„ƒZEdNdAdB„ZFG dCdD„ dDƒZGG dEdF„ dFƒZHdS )Oé    )ÚannotationsN)ÚSimpleCookie)ÚPath)ÚTYPE_CHECKINGÚAnyÚLiteralÚcasté   )ÚffiÚlib)Ú	CurlECodeÚCurlHttpVersionÚCurlInfoÚCurlOptÚ
CurlWsFlag)ÚCurlCffiWarningÚreturnÚstrc                  C  sX   dD ]} t j | ¡}|rt j |¡r|  S qt ¡ }|jr(t j |j¡r(|jS t 	¡ S )N)ÚSSL_CERT_FILEÚCURL_CA_BUNDLEÚREQUESTS_CA_BUNDLE)
ÚosÚenvironÚgetÚpathÚexistsÚsslÚget_default_verify_pathsÚcafileÚcertifiÚwhere)Úenv_varr   Údefaults© r#   úI/home/dinkstrade/pdmp/venv/lib/python3.10/site-packages/curl_cffi/curl.pyÚ_default_cacert   s   €r%   s   HTTP/\d\.\d [0-9]{3} (.*)s   HTTP/(\d\.\d) ([0-9]{3}) (.*)c                   @  s6   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__r#   r#   r#   r$   r&   ,   s   
 r&   c                      s&   e Zd ZdZ	dd‡ fd	d
„Z‡  ZS )Ú	CurlErrorz$Base exception for curl_cffi packager   Úmsgr   Úcodeúint | CurlECode | Literal[0]r   ÚNonec                   s$   t ƒ j|g|¢R i |¤Ž || _d S ©N)ÚsuperÚ__init__r3   )Úselfr2   r3   ÚargsÚkwargs©Ú	__class__r#   r$   r8   7   s   
zCurlError.__init__)r   )r2   r   r3   r4   r   r5   )r-   r.   r/   Ú__doc__r8   Ú__classcell__r#   r#   r<   r$   r1   4   s    ÿr1   é   é   é   é   é   i  l   ÿÿ i   c                   @  s   e Zd Zddd„ZdS )	Ú_CallbackContextÚcallbackr   r   r5   c                 C  s   || _ d | _d S r6   )rF   Ú	exception)r9   rF   r#   r#   r$   r8   Y   s   
z_CallbackContext.__init__N)rF   r   r   r5   )r-   r.   r/   r8   r#   r#   r#   r$   rE   X   s    rE   Úreturn_valuer'   c                   s   ‡ fdd„}|S )Nc                   s>   |d ur|j j}| d| d¡¡}|d urt |¡}||_ˆ S )NÚuserdataÚclientp)Útb_frameÚf_localsr   r
   Úfrom_handlerG   )Úexc_typeÚ	exc_valueÚ	tracebackÚcallback_argsrI   Úcontext©rH   r#   r$   Úonerror_   s   
z&_store_callback_error.<locals>.onerrorr#   )rH   rT   r#   rS   r$   Ú_store_callback_error^   s   rU   )rT   Útype_Úsizec                 C  s@   t  |¡}|jdurdS |j}t  ||¡dd… }|||ƒ dS )z ffi callback for curl debug infoNr   )r
   rM   rG   rF   Úbuffer)ÚcurlrV   ÚdatarW   rJ   rR   rF   Útextr#   r#   r$   Údebug_functionn   s   


r\   FÚbÚbytesÚ	uppercaseÚboolc                   s$   |rdnd‰ d  ‡ fd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  s   � | ]}ˆ   |¡V  qd S r6   )Úformat)Ú.0Úbyte©Úfmtr#   r$   Ú	<genexpr>€   s   € zbytes_to_hex.<locals>.<genexpr>)Újoin)r]   r_   r#   re   r$   Úbytes_to_hexz   s   ri   rZ   r5   c                 C  s0  t dtdtdtdtdtdtdi}d}| | d¡}| ttfv rEt|d |… ƒ}t	|ƒ|kr.d	nd
}t
j |› dt	|ƒ› d|› |› d�¡ d S z#| d¡}t
j |› d|› �¡ | t ttfvrft
j d¡ W d S W d S  ty—   t|d |… ƒ}t	|ƒ|krd	nd
}t
j |› dt	|ƒ› d|› |› d�¡ Y d S w )NÚ*ú<ú>z< DATAz> DATAz< SSLz> SSLé(   Ú z...z [z	 bytes]: Ú
zutf-8ra   )ÚCURLINFO_TEXTÚCURLINFO_HEADER_INÚCURLINFO_HEADER_OUTÚCURLINFO_DATA_INÚCURLINFO_DATA_OUTÚCURLINFO_SSL_DATA_INÚCURLINFO_SSL_DATA_OUTr   ri   r,   ÚsysÚstderrÚwriteÚdecodeÚUnicodeDecodeError)rV   rZ   ÚPREFIXESÚMAX_SHOW_BYTESÚprefixÚhex_strÚpostfixr[   r#   r#   r$   Údebug_function_defaultƒ   s2   ù	*
ÿ,ür�   c                 C  s.   t  |¡j}| t  | |¡dd… ¡ || S )zAffi callback for curl write function, directly writes to a bufferN)r
   rM   rF   ry   rX   )ÚptrrW   ÚnmembrI   rX   r#   r#   r$   Úbuffer_callback¢   s   r„   c                 C  s   | sdS t | ƒS ©Nr   )r'   )Úsr#   r#   r$   Ú
ensure_int«   s   r‡   c                 C  sd   t  |¡j}|t  | |¡dd… ƒ}t|ƒ}|tks|tkr |S ||| kr.tjdt	dd� || S )zHffi callback for curl write function, calls the callback python functionNzWrote bytes != received bytes.r@   ©Ú
stacklevel)
r
   rM   rF   rX   r‡   ÚCURL_WRITEFUNC_PAUSEÚCURL_WRITEFUNC_ERRORÚwarningsÚwarnr   )r‚   rW   rƒ   rI   rF   Úwroter#   r#   r$   Úwrite_callback±   s   r�   c                 C  s’   t  |¡j}|| }| |¡}|du rdS t|tƒr|S t|tƒr%| ¡ }|s)dS t|ƒ|kr<t	dt|ƒ› d|› d�ƒ‚t  
| |t|ƒ¡ t|ƒS )zIffi callback for curl read function, reads from a buffer/file-like objectNr   úRead callback returned ú bytes, but only ú bytes are allowed.)r
   rM   rF   ÚreadÚ
isinstancer'   r   Úencoder,   r1   Úmemmove)r‚   rW   rƒ   rI   rX   Úmax_lenrZ   r#   r#   r$   Úread_buffer_callbackÀ   s"   


ÿr˜   c                 C  s�   t  |¡j}|| }||ƒ}|du rdS t|tƒr|S t|tƒr$| ¡ }|s(dS t|ƒ|kr;tdt|ƒ› d|› d�ƒ‚t  	| |t|ƒ¡ t|ƒS )zGffi callback for curl read function, calls the callback python functionNr   r�   r‘   r’   )
r
   rM   rF   r”   r'   r   r•   r,   r1   r–   )r‚   rW   rƒ   rI   rF   r—   rZ   r#   r#   r$   Úread_callbackÖ   s"   

ÿr™   r*   Úoriginc              	   C  s:   t  | ¡j}z	| ||¡ W tS  ttfy   t Y S w )zDffi callback for curl seek function, seeks a file-like upload source)r
   rM   rF   ÚseekÚAttributeErrorÚOSErrorÚCURL_SEEKFUNC_CANTSEEKÚCURL_SEEKFUNC_OK)rI   r*   rš   Úsourcer#   r#   r$   Úseek_buffer_callbackì   s   þÿr¡   úlist[bytes]c                 C  s6   g }| }|r|  t |j¡¡ |j}|st | ¡ |S )z%Converts curl slist to a python list.)Úappendr
   ÚstringrZ   Únextr   Úcurl_slist_free_all)ÚheadÚresultr‚   r#   r#   r$   Úslist_to_listø   s   þ
r©   c                   @  s(  e Zd ZdZdZd]d^dd„Zd_dd„Zd_dd„Zd_dd„Zd`dd„Z	dadd„Z
dbdd„Zdcd"d#„Zddd&d'„Zded)d*„Zdfdgd.d/„Zd_d0d1„Zdhdid4d5„Zdjd6d7„Zdkd9d:„Z	+dhdid;d<„Zdld=d>„Zd_d?d@„ZdmdDdE„ZedndGdH„ƒZedodJdK„ƒZd_dLdM„ZdpdOdP„ZejfdqdUdV„Zdrdsd[d\„Z dS )tÚCurlz;
    Wrapper for ``curl_easy_*`` functions of libcurl.
    i   rn   FNÚcacertr   Údebugr`   r   r5   c                 C  sÈ   |r|nt  ¡ | _tj| _tj| _tj| _tj| _tj| _	|p t
| _d| _d| _d| _d| _d| _d| _d| _d| _t dd¡| _|| _|  ¡  t d| j¡| _t d¡| _t d¡| _t 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``.
        FNzchar[]é   zsize_t *zstruct curl_ws_frame **)r   Úcurl_easy_initÚ_curlr
   ÚNULLÚ_headersÚ_http3_headersÚ_ws_headersÚ_proxy_headersÚ_resolveÚDEFAULT_CACERTÚ_cacertÚ_is_cert_setÚ_skip_cacertÚ_write_handleÚ_header_handleÚ_debug_handleÚ_body_handleÚ_read_handleÚ_seek_handleÚnewÚ_error_bufferÚ_debugÚ_set_error_bufferÚ_WS_RECV_BUFFER_SIZEÚ_ws_recv_bufferÚ_ws_recv_n_recvÚ_ws_recv_p_frameÚ_ws_send_n_sent)r9   r«   r¬   Úhandler#   r#   r$   r8   
  s,   
zCurl.__init__c                 C  sB   t  | jtj| j¡}|dkrtjdtdd� | j	r|  
¡  d S d S )Nr   zFailed to set error bufferr@   rˆ   )r   Ú_curl_easy_setoptr¯   r   ÚERRORBUFFERrÁ   rŒ   r�   r   rÂ   r¬   ©r9   Úretr#   r#   r$   rÃ   +  s   ÿzCurl._set_error_bufferc                 C  s    |   tjd¡ |   tjd¡ dS )zSet debug to Truer	   TN)Úsetoptr   ÚVERBOSEÚDEBUGFUNCTION©r9   r#   r#   r$   r¬   2  s   z
Curl.debugc                 C  ó   |   ¡  d S r6   ©ÚcloserÑ   r#   r#   r$   Ú__del__7  ó   zCurl.__del__Úerrcoder'   r:   r   c                 G  s.   |dkrd S | j |g|¢R Ž }|d ur|‚d S r…   )Ú
_get_error)r9   r×   r:   Úerrorr#   r#   r$   Ú_check_error:  s   ÿzCurl._check_errorc                 G  sZ   |dkr+t  | j¡jdd�}d dd„ |D ƒ¡}td|› d|› d	|› d
�tt|ƒd�S d S )Nr   Úbackslashreplace©Úerrorsra   c                 S  s   g | ]}t |ƒ‘qS r#   )r   )rc   Úar#   r#   r$   Ú
<listcomp>E  s    z#Curl._get_error.<locals>.<listcomp>z
Failed to z	, curl: (z) zK. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.)r3   )r
   r¤   rÁ   rz   rh   r1   r   r   )r9   r×   r:   ÚerrmsgÚactionr#   r#   r$   rØ   B  s   üýzCurl._get_errorúBaseException | Nonec                 C  sF   | j | j| j| j| jfD ]}|d ur t |¡j}|d ur |  S qd S r6   )rº   r»   r¼   r¾   r¿   r
   rM   rG   )r9   rÉ   rG   r#   r#   r$   Ú_get_callback_exceptionM  s   û€zCurl._get_callback_exceptionÚoptionr   Úvaluec                 C  sø  | j du rdS ddddddœ}| |d d ¡}|dks |dkr(t ||¡}�n?|tjkrCt t|ƒ¡}|| _t	 
| j tjt	j¡ �n$|tjkr^t t|ƒ¡}|| _t	 
| j tjt	j¡ �n	|tjkrxt t|ƒ¡}|| _t	 
| j tjt	j¡ nï|tjkr’t t|ƒ¡}|| _t	 
| j tjt	j¡ nÕ|tjkr¯t t|ƒ¡}|| _t	 
| j tjt	j¡ tj}n¸|tjkrÌt t|ƒ¡}|| _t	 
| j tjt	j¡ tj}n›|tjkrét t|ƒ¡}|| _t	 
| j tjt	j¡ tj}n~|tjk�r|d	u rõt}t t|ƒ¡}|| _t	 
| j tjt	j¡ tj}nZ|dk�r`t|t ƒ�rTtj!tj"tj#tj$tj%tj&tj'tj(tj)tj*tj+tj,tj-tj.h}t/j0 1d
¡�rO||v �rOt2 3d¡}|j4|dd�}n| 4¡ }n|}|tj5k�r_|| _6nt7d|› �ƒ‚tj8dtj9dtj:di}||v �r›|| }	t;| |	ƒ}
|D ]	}t	 <|
|¡}
�q‚t=| |	|
ƒ t	 
| j ||
¡}nN|tj>k�r¹|D ]}t	 <| j?|¡| _?�q£t	 
| j || j?¡}n0|tj@k�rá|D ]}t|t ƒ�rÍ| 4¡ }t	 <| jA|¡| _A�qÁt	 
| j || jA¡}nt	 
| j ||¡}|  B|d||¡ |tj!k�rúd	| _C|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``.
        Nr   úlong*zchar*zvoid*úint64_t*)r   é'  i N  i0u  i@œ  rè   TÚwinFÚstrictrÜ   zOption unsupported: r±   r²   r³   rÎ   )Dr¯   r   r
   rÀ   r   Ú	WRITEDATAÚ
new_handlerE   rº   r   rÊ   ÚWRITEFUNCTIONr„   Ú
HEADERDATAr»   ÚHEADERFUNCTIONÚREADDATAr¾   ÚREADFUNCTIONr˜   ÚSEEKDATAr¿   ÚSEEKFUNCTIONr¡   r�   r™   rÐ   r�   r¼   r\   Ú	DEBUGDATAr”   r   ÚCAINFOÚCAPATHÚPROXY_CAINFOÚPROXY_CAPATHÚSSLCERTÚSSLKEYÚCRLFILEÚ
ISSUERCERTÚSSH_PUBLIC_KEYFILEÚSSH_PRIVATE_KEYFILEÚ
COOKIEFILEÚ	COOKIEJARÚ
NETRC_FILEÚUNIX_SOCKET_PATHrw   ÚplatformÚ
startswithÚlocaleÚgetpreferredencodingr•   Ú
POSTFIELDSr½   ÚNotImplementedErrorÚ
HTTPHEADERÚHTTP3_HTTPHEADERÚWS_HTTPHEADERÚgetattrÚcurl_slist_appendÚsetattrÚPROXYHEADERr´   ÚRESOLVErµ   rÚ   r¸   )r9   rä   rå   Úinput_optionÚ
value_typeÚc_valueÚfilepath_optsÚencÚheader_optionsÚheaders_attrÚheadersÚheaderrÍ   Úproxy_headerÚresolver#   r#   r$   rÎ   [  sâ   

ù
ÿ
ÿ
ÿ
ÿ

ÿ

ò

€ý


ÿzCurl.setoptr   ú%bytes | int | float | list[str | int]c           	      C  sþ   dddddddœ}t jtttttdœ}|d@ }| jd	u r'|d
kr"dS || ƒ S t  || ¡}|dkr;t | j||¡}nt 	| j||¡}|  
|d|¡ |dkrTt|d ƒS |dkrnt|d ƒ}tt  dd¡ƒ}||krldS |S |d t jkrwdS || |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 **z
uintptr_t*rç   )é   i    i  0 é  @ é  P i  ` i  ð Nr  ó    r  Úgetinfor  r   Ú	uintptr_téÿÿÿÿ)r
   r¤   r'   ÚfloatÚlistr¯   rÀ   r   Ú_curl_easy_getinfo_socketÚcurl_easy_getinforÚ   r©   r   r°   )	r9   rä   Ú
ret_optionÚret_cast_optionÚoption_typer  rÍ   ÚsocketÚ
socket_badr#   r#   r$   r!  ê  sB   ú	ú	

zCurl.getinfor^   c                 C  s   t  t ¡ ¡S )z#Get the underlying libcurl version.)r
   r¤   r   Úcurl_versionrÑ   r#   r#   r$   Úversion  s   zCurl.versionTÚtargetÚdefault_headersc                 C  s&   | j du rdS t | j | ¡ t|ƒ¡S )zéSet 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.
        Nr   )r¯   r   Úcurl_easy_impersonater•   r'   )r9   r/  r0  r#   r#   r$   Úimpersonate"  s
   

ÿzCurl.impersonatec                 C  sP   | j rd S | js&|  tj| j¡}|  |d¡ |  tj| j¡}|  |d¡ d S d S )Nz
set cacertzset proxy cacert)r¹   r¸   rÎ   r   rõ   r·   rÚ   r÷   rÌ   r#   r#   r$   Ú_ensure_cacert2  s   üzCurl._ensure_cacertÚclear_headersÚclear_resolvec              
   C  sh   | j du r	tdƒ‚|  ¡  t | j ¡}z|  ¡ }|dur|‚|  |d¡ W |  ||¡ dS |  ||¡ w )a+  Wrapper for ``curl_easy_perform``, performs a curl request.

        Parameters:
            clear_headers: clear header slist used in this perform
            clear_resolve: clear resolve slist used in this perform

        Raises:
            CurlError: if the perform was not successful.
        Nz(Cannot perform request on closed handle.Úperform)r¯   r1   r3  r   Úcurl_easy_performrã   rÚ   Úclean_handles_and_buffers)r9   r4  r5  rÍ   Úcallback_exceptionr#   r#   r$   r6  ;  s   

zCurl.performc                 C  s   | j d u rdS t | j ¡S r…   )r¯   r   Úcurl_easy_upkeeprÑ   r#   r#   r$   ÚupkeepW  s   
zCurl.upkeeprá   c                 C  s,   | j du rdS t | j |¡}|  |d¡ |S )z-Pause or resume data transfer on this handle.Nr   Úpause)r¯   r   Úcurl_easy_pauserÚ   )r9   rá   rÍ   r#   r#   r$   r<  \  s
   
z
Curl.pausec                 C  sŽ   d| _ d| _d| _d| _d| _d| _|r$| jtjkr t	 
| j¡ tj| _|rCd}|D ]}t| |ƒ}|tjkr;t	 
|¡ t| |tjƒ q*dS dS )zuClean up handles and buffers after ``perform`` and ``close``,
        called at the end of ``perform`` and ``close``.N)r±   r²   r³   r´   )rº   r»   r¼   r½   r¾   r¿   rµ   r
   r°   r   r¦   r  r  )r9   r4  r5  Úheader_attrsÚheader_attrr  r#   r#   r$   r8  d  s&   


õzCurl.clean_handles_and_buffersc                 C  s4   | j du r	tdƒ‚t | j ¡}t| j| j|d�}|S )zµWrapper 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.NzCannot duplicate closed handle.)r«   r¬   rÉ   )r¯   r1   r   Úcurl_easy_duphandlerª   r·   rÂ   )r9   rì   Úcr#   r#   r$   Ú	duphandle‚  s
   
zCurl.duphandlec                 C  s6   d| _ d| _| jdurt | j¡ |  ¡  tj| _dS )z8Reset all curl options, wrapper for ``curl_easy_reset``.FN)	r¸   r¹   r¯   r   Úcurl_easy_resetrÃ   r
   r°   rµ   rÑ   r#   r#   r$   Úreset�  s   
z
Curl.resetr  r¢   r   c                 C  s8   t ƒ }|D ]}| ¡  d¡r| |dd…  ¡ ¡ q|S )zÆExtract ``cookies.SimpleCookie`` from header lines.

        Parameters:
            headers: list of headers in bytes.

        Returns:
            A parsed cookies.SimpleCookie instance.
        s   set-cookie: é   N)r   Úlowerr  Úloadrz   )r9   r  Úcookier  r#   r#   r$   Úparse_cookie_headers–  s   	€zCurl.parse_cookie_headersÚstatus_linec                 C  s   t  | ¡}|r| d¡S dS )zTExtract reason phrase, like ``OK``, ``Not Found`` from response status
        line.r	   r   )ÚREASON_PHRASE_REÚmatchÚgroup)rJ  Úmr#   r#   r$   Úget_reason_phrase¥  s   
zCurl.get_reason_phraseú"tuple[CurlHttpVersion, int, bytes]c                 C  s„   t  | ¡}|stjddfS | d¡dkrtj}n| d¡dkr#tj}n| 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.0r@   rA   )	ÚSTATUS_LINE_RErL  r   ÚV1_0rM  ÚV2_0ÚV1_1ÚNONEr'   )rJ  rN  Úhttp_versionÚstatus_codeÚreasonr#   r#   r$   Úparse_status_line¬  s   


zCurl.parse_status_linec                 C  sP   |   ¡  | jrt | j¡ d| _t | j¡ | jdur&t | j¡ d| _dS dS )zAClose and cleanup curl handle, wrapper for ``curl_easy_cleanup``.N)r8  r¯   r   Úcurl_easy_cleanupr
   ÚreleaserÁ   rÅ   rÑ   r#   r#   r$   rÔ   Ã  s   

þz
Curl.closeútuple[bytes, CurlWsFrame]c                 C  sb   | j du r	tdƒ‚t | j | j| j| j| j¡ }r|  |d¡ t	 
| j¡d| jd … | jd fS )z»Receive a frame from a websocket connection.

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

        Raises:
            CurlError: if failed.
        Nz/Cannot receive websocket data on closed handle.ÚWS_RECVr   )r¯   r1   r   Úcurl_ws_recvrÅ   rÄ   rÆ   rÇ   rÚ   r
   rX   rÌ   r#   r#   r$   Úws_recvÐ  s   
	ûþzCurl.ws_recvÚpayloadúbytes | memoryviewr)   úCurlWsFlag | intc                 C  sN   | j du r	tdƒ‚t | j t |¡t|ƒ| jd|¡ }r"|  |d¡ | j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:
            The number of bytes sent.

        Raises:
            CurlError: if failed.
        Nz,Cannot send websocket data on closed handle.r   ÚWS_SEND)	r¯   r1   r   Úcurl_ws_sendr
   Úfrom_bufferr,   rÈ   rÚ   )r9   r`  r)   rÍ   r#   r#   r$   Úws_sendë  s   
ú
zCurl.ws_sendéè  r   r3   Úmessagec                 C  s    t  d|¡| }| j|tjd�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Úpackrf  r   ÚCLOSE)r9   r3   rh  r`  r#   r#   r$   Úws_close  s   zCurl.ws_close)rn   FN)r«   r   r¬   r`   r   r5   ©r   r5   )r×   r'   r:   r   r   r5   )r×   r'   r:   r   )r   râ   )rä   r   rå   r   r   r'   )rä   r   r   r  )r   r^   )T)r/  r   r0  r`   r   r'   )TT)r4  r`   r5  r`   r   r5   )r   r'   )rá   r'   r   r'   )r   rª   )r  r¢   r   r   )rJ  r^   r   r^   )rJ  r^   r   rP  )r   r\  )r`  ra  r)   rb  r   r'   )rg  r   )r3   r'   rh  r^   r   r'   )!r-   r.   r/   r>   rÄ   r8   rÃ   r¬   rÕ   rÚ   rØ   rã   rÎ   r!  r.  r2  r3  r6  r;  r<  r8  rB  rD  rI  ÚstaticmethodrO  rY  rÔ   r_  r   ÚBINARYrf  rl  r#   r#   r#   r$   rª     sB    
!





 

4
	

	ÿ


	

ÿrª   c                   @  s`   e Zd ZdZdd dd„Zdddddœd!dd„Zed"dd„ƒZdd#dd„Zd$dd„Z	d$dd„Z
dS )%ÚCurlMimez#Wrapper for the ``curl_mime_`` API.NrY   úCurl | Nonec                 C  s$   |r|nt ƒ | _t | jj¡| _dS )z?
        Args:
            curl: Curl instance to use.
        N)rª   r¯   r   Úcurl_mime_initÚ_form)r9   rY   r#   r#   r$   r8     s   zCurlMime.__init__)Úcontent_typeÚfilenameÚ
local_pathrZ   Únamer   rt  ú
str | Noneru  rv  ústr | bytes | Path | NonerZ   úbytes | Noner   r5   c          	      C  s2  t  | j¡}t  || ¡ ¡}|dkrtdƒ‚|dur*t  || ¡ ¡}|dkr*tdƒ‚|r2|r2tdƒ‚|durit|tƒr@t	|ƒ}nt|t
ƒrJ| ¡ }n|}t|ƒ ¡ sYtd|› �ƒ‚t  || ¡ ¡}|dkritdƒ‚|dur}t  || ¡ ¡}|dkr}tdƒ‚|dur—t|t
ƒsŒt	|ƒ ¡ }t  ||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_addpartrs  Úcurl_mime_namer•   r1   Úcurl_mime_typer”   r   r   r^   rz   r   ÚFileNotFoundErrorÚcurl_mime_filedataÚcurl_mime_filenameÚcurl_mime_datar,   )	r9   rw  rt  ru  rv  rZ   ÚpartrÍ   Úlocal_path_strr#   r#   r$   Úaddpart&  s<   




ýzCurlMime.addpartÚfilesú
list[dict]c                 C  s$   | ƒ }|D ]
}|j di |¤Ž q|S )zJCreate a multipart instance from a list of dict, for keys, see ``addpart``Nr#   )r„  )Úclsr…  ÚformÚfiler#   r#   r$   Ú	from_listc  s   zCurlMime.from_listc                 C  s"   |r|n| j }| tj| j¡ dS )z,Attach the mime instance to a curl instance.N)r¯   rÎ   r   ÚMIMEPOSTrs  )r9   rY   rA  r#   r#   r$   Úattachk  s   zCurlMime.attachc                 C  s   t  | 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_freers  r
   r°   rÑ   r#   r#   r$   rÔ   p  s   zCurlMime.closec                 C  rÒ   r6   rÓ   rÑ   r#   r#   r$   rÕ   v  rÖ   zCurlMime.__del__r6   )rY   rq  )rw  r   rt  rx  ru  rx  rv  ry  rZ   rz  r   r5   )r…  r†  )rY   rq  r   r5   rm  )r-   r.   r/   r>   r8   r„  ÚclassmethodrŠ  rŒ  rÔ   rÕ   r#   r#   r#   r$   rp    s    ù=
rp  )r   r   )rH   r'   )rV   r'   rW   r'   r   r'   )F)r]   r^   r_   r`   r   r   )rV   r'   rZ   r^   r   r5   )r*   r'   rš   r'   r   r'   )r   r¢   )IÚ
__future__r   r  Úreri  r   rw   rŒ   Úhttp.cookiesr   Úpathlibr   Útypingr   r   r   r   r   r   Ú_wrapperr
   r   Úconstr   r   r   r   r   Úutilsr   r%   r¶   ÚcompilerK  rQ  r&   Ú	Exceptionr1   rp   rq   rr   rs   rt   ru   rv   rŠ   r‹   ÚCURL_READFUNC_ABORTÚCURL_READFUNC_PAUSErŸ   ÚCURL_SEEKFUNC_FAILrž   ÚCURLPAUSE_RECVÚCURLPAUSE_RECV_CONTÚCURLPAUSE_SENDÚCURLPAUSE_SEND_CONTÚCURLPAUSE_ALLÚCURLPAUSE_CONTrE   rU   Ú
def_externr\   ri   r�   r„   r‡   r�   r˜   r™   r¡   r©   rª   rp  r#   r#   r#   r$   Ú<module>   s„    





	




    