
v"¤Vo  ã               @   sâ  d  Z  d d l Z d d l Z e j d d k Z e ri d d l j Z d d l m Z d d l	 m
 Z
 nU d d l Z d d l m Z y d d l m Z
 Wn" e k
 r½ d d l m Z
 Yn Xy6 d d l Z d d l m Z m Z e j e e ƒ Wn e k
 rYn XGd d	 „  d	 ƒ Z e d
 k rÞe e j ƒ d k  rFd Z n e j d Z e ƒ  Z e j e ƒ e e j ƒ  ƒ e d d d ƒ d d l Z e j e j ƒ  ƒ e e j e j ƒ ƒ e e j ƒ  d ƒ e j  ƒ  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  d d „ Z d d „  Z d d „  Z d	 d
 „  Z d d „  Z d d d „ Z	 d 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  j ƒ  ˆ  _ ˆ  j | ƒ d ˆ  _ | ˆ  _ d  ˆ  _ t ƒ  ˆ  _ d ˆ  _	 ˆ  j
 t  j d ƒ ˆ  j
 t  j d ƒ ˆ  j
 t  j d ƒ ˆ  j
 t  j d ƒ ˆ  j
 t  j d ƒ ˆ  j d ƒ ˆ  j
 t  j d ƒ ˆ  j
 t  j ˆ  j j ƒ ‡  f d d	 †  } ˆ  j
 t  j | ƒ d  S)
Nr   r	   é   é   é   z	/dev/nullé   c                s   ˆ  j  |  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_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   |  j  t j | ƒ d S)z&Set timeout for a retrieving an objectN)r   r   ZTIMEOUT)r   Ztimeoutr   r   r   r   >   s    zCurl.set_timeoutc             C   s#   | |  _  |  j t j |  j  ƒ d S)z!Set the base URL to be retrieved.N)r    r   r   ÚURL)r   Úurlr   r   r   r   B   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   G   s    zCurl.set_optionc             C   s   |  j  t j | ƒ d S)z'Set verbosity to 1 to see transactions.N)r   r   ÚVERBOSE)r   Úlevelr   r   r   Úset_verbosityK   s    zCurl.set_verbosityNc             C   s|   |  j  r |  j t j |  j  ƒ | rD |  j t j t |  j | ƒ ƒ d |  _ d |  _ |  j	 j
 ƒ  |  j j ƒ  |  _ |  j S)zPerform the pending request.Nr	   )r   r   r   Z
HTTPHEADERr"   r   r    r   r   r   Zperformr   Úgetvalue)r   Zrelative_urlr   r   r   Z	__requestO   s    			zCurl.__requestc             C   s=   | r | d t  j | ƒ 7} |  j t j d ƒ |  j | ƒ 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<   |  j  t j d ƒ |  j  t j t j | ƒ ƒ |  j | ƒ 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   Úpostb   s    z	Curl.postc             C   s   |  j  S)z'Return the body from the last response.)r   )r   r   r   r   Úbodyh   s    z	Curl.bodyc             C   s   |  j  S)z)Return the header from the last response.)r   )r   r   r   r   Úheaderl   s    zCurl.headerc             G   s   |  j  j | Œ  S)z Get information about retrieval.)r   Úgetinfo)r   r$   r   r   r   Úget_infop   s    zCurl.get_infoc             C   s*  i  } |  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j	 ƒ | d <|  j  j t j
 ƒ | d <|  j  j t j ƒ | d	 <|  j  j t j ƒ | d
 <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j	 ƒ | d <|  j  j t j
 ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  j t j ƒ | d <|  j  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   r2   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   Úinfot   sD    z	Curl.infoc             C   s   |  j  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   s5   |  j  r |  j  j ƒ  d |  _  d |  _ d |  _ d S)z#Close a session, freeing resources.Nr	   )r   Úcloser   r   )r   r   r   r   r9      s
    			z
Curl.closec             C   s   |  j  ƒ  d  S)N)r9   )r   r   r   r   Ú__del__¥   s    zCurl.__del__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r   r   r   r'   r,   r.   r/   r0   r1   r3   r6   r8   r9   r:   r   r   r   r   r       s    %r   Ú__main__r
   zhttp://curl.haxx.ser   ú=éJ   Ú
zos-errno)!r>   Úsysr   Úversion_infoZpy3Zurllib.parseÚparser*   r   Úior   ZurllibZurlparseÚ	cStringIOr   ÚImportErrorÚsignalr   r   r   r;   ÚlenÚargvr#   Úcr.   Úprintr0   Úpprintr6   r3   r4   r9   r   r   r   r   Ú<module>   s@   ‰		