Convert Unicode strings to byte strings before passing them into specific

protocols. Closes bug #119822.
This commit is contained in:
Martin v. Löwis 2000-12-03 18:30:10 +00:00
parent 57657bce94
commit 1d99433a58
1 changed files with 25 additions and 14 deletions

View File

@ -26,9 +26,9 @@ import string
import socket
import os
import sys
import types
__version__ = '1.13' # XXX This version is not always updated :-(
__version__ = '1.14' # XXX This version is not always updated :-(
MAXFTPCACHE = 10 # Trim the ftp cache beyond this size
@ -136,23 +136,23 @@ class URLopener:
# External interface
def open(self, fullurl, data=None):
"""Use URLopener().open(file) instead of open(file, 'r')."""
fullurl = unwrap(fullurl)
fullurl = unwrap(toBytes(fullurl))
if self.tempcache and self.tempcache.has_key(fullurl):
filename, headers = self.tempcache[fullurl]
fp = open(filename, 'rb')
return addinfourl(fp, headers, fullurl)
type, url = splittype(fullurl)
if not type:
type = 'file'
if self.proxies.has_key(type):
proxy = self.proxies[type]
type, proxyhost = splittype(proxy)
urltype, url = splittype(fullurl)
if not urltype:
urltype = 'file'
if self.proxies.has_key(urltype):
proxy = self.proxies[urltype]
urltype, proxyhost = splittype(proxy)
host, selector = splithost(proxyhost)
url = (host, fullurl) # Signal special case to open_*()
else:
proxy = None
name = 'open_' + type
self.type = type
name = 'open_' + urltype
self.type = urltype
if '-' in name:
# replace - with _
name = string.join(string.split(name, '-'), '_')
@ -183,7 +183,7 @@ class URLopener:
def retrieve(self, url, filename=None, reporthook=None, data=None):
"""retrieve(url) returns (filename, None) for a local object
or (tempfilename, headers) for a remote object."""
url = unwrap(url)
url = unwrap(toBytes(url))
if self.tempcache and self.tempcache.has_key(url):
return self.tempcache[url]
type, url1 = splittype(url)
@ -238,7 +238,7 @@ class URLopener:
"""Use HTTP protocol."""
import httplib
user_passwd = None
if type(url) is type(""):
if type(url) is types.StringType:
host, selector = splithost(url)
if host:
user_passwd, host = splituser(host)
@ -313,7 +313,7 @@ class URLopener:
"""Use HTTPS protocol."""
import httplib
user_passwd = None
if type(url) is type(""):
if type(url) in types.StringTypes:
host, selector = splithost(url)
if host:
user_passwd, host = splituser(host)
@ -852,6 +852,17 @@ def basejoin(base, url):
# unquote('abc%20def') -> 'abc def'
# quote('abc def') -> 'abc%20def')
def toBytes(url):
"""toBytes(u"URL") --> 'URL'."""
# Most URL schemes require ASCII. If that changes, the conversion
# can be relaxed
if type(url) is types.UnicodeType:
try:
url = url.encode("ASCII")
except UnicodeError:
raise UnicodeError("URL "+repr(url)+" contains non-ASCII characters")
return url
def unwrap(url):
"""unwrap('<URL:type://host/path>') --> 'type://host/path'."""
url = string.strip(url)