Commit 83e06528 authored by Guido van Rossum's avatar Guido van Rossum

support overriding how to open unknown url types

parent 6a1b96b7
...@@ -19,7 +19,7 @@ import socket ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment