B üûó\ñ‘ã!@sÂddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*y ddl+Z+Wne,k rdZ-YnXdZ-ddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'g!Z.d(e j/dd)…Z0da1de j2fddddd*œd+d„Z3d,d„Z4gZ5d}d-d$„Z6d.d%„Z7e  8d/e j9¡Z:d0d1„Z;Gd2d„dƒZGd5d „d ƒZ?Gd6d„de?ƒZ@Gd7d „d e?ƒZAGd8d „d e?ƒZBd9d:„ZCGd;d „d e?ƒZDGdd„deFƒZGGd?d„dƒZHGd@d„deHe?ƒZIGdAd„deHe?ƒZJejKZLGdBd„dƒZMGdCd„de?eMƒZNGdDd„de?eMƒZOGdEdF„dFe?ƒZPGdGd„dePƒZQeRejSdHƒr&GdIdJ„dJePƒZTe. UdJ¡GdKd „d e?ƒZVGdLd„de?ƒZWdMdN„ZXdOdP„ZYGdQd„de?ƒZZdRdS„Z[GdTd„de?ƒZ\GdUd„de\ƒZ]GdVd„de?ƒZ^dWZ_ej`dXkrÀddYlambZbmcZcndZd"„Zbd[d!„ZciZdGd\d&„d&ƒZeGd]d'„d'eeƒZfdagd^d_„Zhdaid`da„Zjdakdbdc„Zldamddde„ZnGdfdg„dgƒZodhdi„Zpd~djdk„Zqdldm„Zre jsdnkrˆddoltmuZumvZvdpdq„Zwdrds„Zxdtdu„Zydvd#„Zzn6ej`dXkr¶dwdx„Z{dyd#„Zzdzd{„Z|d|du„ZynepZzeqZydS)éN)ÚURLErrorÚ HTTPErrorÚContentTooShortError)ÚurlparseÚurlsplitÚurljoinÚunwrapÚquoteÚunquoteÚ splittypeÚ splithostÚ splitportÚ splituserÚ splitpasswdÚ splitattrÚ splitqueryÚ splitvalueÚsplittagÚto_bytesÚunquote_to_bytesÚ urlunparse)Ú addinfourlÚ addclosehookFTÚRequestÚOpenerDirectorÚ BaseHandlerÚHTTPDefaultErrorHandlerÚHTTPRedirectHandlerÚHTTPCookieProcessorÚ ProxyHandlerÚHTTPPasswordMgrÚHTTPPasswordMgrWithDefaultRealmÚHTTPPasswordMgrWithPriorAuthÚAbstractBasicAuthHandlerÚHTTPBasicAuthHandlerÚProxyBasicAuthHandlerÚAbstractDigestAuthHandlerÚHTTPDigestAuthHandlerÚProxyDigestAuthHandlerÚ HTTPHandlerÚ FileHandlerÚ FTPHandlerÚCacheFTPHandlerÚ DataHandlerÚUnknownHandlerÚHTTPErrorProcessorÚurlopenÚinstall_openerÚ build_openerÚ pathname2urlÚ url2pathnameÚ getproxiesÚ urlretrieveÚ urlcleanupÚ URLopenerÚFancyURLopenerz%d.%dé)ÚcafileÚcapathÚ cadefaultÚcontextc Cs¤|s |s |rfddl}| dtd¡|dk r2tdƒ‚ts>tdƒ‚tjtjj||d}t |d}t |ƒ} n0|r~t |d}t |ƒ} nt dkr’t ƒa } nt } |   |||¡S)NrzJcafile, capath and cadefault are deprecated, use a custom context instead.r:zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;r<)r>) ÚwarningsÚwarnÚDeprecationWarningÚ ValueErrorÚ _have_sslÚsslZcreate_default_contextZPurposeZ SERVER_AUTHÚ HTTPSHandlerr2Ú_openerÚopen) ÚurlÚdataÚtimeoutr;r<r=r>r?Z https_handlerÚopener©rLú1/opt/alt/python37/lib/python3.7/urllib/request.pyr0‹s*<       cCs|adS)N)rF)rKrLrLrMr1àsc Cs2t|ƒ\}}t t||ƒ¡æ}| ¡}|dkrB|sBtj |¡|fS|rRt|dƒ}nt j dd}|j }t   |¡|†||f} d} d} d} d} d|kr t|d ƒ} |r°|| | | ƒxB| | ¡}|sÂP| t|ƒ7} | |¡| d 7} |r²|| | | ƒq²WWdQRXWdQRX| dkr.| | kr.td | | f| ƒ‚| S) NÚfileÚwbF)Údeletei éÿÿÿÿrzcontent-lengthzContent-Lengthéz1retrieval incomplete: got only %i out of %i bytes)r Ú contextlibÚclosingr0ÚinfoÚosÚpathÚnormpathrGÚtempfileZNamedTemporaryFileÚnameÚ_url_tempfilesÚappendÚintÚreadÚlenÚwriter)rHÚfilenameÚ reporthookrIZurl_typerWÚfpÚheadersÚtfpÚresultÚbsÚsizer^ÚblocknumÚblockrLrLrMr6åsD          $c CsHx0tD](}yt |¡Wqtk r,YqXqWtdd…=trDdadS)N)r[rVÚunlinkÚOSErrorrF)Z temp_filerLrLrMr7$s   z:\d+$cCs<|j}t|ƒd}|dkr&| dd¡}t d|d¡}| ¡S)NrRÚÚHost)Úfull_urlrÚ get_headerÚ _cut_port_reÚsubÚlower)ÚrequestrHÚhostrLrLrMÚ request_host3s   rvc@sÊeZdZdidddfdd„Zedd„ƒZejdd„ƒZejdd„ƒZed d „ƒZejd d „ƒZejd d „ƒZd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd#dd„Zdd „Zd!d"„ZdS)$rNFc Csp||_i|_i|_d|_||_d|_x | ¡D]\}}| ||¡q.W|dkrVt|ƒ}||_ ||_ |rl||_ dS)N) rordÚunredirected_hdrsÚ_datarIÚ _tunnel_hostÚitemsÚ add_headerrvÚorigin_req_hostÚ unverifiableÚmethod) ÚselfrHrIrdr|r}r~ÚkeyÚvaluerLrLrMÚ__init__EszRequest.__init__cCs|jrd |j|j¡S|jS)Nz{}#{})ÚfragmentÚformatÚ _full_url)rrLrLrMroWszRequest.full_urlcCs(t|ƒ|_t|jƒ\|_|_| ¡dS)N)rr…rrƒÚ_parse)rrHrLrLrMro]s cCsd|_d|_d|_dS)Nrm)r…rƒÚselector)rrLrLrMrodscCs|jS)N)rx)rrLrLrMrIjsz Request.datacCs(||jkr$||_| d¡r$| d¡dS)NzContent-length)rxÚ has_headerÚ remove_header)rrIrLrLrMrIns  cCs d|_dS)N)rI)rrLrLrMrIxscCsNt|jƒ\|_}|jdkr(td|jƒ‚t|ƒ\|_|_|jrJt|jƒ|_dS)Nzunknown url type: %r) r r…ÚtyperBror rur‡r )rÚrestrLrLrMr†|s  zRequest._parsecCs|jdk rdnd}t|d|ƒS)NÚPOSTÚGETr~)rIÚgetattr)rZdefault_methodrLrLrMÚ get_method„szRequest.get_methodcCs|jS)N)ro)rrLrLrMÚ get_full_url‰szRequest.get_full_urlcCs2|jdkr|js|j|_n||_|j|_||_dS)NÚhttps)rŠryruror‡)rrurŠrLrLrMÚ set_proxyŒs  zRequest.set_proxycCs |j|jkS)N)r‡ro)rrLrLrMÚ has_proxy”szRequest.has_proxycCs||j| ¡<dS)N)rdÚ capitalize)rr€ÚvalrLrLrMr{—szRequest.add_headercCs||j| ¡<dS)N)rwr”)rr€r•rLrLrMÚadd_unredirected_header›szRequest.add_unredirected_headercCs||jkp||jkS)N)rdrw)rÚ header_namerLrLrMrˆŸs zRequest.has_headercCs|j ||j ||¡¡S)N)rdÚgetrw)rr—ÚdefaultrLrLrMrp£szRequest.get_headercCs |j |d¡|j |d¡dS)N)rdÚpoprw)rr—rLrLrMr‰¨szRequest.remove_headercCs"|j ¡}| |j¡t| ¡ƒS)N)rwÚcopyÚupdaterdÚlistrz)rÚhdrsrLrLrMÚ header_items¬s  zRequest.header_items)N)Ú__name__Ú __module__Ú __qualname__r‚ÚpropertyroÚsetterÚdeleterrIr†rrr’r“r{r–rˆrpr‰rŸrLrLrLrMrCs(     c@sNeZdZdd„Zdd„Zdd„Zdd„Zd ejfd d „Z dd d „Z dd„Z d S)rcCs6dt}d|fg|_g|_i|_i|_i|_i|_dS)NzPython-urllib/%sz User-agent)Ú __version__Ú addheadersÚhandlersÚ handle_openÚ handle_errorÚprocess_responseÚprocess_request)rZclient_versionrLrLrMr‚²s zOpenerDirector.__init__c CsZt|dƒstdt|ƒƒ‚d}xt|ƒD]}|dkr:q*| d¡}|d|…}||dd…}| d¡rÈ| d¡|d}||dd…}y t|ƒ}Wntk r¬YnX|j  |i¡} | |j|<n>|dkrÜ|}|j } n*|d krð|}|j } n|d kr*|}|j } nq*|   |g¡} | r&t | |¡n |  |¡d }q*W|rVt |j|¡| |¡dS) NÚ add_parentz%expected BaseHandler instance, got %rF)Úredirect_requestÚdo_openÚ proxy_openÚ_rRÚerrorrGÚresponsertT)ÚhasattrÚ TypeErrorrŠÚdirÚfindÚ startswithr]rBrªr˜r©r«r¬Ú setdefaultÚbisectZinsortr\r¨r­) rÚhandlerZaddedÚmethÚiÚprotocolZ conditionÚjÚkindÚlookupr¨rLrLrMÚ add_handler½sJ         zOpenerDirector.add_handlercCsdS)NrL)rrLrLrMÚcloseìszOpenerDirector.closec Gs<| |d¡}x*|D]"}t||ƒ}||Ž}|dk r|SqWdS)NrL)r˜rŽ) rÚchainrÀÚ meth_nameÚargsr¨r»ÚfuncrfrLrLrMÚ _call_chainðs    zOpenerDirector._call_chainNc Csªt|tƒrt||ƒ}n|}|dk r(||_||_|j}|d}x(|j |g¡D]}t||ƒ}||ƒ}qLW|  ||¡} |d}x*|j  |g¡D]}t||ƒ}||| ƒ} qŠW| S)NZ_requestZ _response) Ú isinstanceÚstrrrIrJrŠr¬r˜rŽÚ_openr«) rÚfullurlrIrJÚreqr¾rÅZ processorr¼r³rLrLrMrGûs"      zOpenerDirector.opencCsP| |jdd|¡}|r|S|j}| |j||d|¡}|r>|S| |jdd|¡S)Nr™Z default_openrËÚunknownÚ unknown_open)rÈr©rŠ)rrÍrIrfr¾rLrLrMrËs    zOpenerDirector._opencGs~|dkr,|jd}|d}d|}d}|}n|j}|d}d}|||f|}|j|Ž}|r^|S|rz|dd f|}|j|ŽSdS) N)Úhttpr‘rÐr:z http_error_%srRÚ_errorrr™Úhttp_error_default)rªrÈ)rÚprotorÆÚdictrÅZhttp_errZ orig_argsrfrLrLrMr²&s   zOpenerDirector.error)N) r r¡r¢r‚rÂrÃrÈÚsocketÚ_GLOBAL_DEFAULT_TIMEOUTrGrËr²rLrLrLrMr±s /  c Gsætƒ}ttttttttt g }t t j dƒr2|  t¡tƒ}xN|D]F}x@|D]8}t|tƒrlt||ƒr€| |¡qHt||ƒrH| |¡qHWq>Wx|D]}| |¡qŽWx|D]}| |ƒ¡q¦Wx&|D]}t|tƒrÔ|ƒ}| |¡qÀW|S)NÚHTTPSConnection)rrr.r)rrr+r*r/r-r´rÐÚclientr\rEÚsetrÉrŠÚ issubclassÚaddÚremoverÂ)r¨rKZdefault_classesÚskipÚklassZcheckÚhrLrLrMr2?s0             c@s(eZdZdZdd„Zdd„Zdd„ZdS) riôcCs ||_dS)N)Úparent)rràrLrLrMr­fszBaseHandler.add_parentcCsdS)NrL)rrLrLrMrÃiszBaseHandler.closecCst|dƒsdS|j|jkS)NÚ handler_orderT)r´rá)rÚotherrLrLrMÚ__lt__ms zBaseHandler.__lt__N)r r¡r¢rár­rÃrãrLrLrLrMrcsc@seZdZdZdd„ZeZdS)r/iècCsH|j|j| ¡}}}d|kr,dksDn|j d|||||¡}|S)NéÈi,rÐ)ÚcodeÚmsgrUràr²)rrtr³råræržrLrLrMÚ http_responsezs z HTTPErrorProcessor.http_responseN)r r¡r¢rárçÚhttps_responserLrLrLrMr/vs c@seZdZdd„ZdS)rcCst|j||||ƒ‚dS)N)rro)rrÍrcråræržrLrLrMrÒˆsz*HTTPDefaultErrorHandler.http_error_defaultN)r r¡r¢rÒrLrLrLrMr‡sc@s4eZdZdZdZdd„Zdd„ZeZZZ dZ dS) réé c st| ¡}|dkr|dks:|dkr(|dks:t|j||||ƒ‚| dd¡}d‰‡fdd „|j ¡Dƒ}t|||jd d S) N)i-i.i/i3)rZHEAD)i-i.i/rŒú z%20)zcontent-lengthz content-typecs"i|]\}}| ¡ˆkr||“qSrL)rs)Ú.0ÚkÚv)ÚCONTENT_HEADERSrLrMú ®sz8HTTPRedirectHandler.redirect_request..T)rdr|r})rrroÚreplacerdrzrr|) rrÍrcrårærdÚnewurlÚmZ newheadersrL)rïrMr®“s  z$HTTPRedirectHandler.redirect_requestc CsLd|kr|d}nd|kr$|d}ndSt|ƒ}|jdkrRt||d||f||ƒ‚|jsn|jrnt|ƒ}d|d<t|ƒ}t|dtj d}t |j |ƒ}|  ||||||¡}|dkr²dSt |d ƒr|j} |_|  |d ¡|jksìt| ƒ|jkrt|j ||j|||ƒ‚ni} |_|_|  |d ¡d | |<| ¡| ¡|jj||jd S) NÚlocationÚuri)rÐr‘Úftprmz+%s - Redirection to url '%s' is not allowedú/r:z iso-8859-1)ÚencodingÚsafeÚ redirect_dictrrR)rJ)rÚschemerrWZnetlocrrr ÚstringZ punctuationrror®r´rúr˜Ú max_repeatsr_Úmax_redirectionsÚinf_msgr^rÃràrGrJ) rrÍrcrårærdròÚurlpartsÚnewZvisitedrLrLrMÚhttp_error_302¹s@        z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop. The last 30x error message was: N) r r¡r¢rýrþr®rÚhttp_error_301Úhttp_error_303Úhttp_error_307rÿrLrLrLrMr‹s &< c Cst|ƒ\}}| d¡s d}|}n:| d¡s6td|ƒ‚| dd¡}|dkrNd}|d|…}t|ƒ\}}|dk r|t|ƒ\}}nd}}||||fS)Nr÷z//zproxy URL with no authority: %rr:rQ)r r¸rBr·rr) ÚproxyrûZr_schemeÚ authorityÚendZuserinfoÚhostportÚuserÚpasswordrLrLrMÚ _parse_proxyüs       r c@s"eZdZdZddd„Zdd„ZdS)rédNcCsL|dkrtƒ}||_x2| ¡D]&\}}t|d||||jfdd„ƒqWdS)Nz%s_opencSs ||||ƒS)NrL)ÚrrrŠr¼rLrLrMÚ$sz'ProxyHandler.__init__..)r5ÚproxiesrzÚsetattrr°)rrrŠrHrLrLrMr‚s  zProxyHandler.__init__c Cs´|j}t|ƒ\}}}}|dkr"|}|jr6t|jƒr6dS|rv|rvdt|ƒt|ƒf} t |  ¡¡ d¡} |  dd| ¡t|ƒ}|  ||¡||ksš|dkrždS|j j ||j dSdS)Nz%s:%sÚasciizProxy-authorizationzBasic r‘)rJ)rŠr ruÚ proxy_bypassr Úbase64Ú b64encodeÚencodeÚdecoder{r’ràrGrJ) rrÍrrŠZ orig_typeZ proxy_typer r r Z user_passZcredsrLrLrMr°'s   zProxyHandler.proxy_open)N)r r¡r¢rár‚r°rLrLrLrMrs c@s6eZdZdd„Zdd„Zdd„Zd dd „Zd d „Zd S)r cCs i|_dS)N)Úpasswd)rrLrLrMr‚EszHTTPPasswordMgr.__init__cs`t|tƒr|g}|ˆjkr$iˆj|<x6dD].‰t‡‡fdd„|Dƒƒ}||fˆj||<q*WdS)N)TFc3s|]}ˆ |ˆ¡VqdS)N)Ú reduce_uri)rìÚu)Ú default_portrrLrMú Psz/HTTPPasswordMgr.add_password..)rÉrÊrÚtuple)rÚrealmrõr rÚ reduced_urirL)rrrMÚ add_passwordHs    zHTTPPasswordMgr.add_passwordc Cs`|j |i¡}xLdD]D}| ||¡}x2| ¡D]&\}}x|D]}| ||¡r<|SqdD]6}| ||¡}x$|jD]}| ||¡r|j|SqWqWdS)N)TF)rr+r!)rr"rr#rõrLrLrMr0¤s     z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r r¡r¢r‚r r/r0Ú __classcell__rLrL)r.rMr"s  c@sTeZdZe dej¡Zddd„Zdd„Zdd„Z d d „Z d d „Z d d„Z e Z e ZdS)r#z1(?:^|,)[ ]*([^ ,]+)[ ]+realm=(["']?)([^"']*)\2NcCs"|dkrtƒ}||_|jj|_dS)N)r rr )rZ password_mgrrLrLrMr‚Ász!AbstractBasicAuthHandler.__init__ccstd}xFtj |¡D]6}| ¡\}}}|dkr:t dtd¡||fVd}qW|sp|rb| ¡d}nd}|dfVdS)NF)ú"ú'zBasic Auth Realm was unquotedéTrrm)r#ÚrxÚfinditerÚgroupsr?r@Ú UserWarningÚsplit)rÚheaderZfound_challengeÚmorûr rrLrLrMÚ _parse_realmÇs z%AbstractBasicAuthHandler._parse_realmc Cs~| |¡}|sdSd}xL|D]D}x>| |¡D]0\}}| ¡dkrF|}q,|dk r,| |||¡Sq,WqW|dk rztd|fƒ‚dS)NÚbasiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allr<rsÚretry_http_basic_authrB) rÚauthreqrurÍrdZ unsupportedr:rûrrLrLrMÚhttp_error_auth_reqedÛs   z.AbstractBasicAuthHandler.http_error_auth_reqedcCs||j ||¡\}}|dk rtd||f}dt | ¡¡ d¡}| |jd¡|krTdS| |j|¡|j j ||j dSdSdS)Nz%s:%szBasic r)rJ) rr$rrrrrpÚ auth_headerr–ràrGrJ)rrurÍrr ÚpwÚrawÚauthrLrLrMr>õs z.AbstractBasicAuthHandler.retry_http_basic_authcCstt|jdƒr|j |j¡s|S| d¡sp|j d|j¡\}}d ||¡ ¡}t  |¡  ¡}|  dd |  ¡¡¡|S)Nr0Ú Authorizationz{0}:{1}zBasic {}) r´rr0rorˆr$r„rrZstandard_b64encoderr–Ústrip)rrÍr rZ credentialsZauth_strrLrLrMÚ http_requests  z%AbstractBasicAuthHandler.http_requestcCsLt|jdƒrHd|jkr"dkr8nn|j |jd¡n|j |jd¡|S)Nr0räi,TF)r´rrår/ro)rrÍr³rLrLrMrçs  z&AbstractBasicAuthHandler.http_response)N)r r¡r¢ÚreÚcompileÚIr5r‚r<r@r>rGrçÚ https_requestrèrLrLrLrMr#¬s   c@seZdZdZdd„ZdS)r$rEcCs|j}| d|||¡}|S)Nzwww-authenticate)ror@)rrÍrcrårærdrHr³rLrLrMÚhttp_error_401s z#HTTPBasicAuthHandler.http_error_401N)r r¡r¢rArLrLrLrLrMr$sc@seZdZdZdd„ZdS)r%zProxy-authorizationcCs|j}| d|||¡}|S)Nzproxy-authenticate)rur@)rrÍrcrårærdrr³rLrLrMÚhttp_error_407*s z$ProxyBasicAuthHandler.http_error_407N)r r¡r¢rArMrLrLrLrMr%&sc@sNeZdZddd„Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dS)r&NcCs4|dkrtƒ}||_|jj|_d|_d|_d|_dS)Nr)r rr ÚretriedÚ nonce_countÚ last_nonce)rrrLrLrMr‚Ds z"AbstractDigestAuthHandler.__init__cCs d|_dS)Nr)rN)rrLrLrMÚreset_retry_countMsz+AbstractDigestAuthHandler.reset_retry_countcCs|| |d¡}|jdkr*t|jdd|dƒ‚n|jd7_|rx| ¡d}| ¡dkr`| ||¡S| ¡dkrxtd|ƒ‚dS) Néi‘zdigest auth failedrRrZdigestr=zEAbstractDigestAuthHandler does not support the following scheme: '%s')r˜rNrror9rsÚretry_http_digest_authrB)rrArurÍrdr?rûrLrLrMr@Ps        z/AbstractDigestAuthHandler.http_error_auth_reqedcCsz| dd¡\}}ttdt|ƒƒƒ}| ||¡}|rvd|}|j |jd¡|krRdS| |j|¡|j j ||j d}|SdS)NrërRz Digest %s)rJ) r9Úparse_keqv_listÚfilterÚparse_http_listÚget_authorizationrdr˜rAr–ràrGrJ)rrÍrDÚtokenZ challengeÚchalZauth_valZresprLrLrMrSds z0AbstractDigestAuthHandler.retry_http_digest_authcCs@d|j|t ¡f}| d¡tdƒ}t |¡ ¡}|dd…S)Nz %s:%s:%s:réé)rOÚtimeZctimerÚ _randombytesÚhashlibÚsha1Ú hexdigest)rÚnonceÚsÚbÚdigrLrLrMÚ get_cnoncepsz$AbstractDigestAuthHandler.get_cnoncecCsÄy6|d}|d}| d¡}| dd¡}| dd¡}Wntk rJdSX| |¡\}} |dkrfdS|j ||j¡\} } | dkr†dS|jdk r | |j|¡} nd} d| || f} d| ¡|j f}|dkrè| || ƒd|||ƒfƒ}n~d |  d ¡krZ||j kr|j d 7_ n d |_ ||_ d |j }|  |¡}d |||d ||ƒf}| || ƒ|ƒ}n td|ƒ‚d| |||j |f}|rŒ|d|7}| rž|d| 7}|d|7}|rÀ|d||f7}|S)NrraÚqopÚ algorithmÚMD5Úopaquez%s:%s:%sz%s:%srDú,rRz%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z , opaque="%s"z , digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r˜ÚKeyErrorÚget_algorithm_implsrr$rorIÚget_entity_digestrr‡r9rPrOrer)rrÍrYrrarfrgriÚHÚKDr rBZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitr(rLrLrMrW{sV            z+AbstractDigestAuthHandler.get_authorizationcsD|dkrdd„‰n|dkr$dd„‰n td|ƒ‚‡fdd„}ˆ|fS)NrhcSst | d¡¡ ¡S)Nr)r^Zmd5rr`)ÚxrLrLrMr¼óz?AbstractDigestAuthHandler.get_algorithm_impls..ZSHAcSst | d¡¡ ¡S)Nr)r^r_rr`)rprLrLrMr¾rqz.Unsupported digest authentication algorithm %rcsˆd||fƒS)Nz%s:%srL)rbÚd)rnrLrMrÃrq)rB)rrgrorL)rnrMrl¹s   z-AbstractDigestAuthHandler.get_algorithm_implscCsdS)NrL)rrIrYrLrLrMrmÆsz+AbstractDigestAuthHandler.get_entity_digest)N) r r¡r¢r‚rQr@rSrerWrlrmrLrLrLrMr&9s   > c@seZdZdZdZdd„ZdS)r'rEiêcCs*t|jƒd}| d|||¡}| ¡|S)NrRzwww-authenticate)rror@rQ)rrÍrcrårærdruÚretryrLrLrMrLÕs  z$HTTPDigestAuthHandler.http_error_401N)r r¡r¢rArárLrLrLrLrMr'Ësc@seZdZdZdZdd„ZdS)r(zProxy-AuthorizationiêcCs"|j}| d|||¡}| ¡|S)Nzproxy-authenticate)rur@rQ)rrÍrcrårærdrursrLrLrMrMâs  z%ProxyDigestAuthHandler.http_error_407N)r r¡r¢rArárMrLrLrLrMr(Ýsc@s6eZdZd dd„Zdd„Zdd„Zdd „Zd d „Zd S)ÚAbstractHTTPHandlerrcCs ||_dS)N)Ú _debuglevel)rÚ debuglevelrLrLrMr‚ëszAbstractHTTPHandler.__init__cCs ||_dS)N)ru)rÚlevelrLrLrMÚset_http_debuglevelîsz'AbstractHTTPHandler.set_http_debuglevelcCstjj |j| ¡¡S)N)rÐrØÚHTTPConnectionÚ_get_content_lengthrIr)rrtrLrLrMrzñsz'AbstractHTTPHandler._get_content_lengthc Cs|j}|stdƒ‚|jdk r’|j}t|tƒr8d}t|ƒ‚| d¡sN| dd¡| d¡s’| d¡s’| |¡}|dk r†| dt|ƒ¡n | dd¡|}|  ¡r¸t |j ƒ\}}t |ƒ\}} | d¡sÎ| d|¡x2|j jD]&\} } |  ¡} | | ¡sØ| | | ¡qØW|S) Nz no host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.z Content-typez!application/x-www-form-urlencodedzContent-lengthzTransfer-encodingZchunkedrn)rurrIrÉrÊrµrˆr–rzr“r r‡r ràr§r”) rrtrurIræZcontent_lengthZsel_hostrûZselZsel_pathrZrrLrLrMÚ do_request_ös>          zAbstractHTTPHandler.do_request_c sT|j}|stdƒ‚||fd|ji|—Ž}| |j¡t|jƒ‰ˆ ‡fdd„|j  ¡Dƒ¡dˆd<dd„ˆ  ¡Dƒ‰|j r®i}d}|ˆkržˆ|||<ˆ|=|j |j |d y`y&|j |  ¡|j|jˆ| d ¡d Wn,tk r}z t|ƒ‚Wdd}~XYnX| ¡} Wn| ¡‚YnX|jr>|j ¡d|_| ¡| _| j| _| S) Nz no host givenrJcsi|]\}}|ˆkr||“qSrLrL)rìrírî)rdrLrMrð*sz/AbstractHTTPHandler.do_open..rÃÚ ConnectioncSsi|]\}}|| ¡“qSrL)Útitle)rìrZr•rLrLrMrð7szProxy-Authorization)rdzTransfer-encoding)Zencode_chunked)rurrJZset_debuglevelrurÔrwrœrdrzryZ set_tunnelrtrr‡rIrˆrlÚ getresponserÃZsockrrHÚreasonræ) rZ http_classrÍZhttp_conn_argsrurßZtunnel_headersZproxy_auth_hdrÚerrrrL)rdrMr¯s@       zAbstractHTTPHandler.do_openN)r)r r¡r¢r‚rxrzr{r¯rLrLrLrMrtés  &rtc@seZdZdd„ZejZdS)r)cCs| tjj|¡S)N)r¯rÐrØry)rrÍrLrLrMÚ http_openaszHTTPHandler.http_openN)r r¡r¢rrtr{rGrLrLrLrMr)_sr×c@s$eZdZddd„Zdd„ZejZdS)rErNcCst ||¡||_||_dS)N)rtr‚Ú_contextÚ_check_hostname)rrvr>Úcheck_hostnamerLrLrMr‚js zHTTPSHandler.__init__cCs|jtjj||j|jdS)N)r>r„)r¯rÐrØr×r‚rƒ)rrÍrLrLrMÚ https_openos zHTTPSHandler.https_open)rNN)r r¡r¢r‚r…rtr{rKrLrLrLrMrEhs rEc@s.eZdZddd„Zdd„Zdd„ZeZeZdS) rNcCs$ddl}|dkr|j ¡}||_dS)Nr)Zhttp.cookiejarÚ cookiejarZ CookieJar)rr†rÐrLrLrMr‚xs zHTTPCookieProcessor.__init__cCs|j |¡|S)N)r†Zadd_cookie_header)rrtrLrLrMrG~s z HTTPCookieProcessor.http_requestcCs|j ||¡|S)N)r†Zextract_cookies)rrtr³rLrLrMrç‚sz!HTTPCookieProcessor.http_response)N)r r¡r¢r‚rGrçrKrèrLrLrLrMrws  c@seZdZdd„ZdS)r.cCs|j}td|ƒ‚dS)Nzunknown url type: %s)rŠr)rrÍrŠrLrLrMrÏŠszUnknownHandler.unknown_openN)r r¡r¢rÏrLrLrLrMr.‰scCsRi}xH|D]@}| dd¡\}}|ddkrB|ddkrB|dd…}|||<q W|S)Nú=rRrr2rQ)r9)ÚlZparsedZeltrírîrLrLrMrTŽs   rTcCs¢g}d}d}}xt|D]l}|r,||7}d}q|rV|dkr@d}qn |dkrLd}||7}q|dkrn| |¡d}q|dkrzd}||7}qW|r”| |¡dd„|DƒS) NrmFú\Tr2rjcSsg|] }| ¡‘qSrL)rF)rìÚpartrLrLrMú Ász#parse_http_list..)r\)rbZresrŠÚescaper ZcurrLrLrMrV˜s4     rVc@s(eZdZdd„ZdZdd„Zdd„ZdS)r*cCs\|j}|dd…dkrN|dd…dkrN|jrN|jdkrN|j| ¡krXtdƒ‚n | |¡SdS)Nr:z//r4r÷Ú localhostz-file:// scheme is supported only on localhost)r‡ruÚ get_namesrÚopen_local_file)rrÍrHrLrLrMÚ file_openÅs &  zFileHandler.file_openNcCs`tjdkrZy*tt d¡dt t ¡¡dƒt_Wn$tjk rXt d¡ft_YnXtjS)Nrr:)r*ÚnamesrrÕÚgethostbyname_exÚ gethostnameÚgaierrorÚ gethostbyname)rrLrLrMrŽÐs  zFileHandler.get_namesc Csüddl}ddl}|j}|j}t|ƒ}y t |¡}|j}|jj |j dd} |  |¡d} |  d| pbd|| f¡} |r~t |ƒ\}} |r–| sÂt|ƒ| ¡krÂ|r¨d||} nd|} tt|dƒ| | ƒSWn*tk rî}z t|ƒ‚Wdd}~XYnXtdƒ‚dS) NrT)Úusegmtz6Content-type: %s Content-length: %d Last-modified: %s z text/plainzfile://Úrbzfile not on local host)Ú email.utilsÚ mimetypesrur‡r4rVÚstatÚst_sizeÚutilsÚ formatdateÚst_mtimeÚ guess_typeÚmessage_from_stringr Ú_safe_gethostbynamerŽrrGrlr)rrÍÚemailr™ruraZ localfileÚstatsrhÚmodifiedÚmtyperdr'ZorigurlÚexprLrLrMrÛs0  zFileHandler.open_local_file)r r¡r¢rr‘rŽrrLrLrLrMr*Ãs  cCs&y t |¡Stjk r dSXdS)N)rÕr•r”)rurLrLrMr¡ös r¡c@seZdZdd„Zdd„ZdS)r+c Cs,ddl}ddl}|j}|s"tdƒ‚t|ƒ\}}|dkr>|j}nt|ƒ}t|ƒ\}}|rdt|ƒ\}}nd}t |ƒ}|pvd}|p~d}yt   |¡}Wn*t k r¸}z t|ƒ‚Wdd}~XYnXt |jƒ\} } |  d¡} ttt | ƒƒ} | dd…| d} } | r| ds| dd…} yÐ| ||||| |j¡} | r6dp8d}x:| D]2}t|ƒ\}}| ¡d kr@|d kr@| ¡}q@W|  | |¡\}}d}| |j¡d}|r¬|d |7}|dk rÌ|dkrÌ|d |7}t |¡}t|||jƒS|jk r&}z"td |ƒ}| t  ¡d¡‚Wdd}~XYnXdS)Nrzftp error: no host givenrmr÷rQrRrJÚDrŠ)ÚaÚAr½rJrrr§zContent-type: %s zContent-length: %d z ftp error: %rr:)!Úftplibr™rurr ÚFTP_PORTr]rrr rÕr•rlrr‡r9rÚmapÚ connect_ftprJrrsÚupperÚretrfilerŸror¢r rÚ all_errorsÚwith_tracebackÚsysÚexc_info)rrÍrªr™rur'r rrærWÚattrsÚdirsrNÚfwrŠÚattrrrcÚretrlenrdr¥r¦ÚexcrLrLrMÚftp_openýs\           zFTPHandler.ftp_openc Cst||||||ddS)NF)Ú persistent)Ú ftpwrapper)rr rrur'rµrJrLrLrMr­2szFTPHandler.connect_ftpN)r r¡r¢rºr­rLrLrLrMr+üs5c@s<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)r,cCs"i|_i|_d|_d|_d|_dS)Nré<r[)ÚcacherJÚsoonestÚdelayÚ max_conns)rrLrLrMr‚9s zCacheFTPHandler.__init__cCs ||_dS)N)rÀ)rÚtrLrLrMÚ setTimeout@szCacheFTPHandler.setTimeoutcCs ||_dS)N)rÁ)rrórLrLrMÚ setMaxConnsCszCacheFTPHandler.setMaxConnscCsr|||d |¡|f}||jkr4t ¡|j|j|<n,t||||||ƒ|j|<t ¡|j|j|<| ¡|j|S)Nr÷)Újoinr¾r\rÀrJr¼Ú check_cache)rr rrur'rµrJr€rLrLrMr­Fs  zCacheFTPHandler.connect_ftpcCsÈt ¡}|j|krTx@t|j ¡ƒD].\}}||kr"|j| ¡|j|=|j|=q"Wtt|j ¡ƒƒ|_t |jƒ|j krÄx6t|j ¡ƒD]$\}}||jkrˆ|j|=|j|=PqˆWtt|j ¡ƒƒ|_dS)N) r\r¿rrJrzr¾rÃÚminÚvaluesr_rÁ)rrÂrírîrLrLrMrÆQs   zCacheFTPHandler.check_cachecCs4x|j ¡D] }| ¡q W|j ¡|j ¡dS)N)r¾rÈrÃÚclearrJ)rÚconnrLrLrMÚ clear_cachees  zCacheFTPHandler.clear_cacheN) r r¡r¢r‚rÃrÄr­rÆrËrLrLrLrMr,6s  c@seZdZdd„ZdS)r-cCs~|j}| dd¡\}}| dd¡\}}t|ƒ}| d¡rNt |¡}|dd…}|sVd}t d|t|ƒf¡}t t   |¡||ƒS)Nú:rRrjz;base64iùÿÿÿztext/plain;charset=US-ASCIIz$Content-type: %s Content-length: %d ) ror9rÚendswithrÚ decodebytesr¢r r_rÚioÚBytesIO)rrÍrHrûrIZ mediatyperdrLrLrMÚ data_openls    zDataHandler.data_openN)r r¡r¢rÑrLrLrLrMr-ksrêÚnt)r4r3cCst|ƒS)N)r )ÚpathnamerLrLrMr4’scCst|ƒS)N)r )rÓrLrLrMr3—sc@sÆeZdZdZdeZd)dd„Zdd„Zdd„Zd d „Z d d „Z d*d d„Z d+dd„Z d,dd„Z d-dd„Zdd„Zd.dd„Zd/dd„Zdd„Zer dd„Zd0dd „Zd!d"„Zd#d$„Zd%d&„Zd1d'd(„ZdS)2r8NzPython-urllib/%scKszdd|jji}tj|tdd|dkr.tƒ}||_| d¡|_| d¡|_ d|j fdg|_ g|_ t j|_d|_t|_dS) NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methodsÚclassr4)Ú stacklevelÚkey_fileÚ cert_filez User-Agent)ZAcceptz*/*)r.r r?r@rAr5rr˜rÖr×Úversionr§Ú_URLopener__tempfilesrVrkÚ_URLopener__unlinkÚ tempcacheÚftpcache)rrZx509rærLrLrMr‚­s  zURLopener.__init__cCs | ¡dS)N)rÃ)rrLrLrMÚ__del__ÇszURLopener.__del__cCs | ¡dS)N)Úcleanup)rrLrLrMrÃÊszURLopener.closec CsZ|jrFx2|jD](}y| |¡Wqtk r4YqXqW|jdd…=|jrV|j ¡dS)N)rÙrÚrlrÛrÉ)rrNrLrLrMrÞÍs   zURLopener.cleanupcGs|j |¡dS)N)r§r\)rrÆrLrLrMÚ addheaderÛszURLopener.addheaderc Csltt|ƒƒ}t|dd}|jrL||jkrL|j|\}}t|dƒ}t|||ƒSt|ƒ\}}|s`d}||jkr–|j|}t|ƒ\}} t| ƒ\} } | |f}nd}d|} ||_ |   dd¡} t || ƒrÆ| dkrä|rØ|  |||¡S|  ||¡Sy,|dkrþt|| ƒ|ƒSt|| ƒ||ƒSWnVttfk r,‚Yn<tk rf} ztd | ƒ t ¡d ¡‚Wdd} ~ XYnXdS) Nz%/:=&?~#+!$,;'@()*[]|)rùr—rNZopen_ú-r±rz socket errorr:)rrr rÛrGrr rr rŠrñr´Úopen_unknown_proxyÚ open_unknownrŽrrrlr±r²r³)rrÌrIrardrcÚurltyperHrÚ proxyhostrur‡rZrærLrLrMrGás<             zURLopener.opencCst|ƒ\}}tdd|ƒ‚dS)Nz url errorzunknown url type)r rl)rrÌrIrŠrHrLrLrMrâs zURLopener.open_unknowncCs t|ƒ\}}tdd||ƒ‚dS)Nz url errorzinvalid proxy for %s)r rl)rrrÌrIrŠrHrLrLrMrá s zURLopener.open_unknown_proxyc Cstt|ƒƒ}|jr&||jkr&|j|St|ƒ\}}|dkr˜|rF|dkr˜y.| |¡}| ¡}| ¡tt|ƒdƒ|fSt k r–} zWdd} ~ XYnX|  ||¡}z>| ¡} |rÀt |dƒ} nrt|ƒ\} } t| pÔdƒ\} } t | pädƒ\} } t | pôdƒ\} } t j | ¡d}t |¡\}}|j |¡t  |d¡} z¤|| f}|jdk rR||j|<d}d}d}d}d| krxt| d ƒ}|rŠ||||ƒxH| |¡}|sžP|t|ƒ7}|  |¡|d7}|rŒ||||ƒqŒWWd|  ¡XWd| ¡X|dkr||krtd ||f|ƒ‚|S) NrNrRrOrmi rQrzcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytes)rrrÛr rrUrÃr4r rlrGrrrVrWÚsplitextrYZmkstemprÙr\Úfdopenr]r^r_r`r)rrHrarbrIrŠZurl1rcržrærdreZgarbagerWÚsuffixÚfdrfrgrhr^rirjrLrLrMÚretrievesj                  zURLopener.retrievecCs(d}d}t|tƒrtd |ƒ‚tt|d ƒ| | ƒStd ƒ‚dS)NrT)r–z6Content-Type: %s Content-Length: %d Last-modified: %s z text/plainrRr÷zfile://r—r:z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r˜r™r r4rVršrlrÚstrerrorrar›rœrržrŸr rrGr rÕr•rÚthishostrB)rrHr¢r™rurNZ localnamer£Úerhr¤r¥rdZurlfiler'rLrLrMrÙs:     zURLopener.open_local_filec Cs’t|tƒstdƒ‚ddl}t|ƒ\}}|s2tdƒ‚t|ƒ\}}t|ƒ\}}|r\t|ƒ\}}nd}t|ƒ}t|ppdƒ}t|p|dƒ}t   |¡}|sžddl }|j }nt |ƒ}t|ƒ\}} t|ƒ}| d¡} | dd…| d} } | rò| dsò| dd…} | r | ds d| d<|||d | ¡f} t|jƒtkrfx8t|jƒD]*} | | kr8|j| }|j| =| ¡q8Wyæ| |jkrŠt||||| ƒ|j| <| s–d}nd }x:| D]2}t|ƒ\}}| ¡d kr |d kr | ¡}q W|j|  | |¡\}}| d |¡d}d}|r|d |7}|dk r4|dkr4|d|7}t |¡}t||d |ƒStƒk rŒ}ztd|ƒ  t! "¡d¡‚Wdd}~XYnXdS)NzCftp error: proxy support for ftp protocol currently not implementedrzftp error: no host givenrmr÷rQrRr§rJrŠ)r¨r©r½rJrrr§zftp:zContent-Type: %s zContent-Length: %d z ftp error %rr:)#rÉrÊrr™r r rrr rÕr•rªr«r]rr9rÅr_rÜÚ MAXFTPCACHErrÃr¼rrsr®r¯rŸr¢r rÚ ftperrorsr±r²r³)rrHr™rurWr'r rrªr´rµrNr€rírîrŠr·rrcr¸r¥rdr¦rLrLrMÚopen_ftpùsp                   zURLopener.open_ftpc Cs<t|tƒstdƒ‚y| dd¡\}}Wntk rDtddƒ‚YnX|sNd}| d¡}|dkrŽd ||d…krŽ||dd…}|d|…}nd }g}| d t  d t  t ¡¡¡¡| d |¡|dkrät   |  d¡¡ d¡}nt|ƒ}| dt|ƒ¡| d ¡| |¡d |¡}t |¡}t |¡}t|||ƒS)NzEdata error: proxy support for data protocol currently not implementedrjrRz data errorz bad data URLztext/plain;charset=US-ASCIIú;rr‡rmzDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %srrzlatin-1zContent-Length: %dÚ )rÉrÊrr9rBrlÚrfindr\r\ZstrftimeZgmtimerrÎrrr r_rÅr¢r rÏÚStringIOr) rrHrIrŠZsemirørærdÚfrLrLrMÚ open_data3s6        zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r r¡r¢rÙr¦rØr‚rÝrÃrÞrßrGrârárérìrírërÒrCrðrñrórrùrÿrLrLrLrMr8 s,  $   A\     :c@sšeZdZdd„Zdd„Zd"dd„Zdd „Zd#d d „Zd$d d „Zd%dd„Z d&dd„Z d'dd„Z d(dd„Z d)dd„Z d*dd„Zd+dd„Zd,dd„Zd d!„ZdS)-r9cOs(tj|f|ž|Ži|_d|_d|_dS)Nrrê)r8r‚Ú auth_cacheÚtriesÚmaxtries)rrÆr-rLrLrMr‚`szFancyURLopener.__init__cCst||d||ƒS)Nzhttp:)r)rrHrcrîrïrdrLrLrMrÒfsz!FancyURLopener.http_error_defaultNc Csn|jd7_zR|jrJ|j|jkrJt|dƒr4|j}n|j}|||dd|ƒS| ||||||¡}|Sd|_XdS)NrRÚhttp_error_500iôz)Internal Server Error: Redirect Recursionr)rrr´rrÒÚredirect_internal) rrHrcrîrïrdrIr¼rfrLrLrMrjs  zFancyURLopener.http_error_302c Csxd|kr|d}nd|kr$|d}ndS| ¡t|jd||ƒ}t|ƒ}|jdkrnt|||d|||ƒ‚| |¡S)NrôrõrÌ)rÐr‘rörmz( Redirection to url '%s' is not allowed.)rÃrrŠrrûrrG) rrHrcrîrïrdrIròrrLrLrMr|s   z FancyURLopener.redirect_internalcCs| ||||||¡S)N)r)rrHrcrîrïrdrIrLrLrMr˜szFancyURLopener.http_error_301cCs| ||||||¡S)N)r)rrHrcrîrïrdrIrLrLrMrœszFancyURLopener.http_error_303cCs2|dkr| ||||||¡S| |||||¡SdS)N)rrÒ)rrHrcrîrïrdrIrLrLrMr szFancyURLopener.http_error_307Fc CsÈd|krt ||||||¡|d}t d|¡} | sHt ||||||¡|  ¡\} } |  ¡dkrtt ||||||¡|sŒt ||||||¡d|jd} |dkr²t|| ƒ|| ƒSt|| ƒ|| |ƒSdS)Nzwww-authenticatez![ ]*([^ ]+)[ ]+realm="([^"]*)"r=Zretry_Ú _basic_auth)r8rÒrHÚmatchr7rsrŠrŽ) rrHrcrîrïrdrIrsÚstuffrrûrrZrLrLrMrL§s&         zFancyURLopener.http_error_401c CsÈd|krt ||||||¡|d}t d|¡} | sHt ||||||¡|  ¡\} } |  ¡dkrtt ||||||¡|sŒt ||||||¡d|jd} |dkr²t|| ƒ|| ƒSt|| ƒ|| |ƒSdS)Nzproxy-authenticatez![ ]*([^ ]+)[ ]+realm="([^"]*)"r=Z retry_proxy_r)r8rÒrHrr7rsrŠrŽ) rrHrcrîrïrdrIrsrrrûrrZrLrLrMrMÀs&         zFancyURLopener.http_error_407cCsÄt|ƒ\}}d||}|jd}t|ƒ\}} t| ƒ\} } |  d¡d} | | d…} | | || ¡\} } | sr| srdSdt| ddt| dd| f} d| | |jd<|dkr´| |¡S| ||¡SdS)Nzhttp://rÐú@rRz%s:%s@%srm)rù)r rr r·Úget_user_passwdr rG)rrHrrIrur‡ròrrãräÚ proxyselectorr½r rrLrLrMÚretry_proxy_http_basic_authÙs         z*FancyURLopener.retry_proxy_http_basic_authcCsÄt|ƒ\}}d||}|jd}t|ƒ\}} t| ƒ\} } |  d¡d} | | d…} | | || ¡\} } | sr| srdSdt| ddt| dd| f} d| | |jd<|dkr´| |¡S| ||¡SdS)Nzhttps://r‘rrRz%s:%s@%srm)rù)r rr r·r r rG)rrHrrIrur‡ròrrãrär r½r rrLrLrMÚretry_proxy_https_basic_authës         z+FancyURLopener.retry_proxy_https_basic_authc Cst|ƒ\}}| d¡d}||d…}| |||¡\}}|sD|sDdSdt|ddt|dd|f}d||} |dkr€| | ¡S| | |¡SdS)NrrRz%s:%s@%srm)rùzhttp://)r r·r r rG) rrHrrIrur‡r½r rròrLrLrMr>ýs     z$FancyURLopener.retry_http_basic_authc Cst|ƒ\}}| d¡d}||d…}| |||¡\}}|sD|sDdSdt|ddt|dd|f}d||} |dkr€| | ¡S| | |¡SdS)NrrRz%s:%s@%srm)rùzhttps://)r r·r r rG) rrHrrIrur‡r½r rròrLrLrMÚretry_https_basic_auth s     z%FancyURLopener.retry_https_basic_authrcCs`|d| ¡}||jkr2|r(|j|=n |j|S| ||¡\}}|sJ|rX||f|j|<||fS)Nr)rsrÚprompt_user_passwd)rrurrËr€r rrLrLrMr  s   zFancyURLopener.get_user_passwdcCsTddl}y,td||fƒ}| d|||f¡}||fStk rNtƒdSXdS)NrzEnter username for %s at %s: z#Enter password for %s in %s at %s: )NN)ÚgetpassÚinputÚKeyboardInterruptÚprint)rrurrr rrLrLrMr$ sz!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r)r r¡r¢r‚rÒrrrrrrLrMr r r>r r rrLrLrLrMr9]s"           cCstdkrt d¡atS)Nr)Ú _localhostrÕr•rLrLrLrMr4 s rcCsPtdkrLytt t ¡¡dƒaWn(tjk rJtt d¡dƒaYnXtS)Nr:r)Ú _thishostrrÕr’r“r”rLrLrLrMrõ< s rõcCstdkrddl}|jatS)Nr)Ú _ftperrorsrªr°)rªrLrLrMrøG srøcCstdkrt d¡atS)Nrm)Ú _noheadersr¢r rLrLrLrMÚ noheadersP s rc@sFeZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„Zdd„Z dS)r¼NTcCsX||_||_||_||_||_||_d|_||_y | ¡Wn|  ¡‚YnXdS)Nr) r rrur'rµrJÚrefcountÚ keepaliveÚinitrÃ)rr rrur'rµrJr»rLrLrMr‚] s zftpwrapper.__init__cCs\ddl}d|_| ¡|_|j |j|j|j¡|j |j |j ¡d  |j ¡}|j  |¡dS)Nrr÷)rªÚbusyZFTPröZconnectrur'rJZloginr rrÅrµÚcwd)rrªZ_targetrLrLrMrm s  zftpwrapper.initc Cs¶ddl}| ¡|dkr"d}d}n d|}d}y|j |¡Wn*|jk rh| ¡|j |¡YnXd}|ræ|sæyd|}|j |¡\}}WnR|jk rä}z2t|ƒdd…dkrÔt d |ƒ  t   ¡d ¡‚Wdd}~XYnX|s€|j d¡|rl|j  ¡} zJy|j |¡Wn4|jk rN}zt d |ƒ|‚Wdd}~XYnXWd|j | ¡Xd |}nd }|j |¡\}}d|_t| d ¡|jƒ} |jd7_| ¡| |fS)Nr)rrr§zTYPE ArRzTYPE zRETR r4Z550z ftp error: %rr:zLIST ZLISTr—)rªÚ endtransferröZvoidcmdr°rZ ntransfercmdZ error_permrÊrr±r²r³ÚpwdrrrZmakefileÚ file_closerrÃ) rrNrŠrªÚcmdÚisdirrÊr¸rrZftpobjrLrLrMr¯v sN    $ zftpwrapper.retrfilecCs d|_dS)Nr)r)rrLrLrMr£ szftpwrapper.endtransfercCsd|_|jdkr| ¡dS)NFr)rrÚ real_close)rrLrLrMræ s zftpwrapper.closecCs2| ¡|jd8_|jdkr.|js.| ¡dS)NrRr)rrrr")rrLrLrMr« szftpwrapper.file_closecCs2| ¡y|j ¡Wntƒk r,YnXdS)N)rrörÃrø)rrLrLrMr"± s zftpwrapper.real_close)NT) r r¡r¢r‚rr¯rrÃrr"rLrLrLrMr¼Z s  -r¼cCs¼i}xBtj ¡D]4\}}| ¡}|r|dd…dkr|||dd…<qWdtjkr^| dd¡xXtj ¡D]J\}}|dd…dkrj| ¡}|r |||dd…<qj| |dd…d¡qjW|S)NiúÿÿÿÚ_proxyZREQUEST_METHODrÐ)rVÚenvironrzrsrš)rrZrrLrLrMÚgetproxies_environment¹ s   r%cCsº|dkrtƒ}y |d}Wntk r.dSX|dkr|dd>B|dd>B|d BS) Nr(rérérRr[r:rZr4)r9rr¬r]r_)ZipAddrr&rLrLrMÚip2num s   z,_proxy_bypass_macosx_sysconf..ip2numr(Zexclude_simpleTÚ exceptionsrLz(\d+(?:\.\d+)*)(/\d+)?rRr:rZé F) r,r r˜rHrrÕr•rlÚgroupÚcountr]) ruÚproxy_settingsr,r*r'r.ZhostIPrrór(ÚmaskrLrLrMÚ_proxy_bypass_macosx_sysconfý s:        r5Údarwin)Ú_get_proxy_settingsÚ _get_proxiescCstƒ}t||ƒS)N)r7r5)rur3rLrLrMÚproxy_bypass_macosx_sysconf< sr9cCstƒS)N)r8rLrLrLrMÚgetproxies_macosx_sysconf@ sr:cCs tƒ}|rt||ƒSt|ƒSdS)N)r%r+r9)rurrLrLrMrJ s rcCs tƒp tƒS)N)r%r:rLrLrLrMr5W sc Csi}y ddl}Wntk r$|SXyÎ| |jd¡}| |d¡d}|rêt| |d¡dƒ}d|kr¬x‚| d¡D]4}| dd¡\}}t d|¡sžd ||f}|||<qrWn>|dd …d krÆ||d <n$d ||d <d||d<d||d<|  ¡Wnt t t fk rYnX|S)Nrz;Software\Microsoft\Windows\CurrentVersion\Internet SettingsÚ ProxyEnableZ ProxyServerr‡rúrRz (?:[^/:]+)://z%s://%srRzhttp:rÐz http://%sz https://%sr‘zftp://%srö) ÚwinregÚ ImportErrorÚOpenKeyÚHKEY_CURRENT_USERÚ QueryValueExrÊr9rHrZCloserlrBrµ)rr<ÚinternetSettingsÚ proxyEnableZ proxyServerÚpr¾ZaddressrLrLrMÚgetproxies_registry\ s8          rDcCs tƒp tƒS)N)r%rDrLrLrLrMr5‰ sc Csxy ddl}Wntk r dSXy6| |jd¡}| |d¡d}t| |d¡dƒ}Wntk rldSX|rv|szdSt|ƒ\}}|g}y t  |¡}||krª|  |¡Wntk rÀYnXy t  |¡}||krà|  |¡Wntk röYnX|  d¡}xp|D]h} | dkr$d|kr$dS|   dd ¡} |   d d ¡} |   d d¡} x$|D]} t | | tj¡rNdSqNWqWdS) Nrz;Software\Microsoft\Windows\CurrentVersion\Internet Settingsr;Z ProxyOverriderúzr(rRz\.r'z.*ú?)r<r=r>r?r@rÊrlr rÕr•r\Zgetfqdnr9rñrHrrJ) rur<rArBZ proxyOverrideZrawHostr'ZaddrZfqdnr)r•rLrLrMÚproxy_bypass_registry’ sR             rFcCs tƒ}|rt||ƒSt|ƒSdS)N)r%r+rF)rurrLrLrMrÄ s )NNN)N)}rrºr¢r^Z http.clientrÐrÏrVÚ posixpathrHrÕrür²r\rYrSr?Z urllib.errorrrrZ urllib.parserrrrr r r r r rrrrrrrrrZurllib.responserrrDr=rCÚ__all__Ú version_infor¦rFrÖr0r1r[r6r7rIÚASCIIrqrvrrr2rr/rrr rr r!r"r#r$r%Úurandomr]r&r'r(rtr)r´rØrEr\rr.rTrVr*r¡r+r,r-r÷rZZ nturl2pathr4r3rÜr8r9rrrrõrrørrr¼r%r+r5ÚplatformZ_scproxyr7r8r9r:rr5rDrFrLrLrLrMÚTsèP   T ?n$q*@ o  v  +3:5! @W  _ %<    - 2