Index: Lib/urllib.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/urllib.py,v retrieving revision 1.136 diff -u -r1.136 urllib.py --- Lib/urllib.py 11 Feb 2002 18:06:21 -0000 1.136 +++ Lib/urllib.py 5 Mar 2002 10:19:11 -0000 @@ -25,6 +25,7 @@ import string import socket import os +import os.path import stat import time import sys @@ -428,7 +429,7 @@ urlfile = file if file[:1] == '/': urlfile = 'file://' + file - return addinfourl(open(localname, 'rb'), + return addinfourldefer(localname, headers, urlfile) raise IOError, ('local file error', 'not on local host') @@ -823,6 +824,70 @@ def geturl(self): return self.url + + +class addinfourldefer: + """defers opening the file until read() etc. is called.""" + + def __init__(self, filename, headers, url): + self.filename = os.path.abspath(filename) # this protects against call to os.chdir + self.headers = headers + self.url = url + self.fp = None + + def close(self): + del self.read + del self.readline + del self.readlines + del self.fileno + if self.fp: + self.fp.close() + self.fp = None + + def read(self, *args, **kwargs): + self.__open() + return self.read(*args, **kwargs) + + def openread(self, *args, **kwargs): + return self.fp.read(*args, **kwargs) + + def readline(self, *args, **kwargs): + self.__open() + return self.readline(*args, **kwargs) + + def openreadline(self, *args, **kwargs): + return self.fp.readline(*args, **kwargs) + + def readlines(self, *args, **kwargs): + self.__open() + return self.readlines(*args, **kwargs) + + def openreadlines(self, *args, **kwargs): + return self.fp.readlines(*args, **kwargs) + + def fileno(self, *args, **kwargs): + self.__open() + return self.fileno(*args, **kwargs) + + def openfileno(self, *args, **kwargs): + return self.fp.fileno(*args, **kwargs) + + def __open(self): + self.fp = open(self.filename, "rb") + self.read = self.openread + self.readline = self.openreadline + self.readlines = self.openreadlines + self.fileno = self.openfileno + + def info(self): + return self.headers + + def geturl(self): + return self.url + + def __repr__(self): + return '<%s for %s whose fp=%s at 0x%x>' % (self.__class__.__name__, + self.url, self.fp, id(self)) def basejoin(base, url): Index: Lib/urllib2.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/urllib2.py,v retrieving revision 1.25 diff -u -r1.25 urllib2.py --- Lib/urllib2.py 11 Feb 2002 20:46:10 -0000 1.25 +++ Lib/urllib2.py 5 Mar 2002 10:19:12 -0000 @@ -119,7 +119,7 @@ # not sure how many of these need to be gotten rid of from urllib import unwrap, unquote, splittype, splithost, \ - addinfourl, splitport, splitgophertype, splitquery, \ + addinfourl, addinfourldefer, splitport, splitgophertype, splitquery, \ splitattr, ftpwrapper, noheaders # support for proxies via environment variables @@ -888,7 +888,7 @@ host, port = splitport(host) if not host or \ (not port and socket.gethostbyname(host) in self.get_names()): - return addinfourl(open(localfile, 'rb'), + return addinfourldefer(localfile, headers, 'file:'+file) raise URLError('file not on local host')