blob: 52eeed0f70c798f4102fed9c97103b366e84ac16 [file] [log] [blame]
Jeremy Hylton1afc1692008-06-18 20:49:58 +00001"""Response classes used by urllib.
2
3The base class, addbase, defines a minimal file-like interface,
4including read() and readline(). The typical response object is an
5addinfourl instance, which defines an info() method that returns
6headers and a geturl() method that returns the url.
7"""
8
9class addbase(object):
10 """Base class for addinfo and addclosehook."""
11
12 # XXX Add a method to expose the timeout on the underlying socket?
13
14 def __init__(self, fp):
15 # TODO(jhylton): Is there a better way to delegate using io?
16 self.fp = fp
17 self.read = self.fp.read
18 self.readline = self.fp.readline
19 # TODO(jhylton): Make sure an object with readlines() is also iterable
Antoine Pitroub353c122009-02-11 00:39:14 +000020 if hasattr(self.fp, "readlines"):
21 self.readlines = self.fp.readlines
Jeremy Hylton1afc1692008-06-18 20:49:58 +000022 if hasattr(self.fp, "fileno"):
23 self.fileno = self.fp.fileno
24 else:
25 self.fileno = lambda: None
26 if hasattr(self.fp, "__iter__"):
27 self.__iter__ = self.fp.__iter__
28 if hasattr(self.fp, "__next__"):
29 self.__next__ = self.fp.__next__
30
31 def __repr__(self):
32 return '<%s at %r whose fp = %r>' % (self.__class__.__name__,
33 id(self), self.fp)
34
35 def close(self):
36 self.read = None
37 self.readline = None
38 self.readlines = None
39 self.fileno = None
40 if self.fp: self.fp.close()
41 self.fp = None
42
43class addclosehook(addbase):
44 """Class to add a close hook to an open file."""
45
46 def __init__(self, fp, closehook, *hookargs):
47 addbase.__init__(self, fp)
48 self.closehook = closehook
49 self.hookargs = hookargs
50
51 def close(self):
52 addbase.close(self)
53 if self.closehook:
54 self.closehook(*self.hookargs)
55 self.closehook = None
56 self.hookargs = None
57
58class addinfo(addbase):
59 """class to add an info() method to an open file."""
60
61 def __init__(self, fp, headers):
62 addbase.__init__(self, fp)
63 self.headers = headers
64
65 def info(self):
66 return self.headers
67
68class addinfourl(addbase):
69 """class to add info() and geturl() methods to an open file."""
70
71 def __init__(self, fp, headers, url, code=None):
72 addbase.__init__(self, fp)
73 self.headers = headers
74 self.url = url
75 self.code = code
76
77 def info(self):
78 return self.headers
79
80 def getcode(self):
81 return self.code
82
83 def geturl(self):
84 return self.url