a
    ^%O_#  ã                   @   sh  d Z ddlZddlZejd dkZerLddlmZ ddlmZ ddl	m
Z
 nDddlZddlmZ zddlmZ
 W n eyŽ   ddlmZ
 Y n0 zddlZddlmZmZ W n ey¾   Y n0 e ee¡ G dd	„ d	ƒZed
krdeejƒdk rødZn
ejd Zeƒ Ze e¡ ee ¡ ƒ edƒ ddlZe e ¡ ¡ ee ej¡ƒ ee ¡ d ƒ e  ¡  dS )z.A high-level interface to the pycurl extensioné    Né   )Úurljoin)ÚBytesIO)ÚStringIO)ÚSIGPIPEÚSIG_IGNc                   @   sŽ   e Zd ZdZd"dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zd#d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S )%ÚCurlz)High-level interface to pycurl functions.Ú Nc                    sÆ   t  ¡ ˆ _ˆ  |¡ dˆ _|p g ˆ _d ˆ _tƒ ˆ _dˆ _	ˆ  
t jd¡ ˆ  
t jd¡ ˆ  
t jd¡ ˆ  
t jd¡ ˆ  
t jd¡ ˆ  d¡ ˆ  
t jd¡ ˆ  
t jˆ jj¡ ‡ fdd	„}ˆ  
t j|¡ d S )
Nr   r	   é   é   é   z	/dev/nullé   c                    s   ˆ  j |  d¡7  _ d S )NÚascii)ÚhdrÚdecode)Úx©Úself© ú//usr/lib/python3/dist-packages/curl/__init__.pyÚheader_callback=   s    z&Curl.__init__.<locals>.header_callback)Úpycurlr   ÚhandleÚset_urlÚ	verbosityÚfakeheadersÚpayloadr   Ú
payload_ior   Ú
set_optionZSSL_VERIFYHOSTZFOLLOWLOCATIONZ	MAXREDIRSZNOSIGNALZ
COOKIEFILEÚset_timeoutZNETRCZWRITEFUNCTIONÚwriteZHEADERFUNCTION)r   Úbase_urlr   r   r   r   r   Ú__init__%   s"    



zCurl.__init__c                 C   s   |   tj|¡ dS )z&Set timeout for a retrieving an objectN)r   r   ZTIMEOUT)r   Ztimeoutr   r   r   r   A   s    zCurl.set_timeoutc                 C   s   || _ |  tj| j ¡ dS )z!Set the base URL to be retrieved.N)r!   r   r   ÚURL)r   Úurlr   r   r   r   E   s    zCurl.set_urlc                 G   s   | j j|Ž  dS )zSet an option on the retrieval.N)r   Zsetopt©r   Úargsr   r   r   r   J   s    zCurl.set_optionc                 C   s   |   tj|¡ dS )z'Set verbosity to 1 to see transactions.N)r   r   ÚVERBOSE)r   Úlevelr   r   r   Úset_verbosityN   s    zCurl.set_verbosityc                 C   sn   | j r|  tj| j ¡ |r0|  tjt| j|ƒ¡ d| _| j 	d¡ | j 
¡  d| _| j ¡  | j ¡ | _| jS )zPerform the pending request.Nr   r	   )r   r   r   Z
HTTPHEADERr#   r   r!   r   r   ÚseekÚtruncater   r   ZperformÚgetvalue)r   Zrelative_urlr   r   r   Z	__requestR   s    

zCurl.__requestc                 C   s.   |r|dt  |¡ 7 }|  tjd¡ |  |¡S )z=Ship a GET request for a specified URL, capture the response.ú?r   )Úurllib_parseÚ	urlencoder   r   ZHTTPGETÚ_Curl__request)r   r$   Úparamsr   r   r   Úget`   s    zCurl.getc                 C   s,   |   tjd¡ |   tjt |¡¡ |  |¡S )z=Ship a POST request to a specified CGI, capture the response.r   )r   r   ZPOSTZ
POSTFIELDSr.   r/   r0   )r   Zcgir1   r   r   r   Úpostg   s    z	Curl.postc                 C   s   | j S )z'Return the body from the last response.)r   r   r   r   r   Úbodym   s    z	Curl.bodyc                 C   s   | j S )z)Return the header from the last response.)r   r   r   r   r   Úheaderq   s    zCurl.headerc                 G   s   | j j|Ž S )z Get information about retrieval.)r   Úgetinfor%   r   r   r   Úget_infou   s    zCurl.get_infoc                 C   sH  i }| j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj	¡|d< | j  tj
¡|d< | j  tj¡|d	< | j  tj¡|d
< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj	¡|d< | j  tj
¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj¡|d< | j  tj ¡|d< |S )z7Return a dictionary with all info on the last response.zeffective-urlz	http-codez
total-timeznamelookup-timezconnect-timezpretransfer-timezredirect-timezredirect-countzsize-uploadzsize-downloadzspeed-uploadzheader-sizezrequest-sizezcontent-length-downloadzcontent-length-uploadzcontent-typezresponse-codezspeed-downloadzssl-verifyresultZfiletimezstarttransfer-timezhttp-connectcodezhttpauth-availzproxyauth-availúos-errnoznum-connectszssl-enginesZ
cookielistZ
lastsocketzftp-entry-path)!r   r6   r   ZEFFECTIVE_URLZ	HTTP_CODEZ
TOTAL_TIMEZNAMELOOKUP_TIMEZCONNECT_TIMEZPRETRANSFER_TIMEZREDIRECT_TIMEZREDIRECT_COUNTZSIZE_UPLOADZSIZE_DOWNLOADZSPEED_UPLOADZHEADER_SIZEZREQUEST_SIZEZCONTENT_LENGTH_DOWNLOADZCONTENT_LENGTH_UPLOADZCONTENT_TYPEZRESPONSE_CODEZSPEED_DOWNLOADZSSL_VERIFYRESULTZINFO_FILETIMEZSTARTTRANSFER_TIMEZHTTP_CONNECTCODEZHTTPAUTH_AVAILZPROXYAUTH_AVAILÚOS_ERRNOZNUM_CONNECTSZSSL_ENGINESZINFO_COOKIELISTZ
LASTSOCKETZFTP_ENTRY_PATH)r   Úmr   r   r   Úinfoy   sD    z	Curl.infoc                 C   s   | j  |¡dkS )z3Did a given check string occur in the last payload?r   )r   Úfind)r   Zcheckr   r   r   Úansweredž   s    zCurl.answeredc                 C   s&   | j r| j  ¡  d| _ d| _d| _dS )z#Close a session, freeing resources.Nr	   )r   Úcloser   r   r   r   r   r   r>   ¢   s
    
z
Curl.closec                 C   s   |   ¡  d S )N)r>   r   r   r   r   Ú__del__ª   s    zCurl.__del__)r	   N)N)r	   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r   r   r   r)   r0   r2   r3   r4   r5   r7   r;   r=   r>   r?   r   r   r   r   r   #   s    


%r   Ú__main__r
   zhttps://curl.haxx.ser   zK==========================================================================
r8   )!rC   Úsysr   Úversion_infoZpy3Zurllib.parseÚparser.   r   Úior   ZurllibZurlparseZ	cStringIOr   ÚImportErrorÚsignalr   r   r   r@   ÚlenÚargvr$   Úcr2   Úprintr4   Zpprintr;   r7   r9   r>   r   r   r   r   Ú<module>   sB    


