� zfc@sWdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZyddlmZWn!ek r�ddlmZnXyddlZWnek reZnXeZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddlm%Z%m&Z&m'Z'm(Z(e j)d Z*da,de j-ddedd�Z.d�Z/d e0fd ��YZ1d e1efd ��YZ2ej3d �Z4d�Z5ddDd��YZ6ddEd��YZ7d�Z8ddFd��YZ9de9fd��YZ:de9fd��YZ;de9fd��YZ<d�Z=de9fd��YZ>ddGd ��YZ?d!e?fd"��YZ@d#dHd$��YZAd%eAe9fd&��YZBd'eAe9fd(��YZCd)�ZDd*dId+��YZEd,e9eEfd-��YZFd.e9eEfd/��YZGd0e9fd1��YZHd2eHfd3��YZIeJed4�r�d5eHfd6��YZKnd7e9fd8��YZLd9e9fd:��YZMd;�ZNd<�ZOd=�ZPd>e9fd?��YZQd@e9fdA��YZRdBeRfdC��YZSdS(Js! An extensible library for opening URLs using a variety of protocols The simplest way to use this module is to call the urlopen function, which accepts a string containing a URL or a Request object (described below). It opens the URL and returns the results as file-like object; the returned object has some extra methods described below. The OpenerDirector manages a collection of Handler objects that do all the actual work. Each Handler implements a particular protocol or option. The OpenerDirector is a composite object that invokes the Handlers needed to open the requested URL. For example, the HTTPHandler performs HTTP GET and POST requests and deals with non-error returns. The HTTPRedirectHandler automatically deals with HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler deals with digest authentication. urlopen(url, data=None) -- Basic usage is the same as original urllib. pass the url and optionally data to post to an HTTP URL, and get a file-like object back. One difference is that you can also pass a Request instance instead of URL. Raises a URLError (subclass of IOError); for HTTP errors, raises an HTTPError, which can also be treated as a valid response. build_opener -- Function that creates a new OpenerDirector instance. Will install the default handlers. Accepts one or more Handlers as arguments, either instances or Handler classes that it will instantiate. If one of the argument is a subclass of the default handler, the argument will be installed instead of the default. install_opener -- Installs a new opener as the default opener. objects of interest: OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages the Handler classes, while dealing with requests and responses. Request -- An object that encapsulates the state of a request. The state can be as simple as the URL. It can also include extra HTTP headers, e.g. a User-Agent. BaseHandler -- exceptions: URLError -- A subclass of IOError, individual protocols have their own specific subclass. HTTPError -- Also a valid HTTP response, so you can treat an HTTP error as an exceptional event or valid response. internals: BaseHandler and parent _call_chain conventions Example usage: import urllib2 # set up authentication info authinfo = urllib2.HTTPBasicAuthHandler() authinfo.add_password(realm='PDQ Application', uri='https://mahler:8092/site-updates.py', user='klem', passwd='geheim$parole') proxy_support = urllib2.ProxyHandler({"http" : "http://ahad-haam:3128"}) # build a new opener that adds authentication and caching FTP handlers opener = urllib2.build_opener(proxy_support, authinfo, urllib2.CacheFTPHandler) # install it urllib2.install_opener(opener) f = urllib2.urlopen('http://www.python.org/') i����N(tStringIO(tunwraptunquotet splittypet splithosttquotet addinfourlt splitporttsplittagttoBytest splitattrt ftpwrappert splitusert splitpasswdt splitvalue(t localhostt url2pathnamet getproxiest proxy_bypassic Cs�|s|s|r�|dk r-td��ntsBtd��ntjdtjjd|d|�}td|�}t|�}nF|r�td|�}t|�}n"t dkr�t�a }nt }|j |||�S(NsDYou can't pass both context and any of cafile, capath, and cadefaultsSSL support not availabletpurposetcafiletcapathtcontext( tNonet ValueErrort _have_ssltssltcreate_default_contexttPurposet SERVER_AUTHt HTTPSHandlert build_openert_openertopen( turltdatattimeoutRRt cadefaultRt https_handlertopener((s/usr/lib64/python2.7/urllib2.pyturlopen�s$    cCs |adS(N(R (R'((s/usr/lib64/python2.7/urllib2.pytinstall_opener�stURLErrorcBseZd�Zd�ZRS(cCs|f|_||_dS(N(targstreason(tselfR,((s/usr/lib64/python2.7/urllib2.pyt__init__�s cCs d|jS(Ns(R,(R-((s/usr/lib64/python2.7/urllib2.pyt__str__�s(t__name__t __module__R.R/(((s/usr/lib64/python2.7/urllib2.pyR*�s t HTTPErrorcBsAeZdZejZd�Zd�Zed��Zd�Z RS(sBRaised when HTTP error occurs, but also acts like non-error returncCsV||_||_||_||_||_|dk rR|j||||�ndS(N(tcodetmsgthdrstfptfilenameRt_HTTPError__super_init(R-R"R3R4R5R6((s/usr/lib64/python2.7/urllib2.pyR.�s      cCsd|j|jfS(NsHTTP Error %s: %s(R3R4(R-((s/usr/lib64/python2.7/urllib2.pyR/�scCs|jS(N(R4(R-((s/usr/lib64/python2.7/urllib2.pyR,�scCs|jS(N(R5(R-((s/usr/lib64/python2.7/urllib2.pytinfo�s( R0R1t__doc__RR.R8R/tpropertyR,R9(((s/usr/lib64/python2.7/urllib2.pyR2�s   s:\d+$cCs_|j�}tj|�d}|dkr@|jdd�}ntjd|d�}|j�S(s�Return request-host, as defined by RFC 2965. Variation from RFC: returned value is lowercased, for convenient comparison. ittHost(t get_full_urlturlparset get_headert _cut_port_retsubtlower(trequestR"thost((s/usr/lib64/python2.7/urllib2.pyt request_host�s   tRequestcBs�eZdided�Zd�Zd�Zd�Zd�Zd�Z d�Z d�Z d�Z d �Z d �Zd �Zd �Zd �Zd�Zd�Zd�Zdd�Zd�ZRS(cCs�t|�|_t|j�\|_|_d|_d|_d|_d|_||_ i|_ x*|j �D]\}}|j ||�qmWi|_ |dkr�t|�}n||_||_dS(N(Rt_Request__originalRt_Request__fragmentRttypeREtportt _tunnel_hostR#theaderstitemst add_headertunredirected_hdrsRFtorigin_req_hostt unverifiable(R-R"R#RMRQRRtkeytvalue((s/usr/lib64/python2.7/urllib2.pyR.�s         cCs<|dkr/t|d|d��|j|St|�dS(Nt_Request__r_typet_Request__r_hosttget_i (RURV(tgetattrt__dict__tAttributeError(R-tattr((s/usr/lib64/python2.7/urllib2.pyt __getattr__�s  cCs|j�rdSdSdS(NtPOSTtGET(thas_data(R-((s/usr/lib64/python2.7/urllib2.pyt get_methods cCs ||_dS(N(R#(R-R#((s/usr/lib64/python2.7/urllib2.pytadd_datascCs |jdk S(N(R#R(R-((s/usr/lib64/python2.7/urllib2.pyR_ scCs|jS(N(R#(R-((s/usr/lib64/python2.7/urllib2.pytget_datascCs(|jrd|j|jfS|jSdS(Ns%s#%s(RIRH(R-((s/usr/lib64/python2.7/urllib2.pyR>s cCsV|jdkrOt|j�\|_|_|jdkrOtd|j�qOn|jS(Nsunknown url type: %s(RJRRRHRUR(R-((s/usr/lib64/python2.7/urllib2.pytget_types cCsR|jdkrKt|j�\|_|_|jrKt|j�|_qKn|jS(N(RERRRURVR(R-((s/usr/lib64/python2.7/urllib2.pytget_hosts  cCs|jS(N(RV(R-((s/usr/lib64/python2.7/urllib2.pyt get_selector%scCsJ|jdkr(|j r(|j|_n||_|j|_||_dS(Nthttps(RJRLRERHRV(R-RERJ((s/usr/lib64/python2.7/urllib2.pyt set_proxy(s   cCs|j|jkS(N(RVRH(R-((s/usr/lib64/python2.7/urllib2.pyt has_proxy1scCs|jS(N(RQ(R-((s/usr/lib64/python2.7/urllib2.pytget_origin_req_host4scCs|jS(N(RR(R-((s/usr/lib64/python2.7/urllib2.pytis_unverifiable7scCs||j|j�scCs||jkp||jkS(N(RMRP(R-t header_name((s/usr/lib64/python2.7/urllib2.pyt has_headerBscCs"|jj||jj||��S(N(RMtgetRP(R-Rntdefault((s/usr/lib64/python2.7/urllib2.pyR@Fs cCs)|jj�}|j|j�|j�S(N(RPtcopytupdateRMRN(R-R5((s/usr/lib64/python2.7/urllib2.pyt header_itemsKsN(R0R1RtFalseR.R\R`RaR_RbR>RcRdReRgRhRiRjRORmRoR@Rt(((s/usr/lib64/python2.7/urllib2.pyRG�s(               tOpenerDirectorcBsSeZd�Zd�Zd�Zd�Zdejd�Z dd�Z d�Z RS(cCsMdt}d|fg|_g|_i|_i|_i|_i|_dS(NsPython-urllib/%ss User-agent(t __version__t addheadersthandlerst handle_opent handle_errortprocess_responsetprocess_request(R-tclient_version((s/usr/lib64/python2.7/urllib2.pyR.Qs     c Cs�t|d�s(tdt|���nt}xet|�D]W}|d krSq;n|jd�}|| }||d}|jd�r�|jd�|d}||d}yt|�}Wntk r�nX|j j |i�} | |j |(R-R�R6R3R4R5((s/usr/lib64/python2.7/urllib2.pyR�+s(R0R1R�(((s/usr/lib64/python2.7/urllib2.pyR�*sR�cBs:eZdZdZd�Zd�ZeZZZdZ RS(ii c Cs�|j�}|dkr$|dks<|dkr�|dkr�|jdd �}td �|jj�D��}t|d |d |j�d t�St|j �||||��dS(s�Return a Request or None in response to a redirect. This is called by the http_error_30x methods when a redirection response is received. If a redirection should take place, return a new Request to allow http_error_30x to perform the redirect. Otherwise, raise HTTPError if no-one else should try to handle this url. Return None if you can't but another Handler might. i-i.i/i3R^tHEADR]t s%20css3|])\}}|j�dkr||fVqdS(scontent-lengths content-typeN(scontent-lengths content-type(RC(t.0tktv((s/usr/lib64/python2.7/urllib2.pys Js RMRQRRN(i-i.i/i3(R^R�(i-i.i/( R`treplaceR�RMRNRGRiR�R2R>( R-R�R6R3R4RMtnewurltmt newheaders((s/usr/lib64/python2.7/urllib2.pyR�6s   c Cs d|kr"|jd�d}n&d|krD|jd�d}ndStj|�}|j r�|jr�t|�}d|dRCR�R2R�RR�R�Rpt max_repeatstlentmax_redirectionstinf_msgtreadR�R�R!R$( R-R�R6R3R4RMR�turlpartst newurl_lowertnewtvisited((s/usr/lib64/python2.7/urllib2.pythttp_error_302XsB         soThe HTTP server returned a redirect error that would lead to an infinite loop. The last 30x error message was: ( R0R1R�R�R�R�thttp_error_301thttp_error_303thttp_error_307R�(((s/usr/lib64/python2.7/urllib2.pyR�.s  " 8c Cs�t|�\}}|jd�s0d}|}nV|jd�sRtd|��n|jdd�}|dkryd}n|d|!}t|�\}}|dk r�t|�\}}n d}}||||fS(s3Return (scheme, user, password, host/port) given a URL or an authority. If a URL is supplied, it must have an authority (host:port) component. According to RFC 3986, having an authority component means the URL must have two slashes after the scheme: >>> _parse_proxy('file:/ftp.example.com/') Traceback (most recent call last): ValueError: proxy URL with no authority: 'file:/ftp.example.com/' The first three items of the returned tuple may be None. Examples of authority parsing: >>> _parse_proxy('proxy.example.com') (None, None, None, 'proxy.example.com') >>> _parse_proxy('proxy.example.com:3128') (None, None, None, 'proxy.example.com:3128') The authority component may optionally include userinfo (assumed to be username:password): >>> _parse_proxy('joe:[email protected]') (None, 'joe', 'password', 'proxy.example.com') >>> _parse_proxy('joe:[email protected]:3128') (None, 'joe', 'password', 'proxy.example.com:3128') Same examples, but with URLs instead: >>> _parse_proxy('http://proxy.example.com/') ('http', None, None, 'proxy.example.com') >>> _parse_proxy('http://proxy.example.com:3128/') ('http', None, None, 'proxy.example.com:3128') >>> _parse_proxy('http://joe:[email protected]/') ('http', 'joe', 'password', 'proxy.example.com') >>> _parse_proxy('http://joe:[email protected]:3128') ('http', 'joe', 'password', 'proxy.example.com:3128') Everything after the authority is ignored: >>> _parse_proxy('ftp://joe:[email protected]/rubbish:3128') ('ftp', 'joe', 'password', 'proxy.example.com') Test for no trailing '/' case: >>> _parse_proxy('http://joe:[email protected]') ('http', 'joe', 'password', 'proxy.example.com') R�s//sproxy URL with no authority: %rii����N(RR�RRR�R R ( tproxytschemetr_schemet authoritytendtuserinfothostporttusertpassword((s/usr/lib64/python2.7/urllib2.pyt _parse_proxy�s2      R�cBs#eZdZdd�Zd�ZRS(idcCse|dkrt�}n||_x=|j�D]/\}}t|d||||jd��q.WdS(Ns%s_opencSs||||�S(N((trR�RJR�((s/usr/lib64/python2.7/urllib2.pyt�s(RRtproxiesRNtsetattrR�(R-R�RJR"((s/usr/lib64/python2.7/urllib2.pyR.�s     c Cs|j�}t|�\}}}}|dkr9|}n|j�|jr_t|j�r_dS|r�|r�dt|�t|�f} tj| �j �} |j dd| �nt|�}|j ||�||ks�|dkr�dS|j j |d|j�SdS(Ns%s:%ssProxy-authorizationsBasic RfR$(RcR�RRdRERRtbase64t b64encodetstripRORgR�R!R$( R-R�R�RJt orig_typet proxy_typeR�R�R�t user_passtcreds((s/usr/lib64/python2.7/urllib2.pyR��s       N(R0R1R�RR.R�(((s/usr/lib64/python2.7/urllib2.pyR��s tHTTPPasswordMgrcBs8eZd�Zd�Zd�Zed�Zd�ZRS(cCs i|_dS(N(tpasswd(R-((s/usr/lib64/python2.7/urllib2.pyR.scCs�t|t�r|g}n||jkr:i|j|R0(R-R�R6R3R4RMR"R�((s/usr/lib64/python2.7/urllib2.pythttp_error_401�s  (R0R1R1R:(((s/usr/lib64/python2.7/urllib2.pyR8�stProxyBasicAuthHandlercBseZdZd�ZRS(sProxy-authorizationcCs(|j�}|jd|||�}|S(Nsproxy-authenticate(RdR0(R-R�R6R3R4RMR�R�((s/usr/lib64/python2.7/urllib2.pythttp_error_407�s  (R0R1R1R<(((s/usr/lib64/python2.7/urllib2.pyR;�scCs}tjjd�r;td�}|j|�}|j�|Sgt|�D]}ttj dd��^qH}dj |�SdS(sReturn n random bytes.s /dev/urandomiiR<N( tosR�texistsR!R�R�trangetchrtrandomt randrangetjoin(tntftsR�tL((s/usr/lib64/python2.7/urllib2.pyt randombytes�s  1tAbstractDigestAuthHandlercBsSeZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z RS( cCsO|dkrt�}n||_|jj|_d|_d|_d|_dS(Ni(RRR Rtretriedt nonce_countt last_nonce(R-R ((s/usr/lib64/python2.7/urllib2.pyR.�s     cCs d|_dS(Ni(RJ(R-((s/usr/lib64/python2.7/urllib2.pytreset_retry_count�scCs�|j|d�}|jdkrBt|j�dd|d��n|jd7_|r�|j�d}|j�dkr�|j||�SndS(Nii�sdigest auth failediitdigest(RpRRJR2R>tsplitRCtretry_http_digest_auth(R-R1RER�RMR.R�((s/usr/lib64/python2.7/urllib2.pyR0�scCs�|jdd�\}}tt|��}|j||�}|r�d|}|jj|jd�|krndS|j|j|�|j j |d|j �}|SdS(NR�is Digest %sR$( ROtparse_keqv_listtparse_http_listtget_authorizationRMRpR1RRmR�R!R$(R-R�R4ttokent challengetchaltauth_valtresp((s/usr/lib64/python2.7/urllib2.pyRP�s cCs<tjd|j|tj�td�f�j�}|d S(Ns %s:%s:%s:%sii(thashlibtsha1RKttimetctimeRHt hexdigest(R-tnoncetdig((s/usr/lib64/python2.7/urllib2.pyt get_cnonce�scCsdyK|d}|d}|jd�}|jdd�}|jdd�}Wntk r_dSX|j|�\}} |dkr�dS|jj||j��\} } | dkr�dS|j�r�|j|j �|�} nd} d| || f} d|j �|j �f}|d kr�||j kr?|j d 7_ nd |_ ||_ d |j }|j|�}d ||||||�f}| || �|�}nD|dkr�| || �d|||�f�}ntd |��d| |||j �|f}|r|d|7}n| r5|d| 7}n|d|7}|r`|d||f7}n|S(NR R^tqopt algorithmtMD5topaques%s:%s:%ss%s:%sR4is%08xs%s:%s:%s:%s:%ssqop '%s' is not supported.s>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"s , opaque="%s"s , digest="%s"s, algorithm="%s"s, qop=auth, nc=%s, cnonce="%s"(RpRtKeyErrortget_algorithm_implsR RR>R_tget_entity_digestRbR`ReRLRKR`R*(R-R�RVR R^RaRbRdtHtKDR�R2tentdigtA1tA2tncvaluetcnoncetnoncebittrespdigR((s/usr/lib64/python2.7/urllib2.pyRS�sV    !        ( csk|j�}|dkr$d��n.|dkr<d��ntd|j����fd�}�|fS(NRccSstj|�j�S(N(RYtmd5R](tx((s/usr/lib64/python2.7/urllib2.pyR�0R<tSHAcSstj|�j�S(N(RYRZR](Rr((s/usr/lib64/python2.7/urllib2.pyR�2R<s.Unsupported digest authentication algorithm %rcs�d||f�S(Ns%s:%s((RFtd(Rh(s/usr/lib64/python2.7/urllib2.pyR�7R<(tupperRRC(R-RbRi((Rhs/usr/lib64/python2.7/urllib2.pyRf+s     cCsdS(N(R(R-R#RV((s/usr/lib64/python2.7/urllib2.pyRg:sN( R0R1RR.RMR0RPR`RSRfRg(((s/usr/lib64/python2.7/urllib2.pyRI�s   = tHTTPDigestAuthHandlercBs#eZdZdZdZd�ZRS(s�An authentication protocol defined by RFC 2069 Digest authentication improves on basic authentication because it does not transmit passwords in the clear. R9i�cCs?tj|j��d}|jd|||�}|j�|S(Niswww-authenticate(R?R>R0RM(R-R�R6R3R4RMREtretry((s/usr/lib64/python2.7/urllib2.pyR:Is   (R0R1R:R1R�R:(((s/usr/lib64/python2.7/urllib2.pyRv?stProxyDigestAuthHandlercBseZdZdZd�ZRS(sProxy-Authorizationi�cCs2|j�}|jd|||�}|j�|S(Nsproxy-authenticate(RdR0RM(R-R�R6R3R4RMRERw((s/usr/lib64/python2.7/urllib2.pyR<Vs    (R0R1R1R�R<(((s/usr/lib64/python2.7/urllib2.pyRxQstAbstractHTTPHandlercBs/eZdd�Zd�Zd�Zd�ZRS(icCs ||_dS(N(t _debuglevel(R-t debuglevel((s/usr/lib64/python2.7/urllib2.pyR._scCs ||_dS(N(Rz(R-tlevel((s/usr/lib64/python2.7/urllib2.pytset_http_debuglevelbsc Cs:|j�}|s!td��n|j�r�|j�}|jd�s[|jdd�n|jd�s�|jddt|��q�n|}|j�r�t|j ��\}}t |�\}}n|jd�s�|jd|�nxH|j j D]:\}} |j �}|j|�s�|j|| �q�q�W|S(Ns no host givens Content-types!application/x-www-form-urlencodedsContent-lengths%dR=(RdR*R_RbRoRmR�RhRReRR�RxRk( R-RDRER#tsel_hostR�tseltsel_pathtnameRT((s/usr/lib64/python2.7/urllib2.pyt do_request_es.      c  s�|j�}|s!td��n||d|j|�}|j|j�t|j���jt�fd�|jj �D���d�d�s R�t Connectioncss'|]\}}|j�|fVqdS(N(ttitle(R�R�Rl((s/usr/lib64/python2.7/urllib2.pys �ssProxy-AuthorizationRMt buffering(RdR*R$tset_debuglevelRzR�RPRsRMRNRLt set_tunnelRDR`ReR#R�R�R�t getresponseR�R�R�trecvt _fileobjectRR4R>tstatusR3R,( R-t http_classR�thttp_conn_argsRER�ttunnel_headerstproxy_auth_hdrterrR�R6RX((RMs/usr/lib64/python2.7/urllib2.pyR��s@ ,    )     (R0R1R.R}R�R�(((s/usr/lib64/python2.7/urllib2.pyRy]s   R�cBseZd�ZejZRS(cCs|jtj|�S(N(R�R�tHTTPConnection(R-R�((s/usr/lib64/python2.7/urllib2.pyt http_open�s(R0R1R�RyR�t http_request(((s/usr/lib64/python2.7/urllib2.pyR��s R�RcBs)eZddd�Zd�ZejZRS(icCstj||�||_dS(N(RyR.t_context(R-R{R((s/usr/lib64/python2.7/urllib2.pyR.�scCs|jtj|d|j�S(NR(R�R�tHTTPSConnectionR�(R-R�((s/usr/lib64/python2.7/urllib2.pyt https_open�sN(R0R1RR.R�RyR�t https_request(((s/usr/lib64/python2.7/urllib2.pyR�s tHTTPCookieProcessorcBs2eZdd�Zd�Zd�ZeZeZRS(cCs4ddl}|dkr'|j�}n||_dS(Ni����(t cookielibRt CookieJart cookiejar(R-R�R�((s/usr/lib64/python2.7/urllib2.pyR.�s  cCs|jj|�|S(N(R�tadd_cookie_header(R-RD((s/usr/lib64/python2.7/urllib2.pyR��scCs|jj||�|S(N(R�textract_cookies(R-RDR�((s/usr/lib64/python2.7/urllib2.pyR��sN(R0R1RR.R�R�R�R�(((s/usr/lib64/python2.7/urllib2.pyR��s    R�cBseZd�ZRS(cCs |j�}td|��dS(Nsunknown url type: %s(RcR*(R-R�RJ((s/usr/lib64/python2.7/urllib2.pyR��s (R0R1R�(((s/usr/lib64/python2.7/urllib2.pyR��scCsmi}x`|D]X}|jdd�\}}|ddkr[|ddkr[|dd!}n|||Parse list of key=value strings where keys are not duplicated.t=iiR$i����(RO(tltparsedteltR�R�((s/usr/lib64/python2.7/urllib2.pyRQ�s  cCs�g}d}t}}x�|D]�}|r?||7}t}qn|r�|dkr]t}qn|dkrrt}n||7}qn|dkr�|j|�d}qn|dkr�t}n||7}qW|r�|j|�ng|D]}|j�^q�S(spParse lists as described by RFC 2068 Section 2. In particular, parse comma-separated lists where the elements of the list may include quoted-strings. A quoted-string could contain a comma. A non-quoted string could have quotes in the middle. Neither commas nor quotes count if they are escaped. Only double-quotes count, not single-quotes. R<s\R$t,(RuR�R�R(RFtrestparttescapeRtcur((s/usr/lib64/python2.7/urllib2.pyRRs4            cCs-ytj|�SWntjk r(dSXdS(N(R�t gethostbynametgaierrorR(RE((s/usr/lib64/python2.7/urllib2.pyt_safe_gethostbyname+sR�cBs)eZd�ZdZd�Zd�ZRS(cCsq|j�}|d dkr`|dd!dkr`|jr`|jdkr`d|_|jj|�S|j|�SdS(Nis//iR�Rtftp(ReRERJR�R!topen_local_file(R-R�R"((s/usr/lib64/python2.7/urllib2.pyt file_open3s  , cCs|tjdkruy7ttjd�dtjtj��d�t_Wqutjk rqtjd�ft_quXntjS(NRi( R�tnamesRR R�tgethostbyname_ext gethostnameR�R�(R-((s/usr/lib64/python2.7/urllib2.pyt get_names>s$cCs[ddl}ddl}|j�}|j�}t|�}y�tj|�}|j}|jj |j dt �} |j |�d} t jtd| p�d|| f��} |r�t|�\}} n| s�| r(t|�|j�kr(|rd||} n d|} tt|d�| | �SWntk rJ}t|��nXtd��dS( Ni����tusegmtis6Content-type: %s Content-length: %d Last-modified: %s s text/plainsfile://trbsfile not on local host(t email.utilst mimetypesRdReRR=tstattst_sizetutilst formatdatetst_mtimeR�t guess_typet mimetoolstMessageRRR�R�RR!tOSErrorR*(R-R�temailR�RER7t localfiletstatstsizetmodifiedtmtypeRMRKtorigurlR4((s/usr/lib64/python2.7/urllib2.pyR�Is0        N(R0R1R�RR�R�R�(((s/usr/lib64/python2.7/urllib2.pyR�1s  R�cBseZd�Zd�ZRS(cCs�ddl}ddl}|j�}|s9td��nt|�\}}|dkrc|j}n t|�}t|�\}}|r�t |�\}}nd}t |�}|p�d}|p�d}yt j |�}Wn"t j k r�}t|��nXt|j��\} } | jd�} tt | �} | d | d} } | rg| d rg| d} ny/|j||||| |j�} | r�dp�d}xM| D]E}t|�\}}|j�d kr�|dkr�|j�}q�q�W| j| |�\}}d}|j|j��d}|r;|d|7}n|dk rd|dkrd|d|7}nt|�}tj|�}t|||j��SWn0|jk r�}td|tj �d�nXdS(Ni����sftp error: no host givenR<R�iiR7tDRJtatAR�RtsContent-type: %s sContent-length: %d s ftp error: %si(R�R�R�R7RtR�(!tftplibR�RdR*RRtFTP_PORTR�R R RR�R�R�R ReROtmapt connect_ftpR$RRCRutretrfileR�R>RR�R�Rt all_errorstsystexc_info(R-R�R�R�RERKR�R R4R�tattrstdirstfiletfwRJR[RTR6tretrlenRMR�tsf((s/usr/lib64/python2.7/urllib2.pytftp_openfs\          !   c Cs%t||||||dt�}|S(Nt persistent(R Ru(R-R�R RERKR�R$R�((s/usr/lib64/python2.7/urllib2.pyR��s (R0R1R�R�(((s/usr/lib64/python2.7/urllib2.pyR�es 5tCacheFTPHandlercBs>eZd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs1i|_i|_d|_d|_d|_dS(Nii<i(tcacheR$tsoonesttdelayt max_conns(R-((s/usr/lib64/python2.7/urllib2.pyR.�s     cCs ||_dS(N(R�(R-tt((s/usr/lib64/python2.7/urllib2.pyt setTimeout�scCs ||_dS(N(R�(R-R�((s/usr/lib64/python2.7/urllib2.pyt setMaxConns�scCs�|||dj|�|f}||jkrJtj�|j|j|Ls�                 ^"     p� 'i H-@ 2  � n  + 4<