response classes used by urllib the base class addbase defines a minimal filelike 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 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 initself fp superaddbase self initfp urllib response deletefalse keep reference around as this was part of the original api self fp fp def reprself return s at r whose fp r self class name idself self file def enterself if self fp closed raise valueerrorio operation on closed file return self def exitself type value traceback self close class addclosehookaddbase class to add an info method to an open file def initself fp headers superaddinfo self initfp self headers headers def infoself return self headers class addinfourladdinfo 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 keep reference around as this was part of the original api class to add a close hook to an open file class to add an info method to an open file class to add info and geturl methods to an open file
import tempfile

__all__ = ['addbase', 'addclosehook', 'addinfo', 'addinfourl']


class addbase(tempfile._TemporaryFileWrapper):
    

    

    def __init__(self, fp):
        super(addbase,  self).__init__(fp, '<urllib response>', delete=False)
        
        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):
    

    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):
    

    def __init__(self, fp, headers):
        super(addinfo, self).__init__(fp)
        self.headers = headers

    def info(self):
        return self.headers


class addinfourl(addinfo):
    

    def __init__(self, fp, headers, url, code=None):
        super(addinfourl, self).__init__(fp, headers)
        self.url = url
        self.code = code

    @property
    def status(self):
        return self.code

    def getcode(self):
        return self.code

    def geturl(self):
        return self.url