Added proxy handling; upped version.

(Proxy handling uses <proto>_proxy environment variables by default.)
This commit is contained in:
Guido van Rossum 1996-03-20 15:33:11 +00:00
parent bb653772f5
commit 442e7202f8
1 changed files with 44 additions and 8 deletions

View File

@ -20,7 +20,7 @@ import regex
import os
__version__ = '1.2' # XXXX Should I update this number? -- jack
__version__ = '1.3'
# Helper for non-unix systems
if os.name == 'mac':
@ -33,6 +33,7 @@ if os.name == 'mac':
if tp and tp <> 'file':
raise RuntimeError, 'Cannot convert non-local URL to pathname'
components = string.split(pathname, '/')
# Remove . and embedded ..
i = 0
while i < len(components):
if components[i] == '.':
@ -45,13 +46,16 @@ if os.name == 'mac':
del components[i]
else:
i = i+1
if not components or '..' in components or '.' in components or '' in components[1:-1]:
raise RuntimeError, 'Cannot normalize URL containing ., .. or // to pathname'
if not components[0]:
# Absolute unix path, don't start with colon
return string.join(components[1:], ':')
else:
# relative unix path, start with colon
# relative unix path, start with colon. First replace
# leading .. by empty strings (giving ::file)
i = 0
while i < len(components) and components[i] == '..':
components[i] = ''
i = i + 1
return ':' + string.join(components, ':')
def pathname2url(pathname):
@ -59,8 +63,10 @@ if os.name == 'mac':
if '/' in pathname:
raise RuntimeError, "Cannot convert pathname containing slashes"
components = string.split(pathname, ':')
if '' in components[1:-1]:
raise RuntimeError, "Cannot convert pathname containing ::"
# Replace empty string ('::') by .. (will result in '/../' later)
for i in range(1, len(components)):
if components[i] == '':
components[i] = '..'
# Truncate names longer than 31 bytes
components = map(lambda x: x[:31], components)
@ -108,7 +114,10 @@ ftpcache = {}
class URLopener:
# Constructor
def __init__(self):
def __init__(self, proxies=None):
if proxies is None:
proxies = getproxies()
self.proxies = proxies
server_version = "Python-urllib/%s" % __version__
self.addheaders = [('User-agent', server_version)]
self.tempcache = None
@ -150,6 +159,11 @@ class URLopener:
fullurl = unwrap(fullurl)
type, url = splittype(fullurl)
if not type: type = 'file'
if self.proxies.has_key(type):
proxy = self.proxies[type]
type, proxy = splittype(proxy)
host, selector = splithost(proxy)
url = (host, fullurl) # Signal special case to open_*()
name = 'open_' + type
if '-' in name:
import regsub
@ -206,7 +220,11 @@ class URLopener:
# Use HTTP protocol
def open_http(self, url):
import httplib
host, selector = splithost(url)
if type(url) is type(""):
host, selector = splithost(url)
else:
host, selector = url
print "proxy via http:", host, selector
if not host: raise IOError, ('http error', 'no host given')
i = string.find(host, '@')
if i >= 0:
@ -672,6 +690,24 @@ def quote(s, safe = '/'):
res = res + '%%%02x' % ord(c)
return res
# Proxy handling
def getproxies():
"""Return a dictionary of protocol scheme -> proxy server URL mappings.
Scan the environment for variables named <scheme>_proxy;
this seems to be the standard convention. If you need a
different way, you can pass a proxies dictionary to the
[Fancy]URLopener constructor.
"""
proxies = {}
for name, value in os.environ.items():
if value and name[-6:] == '_proxy':
proxies[name[:-6]] = value
return proxies
# Test and time quote() and unquote()
def test1():
import time