Resources: Ensure we close all file pointers

This commit is contained in:
Mike Auty
2020-06-27 18:29:51 +01:00
parent cc6f4fbf9d
commit cd9a46ebd1
+22 -7
View File
@@ -37,6 +37,22 @@ vollog = logging.getLogger(__name__)
# fix this
def cascadeCloseFile(new_fp, original_fp):
"""Really horrible solution for ensuring files aren't left open
Args:
new_fp: The file pointer constructed based on the original file pointer
original_fp: The original file pointer that should be closed when the new file pointer is closed, but isn't
"""
def close():
original_fp.close()
return new_fp.__class__.close(new_fp)
new_fp.close = close
return new_fp
class ResourceAccessor(object):
"""Object for openning URLs as files (downloading locally first if
necessary)"""
@@ -140,12 +156,11 @@ class ResourceAccessor(object):
if detected:
if detected.mime_type == 'application/x-xz':
curfile = lzma.LZMAFile(curfile, mode)
curfile = cascadeCloseFile(lzma.LZMAFile(curfile, mode), curfile)
elif detected.mime_type == 'application/x-bzip2':
curfile = bz2.BZ2File(curfile, mode)
curfile = cascadeCloseFile(bz2.BZ2File(curfile, mode), curfile)
elif detected.mime_type == 'application/x-gzip':
curfile = gzip.GzipFile(fileobj = curfile, mode = mode)
curfile = cascadeCloseFile(gzip.GzipFile(fileobj = curfile, mode = mode), curfile)
if detected.mime_type in ['application/x-xz', 'application/x-bzip2', 'application/x-gzip']:
# Read and rewind to ensure we're inside any compressed file layers
curfile.read(1)
@@ -164,11 +179,11 @@ class ResourceAccessor(object):
url_path, extension = url_path_split[:-1], url_path_split[-1]
url_path = ".".join(url_path)
if extension == "xz":
curfile = lzma.LZMAFile(curfile, mode)
curfile = cascadeCloseFile(lzma.LZMAFile(curfile, mode), curfile)
elif extension == "bz2":
curfile = bz2.BZ2File(curfile, mode)
curfile = cascadeCloseFile(bz2.BZ2File(curfile, mode), curfile)
elif extension == "gz":
curfile = gzip.GzipFile(fileobj = curfile, mode = mode)
curfile = cascadeCloseFile(gzip.GzipFile(fileobj = curfile, mode = mode), curfile)
else:
stop = True