From 3ec76f0441ba3658eeceb8db8ca0131fe4038480 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Tue, 4 Sep 2018 23:17:03 +0200 Subject: urllib --- modules/language/python/module/urllib/response.py | 81 +++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 modules/language/python/module/urllib/response.py (limited to 'modules/language/python/module/urllib/response.py') diff --git a/modules/language/python/module/urllib/response.py b/modules/language/python/module/urllib/response.py new file mode 100644 index 0000000..15fa7fe --- /dev/null +++ b/modules/language/python/module/urllib/response.py @@ -0,0 +1,81 @@ +module(urllib,response) +"""Response classes used by urllib. + +The base class, addbase, defines a minimal file-like interface, +including read() and readline(). The typical response object is an +addinfourl instance, which defines an info() method that returns +headers and a geturl() method that returns the url. +""" + +import tempfile + +__all__ = ['addbase', 'addclosehook', 'addinfo', 'addinfourl'] + + +class addbase(tempfile._TemporaryFileWrapper): + """Base class for addinfo and addclosehook. Is a good idea for garbage collection.""" + + # XXX Add a method to expose the timeout on the underlying socket? + + def __init__(self, fp): + super(addbase, self).__init__(fp, '', delete=False) + # Keep reference around as this was part of the original API. + self.fp = fp + + def __repr__(self): + return '<%s at %r whose fp = %r>' % (self.__class__.__name__, + id(self), self.file) + + def __enter__(self): + if self.fp.closed: + raise ValueError("I/O operation on closed file") + return self + + def __exit__(self, type, value, traceback): + self.close() + + +class addclosehook(addbase): + """Class to add a close hook to an open file.""" + + def __init__(self, fp, closehook, *hookargs): + super(addclosehook, self).__init__(fp) + self.closehook = closehook + self.hookargs = hookargs + + def close(self): + try: + closehook = self.closehook + hookargs = self.hookargs + if closehook: + self.closehook = None + self.hookargs = None + closehook(*hookargs) + finally: + super(addclosehook, self).close() + + +class addinfo(addbase): + """class to add an info() method to an open file.""" + + def __init__(self, fp, headers): + super(addinfo, self).__init__(fp) + self.headers = headers + + def info(self): + return self.headers + + +class addinfourl(addinfo): + """class to add info() and geturl() methods to an open file.""" + + def __init__(self, fp, headers, url, code=None): + super(addinfourl, self).__init__(fp, headers) + self.url = url + self.code = code + + def getcode(self): + return self.code + + def geturl(self): + return self.url -- cgit v1.2.3