Your IP : 172.28.240.42


Current Path : /usr/lib/python2.7/
Upload File :
Current File : //usr/lib/python2.7/urllib.pyc


|_c@sdZddlZddlZddlZddlZddlZddlZddlmZ	dddddd	d
ddd
ddddddddddddddddddgZ
d Zd!Zej
d"krdd#lmZmZn:ej
d$krdd#lmZmZnd%Zd&Zeaeed'Zeeed(Zd)ZyddlZWn
eZnXeZd*efd+YZiZdfd,YZdefd-YZea d.Z!ea"d/Z#ea$d0Z%ea&d1Z'd2fd3YZ(d4fd5YZ)d6e)fd7YZ*d8e)fd9YZ+d:e)fd;YZ,ye-Wne.k
rd<Z/n
Xd=Z/d>Z0d?Z1ea2d@Z3ea4dAZ5ea6dBZ7ea8dCZ9ea:dDZ;ea<ddEZ=ea>dFZ?ea@dGZAdHZBeaCdIZDdJZEeFdKeEDZGdLZHdMZIdNZJiZKxfeLeMdOeNeOeMdOD]=\ZPZQePdPkoeQeJkreQndQjRePeKeQ<qWiZSdRdSZTdTdUZUdVdWZVdXZWedYZXejYdZkrfdd[lZm[Z[m\Z\d\Z]d]Z^d^Z_d_Z`nBej
d"krd`ZadaZ`dbZbdcZ_neWZ`eXZ_ddZcdeZddS(fsOpen an arbitrary URL.

See the following document for more info on URLs:
"Names and Addresses, URIs, URLs, URNs, URCs", at
http://www.w3.org/pub/WWW/Addressing/Overview.html

See also the HTTP spec (from which the error codes are derived):
"HTTP - Hypertext Transfer Protocol", at
http://www.w3.org/pub/WWW/Protocols/

Related standards and specs:
- RFC1808: the "relative URL" spec. (authoritative status)
- RFC1738 - the "URL standard". (authoritative status)
- RFC1630 - the "URI spec". (informational status)

The object returned by URLopener().open(file) will differ per
protocol.  All you know is that is has methods read(), readline(),
readlines(), fileno(), close() and info().  The read*(), fileno()
and close() methods work like those of open files.
The info() method returns a mimetools.Message object which can be
used to query various info about the object, if available.
(mimetools.Message objects are queried with the getheader() method.)
iN(turljointurlopent	URLopenertFancyURLopenerturlretrievet
urlcleanuptquotet
quote_plustunquotetunquote_plust	urlencodeturl2pathnametpathname2urltsplittagt	localhosttthishostt	ftperrorstbasejointunwrapt	splittypet	splithostt	splitusertsplitpasswdt	splitportt
splitnportt
splitqueryt	splitattrt
splitvaluet
getproxiess1.17i
tnt(RRtriscoscCs
t|S(sOS-specific conversion from a relative URL of the 'file' scheme
        to a file system path; not recommended for general use.(R(tpathname((s/usr/lib/python2.7/urllib.pyR4scCs
t|S(sOS-specific conversion from a file system path to a relative URL
        of the 'file' scheme; not recommended for general use.(R(R((s/usr/lib/python2.7/urllib.pyR9scCsddlm}|ddd|dk	r>td|}ntsVt}|ant}|dkru|j|S|j||SdS(s=Create a file-like object for the specified URL to read from.i(twarnpy3ksMurllib.urlopen() has been removed in Python 3.0 in favor of urllib2.urlopen()t
stacklevelitproxiesN(twarningsR tNoneRt
_urlopenertopen(turltdataR"R topener((s/usr/lib/python2.7/urllib.pyRGs			
cCs(tstantj||||S(N(R%Rtretrieve(R'tfilenamet
reporthookR(((s/usr/lib/python2.7/urllib.pyRYscCs+trtjntjtjdS(N(R%tcleanupt
_safe_quoterstcleartftpcache(((s/usr/lib/python2.7/urllib.pyR^s

tContentTooShortErrorcBseZdZRS(cCstj||||_dS(N(tIOErrort__init__tcontent(tselftmessageR4((s/usr/lib/python2.7/urllib.pyR3ns(t__name__t
__module__R3(((s/usr/lib/python2.7/urllib.pyR1mscBseZdZdZdeZddZdZdZ	dZ
dZddZddZ
dd	Zdddd
ZddZddZd
ZerddZndZdZdZddZRS(s,Class to open URLs.
    This is a class rather than just a subroutine because we may need
    more than one set of global protocol-specific options.
    Note -- this is a base class for those who don't want the
    automatic handling of errors type 302 (relocated) and 401
    (authorization needed).sPython-urllib/%scKs|dkrt}nt|ds3td||_|jd|_|jd|_d|jfg|_	g|_
tj|_
d|_t|_dS(Nthas_keysproxies must be a mappingtkey_filet	cert_files
User-Agent(R$RthasattrtAssertionErrorR"tgetR:R;tversiont
addheaderst_URLopener__tempfilestostunlinkt_URLopener__unlinkt	tempcacheR0(R5R"tx509((s/usr/lib/python2.7/urllib.pyR3s			cCs|jdS(N(tclose(R5((s/usr/lib/python2.7/urllib.pyt__del__scCs|jdS(N(R-(R5((s/usr/lib/python2.7/urllib.pyRGscCsi|jrLx6|jD]+}y|j|Wqtk
r=qXqW|j2n|jre|jjndS(N(RARDtOSErrorRER/(R5tfile((s/usr/lib/python2.7/urllib.pyR-s	

	cGs|jj|dS(sdAdd a header to be used by the HTTP interface only
        e.g. u.addheader('Accept', 'sound/basic')N(R@tappend(R5targs((s/usr/lib/python2.7/urllib.pyt	addheaderscCstt|}t|dd}|jrn||jkrn|j|\}}t|d}t|||St|\}}|sd}n||jkr|j|}t|\}}	t|	\}
}|
|f}nd}d|}||_
|jdd}t||s1|t
kr]|dkr]|rJ|j|||S|j||Sny9|dkrt|||St||||SWn2tjk
r}
td	|
ftjd
nXdS(s6Use URLopener().open(file) instead of open(file, 'r').tsafes%/:=&?~#+!$,;'@()*[]|trbRJtopen_t-t_topen_local_filessocket erroriN(RttoBytesRRER&t
addinfourlRR"RR$ttypetreplaceR<R%topen_unknown_proxytopen_unknowntgetattrtsocketterrorR2tsystexc_info(R5tfullurlR(R+theaderstfpturltypeR'tproxyt	proxyhostthosttselectortnametmsg((s/usr/lib/python2.7/urllib.pyR&s:	

	cCs(t|\}}tdd|fdS(s/Overridable interface to open unknown URL type.s	url errorsunknown url typeN(RR2(R5R_R(RVR'((s/usr/lib/python2.7/urllib.pyRYscCs,t|\}}tdd||fdS(s/Overridable interface to open unknown URL type.s	url errorsinvalid proxy for %sN(RR2(R5RcR_R(RVR'((s/usr/lib/python2.7/urllib.pyRXsc
Cstt|}|jr5||jkr5|j|St|\}}|dkr|sf|dkryC|j|}|j}|jtt	|d|fSWqt
k
rqXn|j||}z|j}	|rt|d}
nddl}t|\}}
t	|
p#d\}}
t
|
p;d\}
}t|
pSd\}
}tjj|
d}|j|\}}|jj|tj|d}
z||	f}|jdk	r||j|<nd
}d}d	}d	}d
|	krt|	d}n|r*||||nxb|j|}|dkrLPn|t|7}|
j||d7}|r-||||q-q-Wd|
jXWd|jX|d	kr||krtd||f|n|S(stretrieve(url) returns (filename, headers) for a local object
        or (tempfilename, headers) for a remote object.RJitwbiNtiiiscontent-lengthsContent-Lengths1retrieval incomplete: got only %i out of %i bytesi (RRTRERR$RStinfoRGRRR2R&ttempfileRRRBtpathtsplitexttmkstempRARKtfdopentinttreadtlentwriteR1(R5R'R+R,R(RVturl1RathdrsR`ttfpRltgarbageRmtsuffixtfdtresulttbstsizeRrtblocknumtblock((s/usr/lib/python2.7/urllib.pyR*sj



cCs=ddl}d}d}t|trit|\}}|r`t|\}}t|}n|}n|\}}t|\}}t|\}	}
|
}d}|	jdkrd}n^t|
\}}
|rt|\}}n|r	d|	||
f}nt	|r|}n|s0t
dn|rZt|}tj|j
}nd}|rt|}tj|j
}nd}|j|}
|dk	r|
jd||
jdd	|
jd
dt|n|
jd||r|
jd
d|n|r2|
jdd|n|rK|
jd|nx|jD]}|
j|qUW|
j||
j\}}}|
j}|dkr|r|jnt
dnd|kodknrt||d||S|dkr|j|||||S|j||||||SdS(sUse HTTP protocol.iNthttps	%s://%s%ss
http errors
no host giventPOSTsContent-Types!application/x-www-form-urlencodedsContent-Lengths%dtGETsProxy-AuthorizationsBasic %st
AuthorizationtHostshttp protocol errorisgot a bad status lineii,shttp:(s
http errors
no host given(shttp protocol errorisgot a bad status lineN(thttplibR$t
isinstancetstrRRRRtlowertproxy_bypassR2tbase64t	b64encodetstriptHTTPt
putrequestt	putheaderRsR@t
endheaderstgetreplytgetfileRGRUt
http_error(R5R'R(Rtuser_passwdtproxy_passwdReRftrealhostRbtrestt
proxy_authtauththRLterrcodeterrmsgR`Ra((s/usr/lib/python2.7/urllib.pyt	open_http$sx			

	c
Csd|}t||rwt||}|dkrO||||||}	n|||||||}	|	rw|	Sn|j|||||S(sHandle http errors.
        Derived class can override this, or provide specific handlers
        named http_error_DDD where DDD is the 3-digit error code.s
http_error_%dN(R<RZR$thttp_error_default(
R5R'RaRRR`R(RgtmethodR{((s/usr/lib/python2.7/urllib.pyRms
cCs#|jtd|||fdS(s>Default error handler: close the connection and raise IOError.s
http errorN(RGR2(R5R'RaRRR`((s/usr/lib/python2.7/urllib.pyR|s
cCs=ddl}d}d}t|trit|\}}|r`t|\}}t|}n|}n|\}}t|\}}t|\}	}
|
}d}|	jdkrd}nIt|
\}}
|rt|\}}n|r	d|	||
f}n|st	dn|rEt|}t
j|j}nd}|rut|}t
j|j}nd}|j
|dd|jd	|j}
|dk	r|
jd
||
jdd|
jd
dt|n|
jd||r|
jdd|n|r2|
jdd|n|rK|
jd|nx|jD]}|
j|qUW|
j||
j\}}}|
j}|dkr|r|jnt	dnd|kodknrt||d||S|dkr|j|||||S|j||||||SdS(sUse HTTPS protocol.iNthttpss	%s://%s%sshttps errors
no host giveniR:R;RsContent-Types!application/x-www-form-urlencodedsContent-Lengths%dRsProxy-AuthorizationsBasic %sRRshttp protocol errorsgot a bad status lineii,shttps:(shttps errors
no host given(shttp protocol errorisgot a bad status lineN(RR$RRRRRRRR2RRRtHTTPSR:R;RRRsR@RRRRGRUR(R5R'R(RRRReRfRRbRRRRRLRRR`Ra((s/usr/lib/python2.7/urllib.pyt
open_httpss|				

	cCsut|tstd
n|d dkrd|dd!dkrd|dd!jdkrd|j|S|j|Sd	S(s/Use local file or FTP depending on form of URL.s
file errors9proxy support for file protocol currently not implementedis//it/is
localhost/N(s
file errors9proxy support for file protocol currently not implemented(RRR2Rtopen_ftpRS(R5R'((s/usr/lib/python2.7/urllib.pyt	open_files
<
cCsddl}ddl}ddl}yddlm}Wn!tk
r[ddlm}nXt|\}}t|}ytj	|}	Wn.t
k
r}
t|
j|
j
|
jnX|	j}|jj|	jdt}|j|d}
|j|d|
p
d||f}|s|}|d d	krFd
|}n#|d dkritd
|ntt|d||St|\}}|rtj|ttfkr|}|d d	krd
|}ntt|d||StddS(sUse local file.iN(tStringIOtusegmtis6Content-Type: %s
Content-Length: %d
Last-modified: %s
s
text/plainiRsfile://is./sAlocal file url may start with / or file:. Unknown url of type: %sROslocal file errorsnot on local host(slocal file errorsnot on local host(t	mimetypest	mimetoolstemail.utilst	cStringIORtImportErrorRRRBtstatRIR2terrnotstrerrorR+tst_sizetutilst
formatdatetst_mtimetTruet
guess_typetMessaget
ValueErrorRUR&RR[t
gethostbynameRR(R5R'RRtemailRReRJt	localnametstatsteR}tmodifiedtmtypeR`turlfiletport((s/usr/lib/python2.7/urllib.pyRSsD$
		

!

c
Cst|tstdnddl}ddl}yddlm}Wn!tk
rjddlm}nXt|\}}|stdnt	|\}}t
|\}}|rt|\}}	nd}	t
|}|pd}|	pd}	tj|}|s%ddl}
|
j}nt|}t|\}}t
|}|jd}|d |d}}
|r|d	r|d
}n|r|d	rd|d	<n|||dj|f}t|jtkr,xJ|jjD]6}||kr|j|}|j|=|jqqWny?||jkr`t||	||||j|<n|
sod}nd}xM|D]E}t|\}}|jd
kr||dkr||j}q|q|W|j|j|
|\}}|j d|d	}d}|r|d|7}n|dk	rA|d	krA|d|7}n|j!||}t"||d|SWn2t#k
r}td|ft$j%dnXdS(sUse FTP protocol.s	ftp errors8proxy support for ftp protocol currently not implementediN(Rs
no host givenRjRiitDtIRVtatAtitdsftp:sContent-Type: %s
sContent-Length: %d
i(s	ftp errors8proxy support for ftp protocol currently not implemented(s	ftp errors
no host given(RRRRRR(&RRR2RRRRRRRRRR$RR[RtftplibtFTP_PORTRqRtsplittjoinRsR0tMAXFTPCACHEtkeysRGt
ftpwrapperRRtuppertretrfileRRRURR]R^(R5R'RRRReRmRtusertpasswdRtattrstdirsRJtkeytktvRVtattrtvalueRatretrlenRR`Rh((s/usr/lib/python2.7/urllib.pyRsx




"	
cCst|tstdnddl}yddlm}Wn!tk
r^ddlm}nXy|jdd\}}Wntk
rtdnX|sd	}n|j	d
}|dkrd||kr||d}|| }nd
}g}|j
dtjdtj
tj|j
d||dkrTtj|}nt|}|j
dt||j
d
|j
|dj|}||}	|j|	d}
t|	|
|S(sUse "data" URL.s
data errors9proxy support for data protocol currently not implementediN(Rt,isbad data URLstext/plain;charset=US-ASCIIt;it=RjsDate: %ss%a, %d %b %Y %H:%M:%S GMTsContent-type: %sRsContent-Length: %ds
(s
data errors9proxy support for data protocol currently not implemented(s
data errorsbad data URL(RRR2RRRRRRtrfindRKttimetstrftimetgmtimeRtdecodestringRRsRRRU(R5R'R(RRRVtsemitencodingRhtfR`((s/usr/lib/python2.7/urllib.pyt	open_data6s@


	


N(R7R8t__doc__R$RAt__version__R?R3RHRGR-RMR&RYRXR*RRRt	_have_sslRRRSRR(((s/usr/lib/python2.7/urllib.pyRss*
				'AI	H			%	>cBseZdZdZdZddZdZddZddZ	ddZ
ddZdd	Zdd
Z
ddZddZdd
ZddZdZRS(s?Derived class with handlers for errors we can handle (perhaps).cOs2tj|||i|_d|_d|_dS(Nii
(RR3t
auth_cachettriestmaxtries(R5RLtkwargs((s/usr/lib/python2.7/urllib.pyR3gs		cCst||d||S(s3Default error handling -- don't raise an exception.shttp:(RU(R5R'RaRRR`((s/usr/lib/python2.7/urllib.pyRmsc	Cs|jd7_|jrm|j|jkrmt|drE|j}n	|j}d|_|||dd|S|j||||||}d|_|S(s%Error 302 -- relocated (temporarily).ithttp_error_500iis)Internal Server Error: Redirect Recursion(RRR<RRtredirect_internal(	R5R'RaRRR`R(tmethR{((s/usr/lib/python2.7/urllib.pythttp_error_302qs		
		c	Csd|kr|d}nd|kr2|d}ndS|jt|jd||}|j}|jdp|jdp|jdstd||d||n|j|S(	Ntlocationturit:shttp://shttps://sftp://sredirect errors) - Redirection to url '%s' is not allowed(RGRRVRt
startswithR2R&(	R5R'RaRRR`R(tnewurltnewurl_lower((s/usr/lib/python2.7/urllib.pyRs 


	cCs|j||||||S(s*Error 301 -- also relocated (permanently).(R(R5R'RaRRR`R(((s/usr/lib/python2.7/urllib.pythttp_error_301scCs|j||||||S(s;Error 303 -- also relocated (essentially identical to 302).(R(R5R'RaRRR`R(((s/usr/lib/python2.7/urllib.pythttp_error_303scCsE|dkr(|j||||||S|j|||||SdS(s1Error 307 -- relocated, but turn POST into error.N(R$RR(R5R'RaRRR`R(((s/usr/lib/python2.7/urllib.pythttp_error_307sc
Csd|kr+tj||||||n|d}ddl}|jd|}	|	sxtj||||||n|	j\}
}|
jdkrtj||||||nd|jd}|dkrt||||St|||||SdS(s_Error 401 -- authentication required.
        This function supports Basic authentication only.swww-authenticateiNs![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"tbasictretry_t_basic_auth(	RRtretmatchtgroupsRRVR$RZ(
R5R'RaRRR`R(tstuffRRtschemetrealmRg((s/usr/lib/python2.7/urllib.pythttp_error_401s"
c
Csd|kr+tj||||||n|d}ddl}|jd|}	|	sxtj||||||n|	j\}
}|
jdkrtj||||||nd|jd}|dkrt||||St|||||SdS(seError 407 -- proxy authentication required.
        This function supports Basic authentication only.sproxy-authenticateiNs![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"Rtretry_proxy_R(	RRRRRRRVR$RZ(
R5R'RaRRR`R(RRRRRRg((s/usr/lib/python2.7/urllib.pythttp_error_407s"
cCs	t|\}}d||}|jd}t|\}}	t|	\}	}
|	jdd}|	|}	|j|	||\}}
|p|
sdSt|dddt|
ddd|	}	d|	|
|jd<|dkr|j|S|j||SdS(Nshttp://Rt@iRNRjR(RR"Rtfindtget_user_passwdR$RR&(R5R'RR(ReRfRRcRbRdt
proxyselectorRRR((s/usr/lib/python2.7/urllib.pytretry_proxy_http_basic_auths

.
cCs	t|\}}d||}|jd}t|\}}	t|	\}	}
|	jdd}|	|}	|j|	||\}}
|p|
sdSt|dddt|
ddd|	}	d|	|
|jd<|dkr|j|S|j||SdS(Nshttps://RRiRNRjR(RR"RRRR$RR&(R5R'RR(ReRfRRcRbRdR	RRR((s/usr/lib/python2.7/urllib.pytretry_proxy_https_basic_auths

.
c
Cst|\}}|jdd}||}|j|||\}}|pS|sZdSt|dddt|ddd|}d||}	|dkr|j|	S|j|	|SdS(NRiRNRjRshttp://(RRRR$RR&(
R5R'RR(ReRfRRRR((s/usr/lib/python2.7/urllib.pytretry_http_basic_auths
.
c
Cst|\}}|jdd}||}|j|||\}}|pS|sZdSt|dddt|ddd|}d||}	|dkr|j|	S|j|	|SdS(NRiRNRjRshttps://(RRRR$RR&(
R5R'RR(ReRfRRRR((s/usr/lib/python2.7/urllib.pytretry_https_basic_auths
.
icCs|d|j}||jkrD|r6|j|=qD|j|Sn|j||\}}|sh|r~||f|j|<n||fS(NR(RRtprompt_user_passwd(R5ReRtclear_cacheRRR((s/usr/lib/python2.7/urllib.pyRs
cCsfddl}y@td||f}|jd|||f}||fSWntk
raHdSXdS(s#Override this in a GUI environment!iNsEnter username for %s at %s: s#Enter password for %s in %s at %s: (NN(tgetpasst	raw_inputtKeyboardInterruptR$(R5ReRRRR((s/usr/lib/python2.7/urllib.pyRs	
	
N(R7R8RR3RR$RRRRRRRR
RRR
RR(((s/usr/lib/python2.7/urllib.pyRds 			

cCs"tdkrtjdantS(s8Return the IP address of the magic hostname 'localhost'.RN(t
_localhostR$R[R(((s/usr/lib/python2.7/urllib.pyR,scCs(tdkr$tjtjantS(s*Return the IP address of the current host.N(t	_thishostR$R[Rtgethostname(((s/usr/lib/python2.7/urllib.pyR4scCs(tdkr$ddl}|jantS(s1Return the set of errors raised by the FTP class.iN(t
_ftperrorsR$Rt
all_errors(R((s/usr/lib/python2.7/urllib.pyR<scCsytdkruddl}yddlm}Wn!tk
rOddlm}nX|j|datjjntS(s)Return an empty mimetools.Message object.iN(Ri(	t
_noheadersR$RRRRRRaRG(RR((s/usr/lib/python2.7/urllib.pyt	noheadersEs
RcBsVeZdZejedZdZdZdZ	dZ
dZdZRS(s;Class used by open_ftp() for cache of open FTP connections.cCsV||_||_||_||_||_||_d|_||_|jdS(Ni(	RRReRRttimeouttrefcountt	keepalivetinit(R5RRReRRRt
persistent((s/usr/lib/python2.7/urllib.pyR3Xs								cCsddl}d|_|j|_|jj|j|j|j|jj|j	|j
x!|jD]}|jj|qfWdS(Nii(
RtbusytFTPtftptconnectReRRtloginRRRtcwd(R5Rtdir((s/usr/lib/python2.7/urllib.pyRes	cCsddl}|j|dkr1d}d}nd|}d}y|jj|Wn.|jk
r|j|jj|nXd}|r|ry&d|}|jj|\}}Wq|jk
r}t	|d	 d
kr
t
d|ftjdq
qXn|s|jjd|r|jj
}	zMy|jj|Wn2|jk
r}t
d|ftjdnXWd|jj|	Xd
|}nd}|jj|\}}nd|_t|jd|j}
|jd7_|j|
|fS(NiRRsTYPE AisTYPE isRETR it550s	ftp errorisLIST tLISTRO(RR(RtendtransferR!tvoidcmdRRR$tntransfercmdt
error_permRR2R]R^tpwdR$Rtaddclosehooktmakefilet
file_closeRRG(R5RJRVRtcmdtisdirtconnRtreasonR,tftpobj((s/usr/lib/python2.7/urllib.pyRnsL
	



&$
	
cCsB|js
dSd|_y|jjWntk
r=nXdS(Ni(RR!tvoidrespR(R5((s/usr/lib/python2.7/urllib.pyR(s		cCs)t|_|jdkr%|jndS(Ni(tFalseRRt
real_close(R5((s/usr/lib/python2.7/urllib.pyRGs	cCsC|j|jd8_|jdkr?|jr?|jndS(Nii(R(RRR7(R5((s/usr/lib/python2.7/urllib.pyR/s
cCs6|jy|jjWntk
r1nXdS(N(R(R!RGR(R5((s/usr/lib/python2.7/urllib.pyR7s

(
R7R8RR[t_GLOBAL_DEFAULT_TIMEOUTRR3RRR(RGR/R7(((s/usr/lib/python2.7/urllib.pyRUs			+				taddbasecBs)eZdZdZdZdZRS(s(Base class for addinfo and addclosehook.cCs||_|jj|_|jj|_t|jdrK|jj|_nt|jdro|jj|_nd|_t|jdr|jj|_t|jdr|jj|_qndS(Nt	readlinestfilenocSsdS(N(R$(((s/usr/lib/python2.7/urllib.pyt<lambda>st__iter__tnext(RaRrtreadlineR<R:R;R=R>(R5Ra((s/usr/lib/python2.7/urllib.pyR3s	cCs d|jjt||jfS(Ns<%s at %r whose fp = %r>(t	__class__R7tidRa(R5((s/usr/lib/python2.7/urllib.pyt__repr__scCsJd|_d|_d|_d|_|jr=|jjnd|_dS(N(R$RrR?R:R;RaRG(R5((s/usr/lib/python2.7/urllib.pyRGs					(R7R8RR3RBRG(((s/usr/lib/python2.7/urllib.pyR9s		R-cBs eZdZdZdZRS(s*Class to add a close hook to an open file.cGs&tj||||_||_dS(N(R9R3t	closehookthookargs(R5RaRCRD((s/usr/lib/python2.7/urllib.pyR3s	cCs?tj||jr;|j|jd|_d|_ndS(N(R9RGRCRDR$(R5((s/usr/lib/python2.7/urllib.pyRGs

		(R7R8RR3RG(((s/usr/lib/python2.7/urllib.pyR-s	taddinfocBs eZdZdZdZRS(s.class to add an info() method to an open file.cCstj||||_dS(N(R9R3R`(R5RaR`((s/usr/lib/python2.7/urllib.pyR3scCs|jS(N(R`(R5((s/usr/lib/python2.7/urllib.pyRks(R7R8RR3Rk(((s/usr/lib/python2.7/urllib.pyREs	RUcBs5eZdZddZdZdZdZRS(s9class to add info() and geturl() methods to an open file.cCs/tj||||_||_||_dS(N(R9R3R`R'tcode(R5RaR`R'RF((s/usr/lib/python2.7/urllib.pyR3s		cCs|jS(N(R`(R5((s/usr/lib/python2.7/urllib.pyRkscCs|jS(N(RF(R5((s/usr/lib/python2.7/urllib.pytgetcodescCs|jS(N(R'(R5((s/usr/lib/python2.7/urllib.pytgeturlsN(R7R8RR$R3RkRGRH(((s/usr/lib/python2.7/urllib.pyRUs
		cCsdS(Ni((tx((s/usr/lib/python2.7/urllib.pyt_is_unicodescCs
t|tS(N(Rtunicode(RI((s/usr/lib/python2.7/urllib.pyRJscCsTt|rPy|jd}WqPtk
rLtdt|dqPXn|S(stoBytes(u"URL") --> 'URL'.tASCIIsURL s contains non-ASCII characters(RJtencodetUnicodeErrortrepr(R'((s/usr/lib/python2.7/urllib.pyRTs
cCsi|j}|d dkrB|ddkrB|dd!j}n|d dkre|dj}n|S(s8unwrap('<URL:type://host/path>') --> 'type://host/path'.it<it>isURL:(R(R'((s/usr/lib/python2.7/urllib.pyR!s cCsvtdkr*ddl}|jdantj|}|rl|jd}|j|t|dfSd|fS(s:splittype('type:opaquestring') --> 'type', 'opaquestring'.iNs
^([^/:]+):i(t	_typeprogR$RtcompileRtgroupRRs(R'RRR((s/usr/lib/python2.7/urllib.pyR*scCstdkr0ddl}|jd|jantj|}|r|jd}|jd}|r|jdrd|}n||fSd|fS(s;splithost('//host[:port]/path') --> 'host[:port]', '/path'.iNs//([^/#?]*)(.*)iiR(t	_hostprogR$RRStDOTALLRRTR(R'RRt	host_portRm((s/usr/lib/python2.7/urllib.pyR8s

cCsYtdkr*ddl}|jdantj|}|rO|jddSd|fS(sJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.iNs^(.*)@(.*)$ii(t	_userprogR$RRSRRT(ReRR((s/usr/lib/python2.7/urllib.pyRIscCs_tdkr0ddl}|jd|jantj|}|rU|jddS|dfS(s/splitpasswd('user:passwd') -> 'user', 'passwd'.iNs^([^:]*):(.*)$ii(t_passwdprogR$RRStSRRT(RRR((s/usr/lib/python2.7/urllib.pyRUscCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s*splitport('host:port') --> 'host', 'port'.iNs^(.*):([0-9]+)$ii(t	_portprogR$RRSRRT(ReRR((s/usr/lib/python2.7/urllib.pyRbscCstdkr*ddl}|jdantj|}|r|jdd\}}y"|sltdnt|}Wntk
rd}nX||fS||fS(sSplit host and port, returning numeric port.
    Return given default port if no ':' found; defaults to -1.
    Return numerical port if a valid number are found after ':'.
    Return None if ':' but not a valid number.iNs^(.*):(.*)$iis	no digits(t
_nportprogR$RRSRRTRRq(RetdefportRRRtnport((s/usr/lib/python2.7/urllib.pyRns


cCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s/splitquery('/path?query') --> '/path', 'query'.iNs^(.*)\?([^?]*)$ii(t
_queryprogR$RRSRRT(R'RR((s/usr/lib/python2.7/urllib.pyRscCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s)splittag('/path#tag') --> '/path', 'tag'.iNs^(.*)#([^#]*)$ii(t_tagprogR$RRSRRT(R'RR((s/usr/lib/python2.7/urllib.pyR
scCs!|jd}|d|dfS(sksplitattr('/path;attr1=value1;attr2=value2;...') ->
        '/path', ['attr1=value1', 'attr2=value2', ...].Rii(R(R'twords((s/usr/lib/python2.7/urllib.pyRscCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s-splitvalue('attr=value') --> 'attr', 'value'.iNs^([^=]*)=(.*)$ii(t
_valueprogR$RRSRRT(RRR((s/usr/lib/python2.7/urllib.pyRst0123456789ABCDEFabcdefccs?|]5}tD](}||tt||dfVq
qdS(iN(t_hexdigtchrRq(t.0Rtb((s/usr/lib/python2.7/urllib.pys	<genexpr>scCs|jd}t|dkr%|S|d}x|dD]{}y|t|d |d7}Wq:tk
r|d|7}q:tk
r|tt|d d|d7}q:Xq:W|S(s"unquote('abc%20def') -> 'abc def'.t%iiii(RRst	_hextochrtKeyErrortUnicodeDecodeErrortunichrRq(tstrestitem((s/usr/lib/python2.7/urllib.pyRs


-cCs|jdd}t|S(s%unquote('%7e/abc+def') -> '~/abc def't+t (RWR(Rm((s/usr/lib/python2.7/urllib.pyR	ssAABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-iis%{:02X}RcCs|s%|dkr!tdn|S|tf}yt|\}}Wnftk
rtj}|jg|D]}||f^qn|j}t|}||ft|<nX|j	|s|Sdj
t||S(squote('abc def') -> 'abc%20def'

    Each part of a URL, e.g. the path info, the query, etc., has a
    different set of reserved characters that must be quoted.

    RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists
    the following reserved characters.

    reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                  "$" | ","

    Each of these characters is reserved in some component of a URL,
    but not necessarily in all of them.

    By default, the quote function is intended for quoting the path
    section of a URL.  Thus, it will not encode '/'.  This character
    is reserved, but in typical usage the quote function is being
    called on a path where the existing slash characters are used as
    reserved characters.
    sNone object cannot be quotedRjN(R$t	TypeErrortalways_safeR.Rjt	_safe_maptcopytupdatet__getitem__trstripRtmap(RmRNtcachekeytquotertsafe_maptc((s/usr/lib/python2.7/urllib.pyRs 
&	
RjcCs<d|kr/t||d}|jddSt||S(s9Quote the query fragment of a URL; replacing ' ' with '+'RqRp(RRW(RmRN((s/usr/lib/python2.7/urllib.pyRsic	Cst|dr|j}nby-t|rJt|dtrJtnWn2tk
rtj\}}}td|nXg}|sxc|D]E\}}tt	|}tt	|}|j
|d|qWnx|D]\}}tt	|}t|t	r7t|}|j
|d|qt|rst|jdd}|j
|d|qyt|Wn8tk
rtt	|}|j
|d|qXx/|D]'}|j
|dtt	|qWqWdj
|S(svEncode a sequence of two-element tuples or dictionary into a URL query string.

    If any values in the query arg are sequences and doseq is true, each
    sequence element is converted to a separate parameter.

    If the query arg is a sequence of two-element tuples, the order of the
    parameters in the output will match the order of parameters in the
    input.
    titemsis1not a valid non-string sequence or mapping objectRRLRWt&(R<R~RsRttupleRrR]R^RRRKRJRMR(	tquerytdoseqttytvattbtlRRtelt((s/usr/lib/python2.7/urllib.pyR
s< 



)cCsi}xPtjjD]?\}}|j}|r|ddkr|||d <qqWdtjkr{|jddnxgtjjD]V\}}|ddkr|j}|r|||d <q|j|d dqqW|S(sReturn a dictionary of scheme -> proxy server URL mappings.

    Scan the environment for variables named <scheme>_proxy;
    this seems to be the standard convention.  In order to prefer lowercase
    variables, we process the environment in two passes, first matches any
    and second matches only lower case proxies.

    If you need a different way, you can pass a proxies dictionary to the
    [Fancy]URLopener constructor.
    it_proxytREQUEST_METHODRN(RBtenvironR~RtpopR$(R"RgR((s/usr/lib/python2.7/urllib.pytgetproxies_environment@scCs|dkrt}ny|d}Wntk
r:dSX|dkrKdSt|\}}g|jdD]}|j^qm}x6|D].}|r|j|s|j|rdSqWdS(sTest if proxies should not be used for a particular host.

    Checks the proxies dict for the value of no_proxy, which should be a
    list of comma separated DNS suffixes, or '*' for all hosts.
    tnoit*iRN(R$RRjRRRtendswith(ReR"tno_proxythostonlyRRct
no_proxy_listRg((s/usr/lib/python2.7/urllib.pytproxy_bypass_environmentds
(
$tdarwin(t_get_proxy_settingst_get_proxiesc
Csddl}ddl}ddlm}t|\}}d}t}d|kri|dritSnd}x'|jdd
D]}	|	sqn|jd|	}
|
dk	r|dkry|j	|}||}Wq|j
k
rqqXn||
jd	}|
jd
}|dkrMd|
jd	jdd	}nt
|d	}d|}||?||?krtSq|||	rtSqWtS(s
        Return True iff this host shouldn't be accessed using a proxy

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        iN(tfnmatchcSsy|jd}tt|}t|dkrM|ddddgd }n|dd>|dd>B|dd>B|d	BS(
Nt.iiiiiiii(RRyRqRs(tipAddrtparts((s/usr/lib/python2.7/urllib.pytip2nums
Rtexclude_simplet
exceptionss(\d+(?:\.\d+)*)(/\d+)?iiii ((RR[RRRRR$R>RRR\RTtcountRqR6(
ReRR[RRRRtproxy_settingsthostIPRtmtbasetmask((s/usr/lib/python2.7/urllib.pytproxy_bypass_macosx_sysconfs@		

#
cCstS(sReturn a dictionary of scheme -> proxy server URL mappings.

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        (R(((s/usr/lib/python2.7/urllib.pytgetproxies_macosx_sysconfscCs*t}|rt||St|SdS(sReturn True, if a host should be bypassed.

        Checks proxy settings gathered from the environment, if specified, or
        from the MacOSX framework SystemConfiguration.
        N(RRR(ReR"((s/usr/lib/python2.7/urllib.pyRs	
cCstptS(N(RR(((s/usr/lib/python2.7/urllib.pyRsc	Csmi}yddl}Wntk
r*|SXy!|j|jd}|j|dd}|rAt|j|dd}d|krx|jdD]Y}|jdd	\}}ddl}|jd
|sd||f}n|||<qWqA|d d
kr||d<qAd||d<d||d<d||d<n|j	Wnt
ttfk
rhnX|S(sxReturn a dictionary of scheme -> proxy server URL mappings.

        Win32 uses the registry to store proxies.

        iNs;Software\Microsoft\Windows\CurrentVersion\Internet SettingstProxyEnableitProxyServerRRis^([^/:]+)://s%s://%sishttp:Rs	http://%ss
https://%sRsftp://%sR!(
t_winregRtOpenKeytHKEY_CURRENT_USERtQueryValueExRRRRtClosetWindowsErrorRRr(	R"RtinternetSettingstproxyEnabletproxyServertptprotocoltaddressR((s/usr/lib/python2.7/urllib.pytgetproxies_registrys:
		

cCstptS(sReturn a dictionary of scheme -> proxy server URL mappings.

        Returns settings gathered from the environment, if specified,
        or the registry.

        (RR(((s/usr/lib/python2.7/urllib.pyRscCsyddl}ddl}Wntk
r0dSXyK|j|jd}|j|dd}t|j|dd}Wntk
rdSX|s|rdSt|\}}|g}y/t	j
|}||kr|j|nWnt	jk
rnXy/t	j
|}	|	|kr2|j|	nWnt	jk
rInX|jd}x|D]}
|
dkrd|krd	Sn|
jdd
}
|
jdd}
|
jd
d}
x*|D]"}|j|
||jrd	SqWq`WdS(Niis;Software\Microsoft\Windows\CurrentVersion\Internet SettingsRt
ProxyOverrideRs<local>Ris\.Rs.*t?(RRRRRRRRRR[RRKR\tgetfqdnRRWRR(ReRRRRt
proxyOverridetrawHostRtaddrtfqdnttesttval((s/usr/lib/python2.7/urllib.pytproxy_bypass_registrysT
		

	

cCs*t}|rt||St|SdS(sReturn True, if the host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.
        N(RRR(ReR"((s/usr/lib/python2.7/urllib.pyR@s	
cCsd}x$tdD]}|t|}qW|d}tj}t|}t|}tj}||kr{dGHnt|GHt|GHt|GHt||dGdGHdS(NRjiisWrong!itsec(trangeReRRRROtround(RmRtt0tqstuqstt1((s/usr/lib/python2.7/urllib.pyttest1Rs
cCsd|||fGHdS(Ns0Block number: %d, Block size: %d, Total size: %d((R~t	blocksizet	totalsize((s/usr/lib/python2.7/urllib.pyR,bs(eRtstringR[RBRR]RturlparseRRt__all__RRRgt
nturl2pathRRt
rourl2pathR$R%RRRtsslR6RRR2R1R0RRRRRRRRRRRR9R-RERURKt	NameErrorRJRTRRRRRURRXRRYRR[RR\RR_RR`R
RRbRRdtdictRiRR	RsRttziptxrangeRt	bytearrayRR}tformatR.RRR
RRtplatformt_scproxyRRRRRRRRRR,(((s/usr/lib/python2.7/urllib.pyt<module>s			
	
				_
"

				
									
		45'@	$	;			.			4