support overriding how to open unknown url types
This commit is contained in:
parent
92d0932025
commit
ca44540bc8
@ -19,7 +19,7 @@ import socket
|
|||||||
import regex
|
import regex
|
||||||
|
|
||||||
|
|
||||||
__version__ = '1.1'
|
__version__ = '1.2'
|
||||||
|
|
||||||
|
|
||||||
# This really consists of two pieces:
|
# This really consists of two pieces:
|
||||||
@ -94,20 +94,26 @@ class URLopener:
|
|||||||
|
|
||||||
# External interface
|
# External interface
|
||||||
# Use URLopener().open(file) instead of open(file, 'r')
|
# Use URLopener().open(file) instead of open(file, 'r')
|
||||||
def open(self, url):
|
def open(self, fullurl):
|
||||||
type, url = splittype(unwrap(url))
|
fullurl = unwrap(fullurl)
|
||||||
|
type, url = splittype(fullurl)
|
||||||
if not type: type = 'file'
|
if not type: type = 'file'
|
||||||
name = 'open_' + type
|
name = 'open_' + type
|
||||||
if '-' in name:
|
if '-' in name:
|
||||||
import regsub
|
import regsub
|
||||||
name = regsub.gsub('-', '_', name)
|
name = regsub.gsub('-', '_', name)
|
||||||
if not hasattr(self, name):
|
if not hasattr(self, name):
|
||||||
raise IOError, ('url error', 'unknown url type', type)
|
return self.open_unknown(fullurl)
|
||||||
try:
|
try:
|
||||||
return getattr(self, name)(url)
|
return getattr(self, name)(url)
|
||||||
except socket.error, msg:
|
except socket.error, msg:
|
||||||
raise IOError, ('socket error', msg)
|
raise IOError, ('socket error', msg)
|
||||||
|
|
||||||
|
# Overridable interface to open unknown URL type
|
||||||
|
def open_unknown(self, fullurl):
|
||||||
|
type, url = splittype(fullurl)
|
||||||
|
raise IOError, ('url error', 'unknown url type', type)
|
||||||
|
|
||||||
# External interface
|
# External interface
|
||||||
# retrieve(url) returns (filename, None) for a local object
|
# retrieve(url) returns (filename, None) for a local object
|
||||||
# or (tempfilename, headers) for a remote object
|
# or (tempfilename, headers) for a remote object
|
||||||
@ -209,10 +215,10 @@ class URLopener:
|
|||||||
|
|
||||||
# Use local file or FTP depending on form of URL
|
# Use local file or FTP depending on form of URL
|
||||||
def open_file(self, url):
|
def open_file(self, url):
|
||||||
try:
|
if url[:2] == '//':
|
||||||
return self.open_local_file(url)
|
|
||||||
except IOError:
|
|
||||||
return self.open_ftp(url)
|
return self.open_ftp(url)
|
||||||
|
else:
|
||||||
|
return self.open_local_file(url)
|
||||||
|
|
||||||
# Use local file
|
# Use local file
|
||||||
def open_local_file(self, url):
|
def open_local_file(self, url):
|
||||||
@ -442,12 +448,6 @@ class addbase:
|
|||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '<%s at %s whose fp = %s>' % (
|
return '<%s at %s whose fp = %s>' % (
|
||||||
self.__class__.__name__, `id(self)`, `self.fp`)
|
self.__class__.__name__, `id(self)`, `self.fp`)
|
||||||
# Removed this __del__ because it can't work like this. If a
|
|
||||||
# reference is kept to self.fp or any of its methods, but no reference
|
|
||||||
# is kept to self, we don't want to close self.fp (which would happen
|
|
||||||
# if this __del__ still existed).
|
|
||||||
# def __del__(self):
|
|
||||||
# self.close()
|
|
||||||
def close(self):
|
def close(self):
|
||||||
self.read = None
|
self.read = None
|
||||||
self.readline = None
|
self.readline = None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user