B
    uJ$Z  ã               @   sl  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
 nFddlZddlmZ yddlmZ
 W n  ek
r   ddlmZ
 Y nX yddlZddlmZmZ W n ek
rÂ   Y nX e ee¡ G dd	„ d	ƒZed
krhe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g f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.Ú c                sÂ   t  ¡ ˆ _ˆ  |¡ dˆ _|ˆ _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© ú,lib/python3.7/site-packages/curl/__init__.pyÚheader_callback=   s    z&Curl.__init__.<locals>.header_callback)Úpycurlr   ÚhandleÚset_urlÚ	verbosityÚfakeheadersÚpayloadr   Ú
payload_ioZhrdÚ
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_verbosityNc             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-   r.   )r   Zcgir/   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   Úgetinfo)r   r$   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-availzos-errnoznum-connectszssl-enginesZ
cookielistZ
lastsocketzftp-entry-path)!r   r4   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__)N)r	   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r   r   r   r'   r.   r0   r1   r2   r3   r5   r8   r:   r;   r<   r   r   r   r   r   #   s    

%r   Ú__main__r
   zhttps://curl.haxx.ser   zK==========================================================================
zos-errno)!r@   Úsysr   Úversion_infoZpy3Zurllib.parseÚparser,   r   Úior   ZurllibZurlparseZ	cStringIOr   ÚImportErrorÚsignalr   r   r   r=   ÚlenÚargvr#   Úcr0   Úprintr2   Zpprintr8   r5   r6   r;   r   r   r   r   Ú<module>   sB    


