| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  | """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. | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  | import tempfile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | __all__ = ['addbase', 'addclosehook', 'addinfo', 'addinfourl'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class addbase(tempfile._TemporaryFileWrapper): | 
					
						
							|  |  |  |     """Base class for addinfo and addclosehook. Is a good idea for garbage collection.""" | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # XXX Add a method to expose the timeout on the underlying socket? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, fp): | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  |         super(addbase,  self).__init__(fp, '<urllib response>', delete=False) | 
					
						
							|  |  |  |         # Keep reference around as this was part of the original API. | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  |         self.fp = fp | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return '<%s at %r whose fp = %r>' % (self.__class__.__name__, | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  |                                              id(self), self.file) | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-26 21:34:20 +00:00
										 |  |  |     def __enter__(self): | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  |         if self.fp.closed: | 
					
						
							| 
									
										
										
										
											2009-03-26 21:34:20 +00:00
										 |  |  |             raise ValueError("I/O operation on closed file") | 
					
						
							|  |  |  |         return self | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __exit__(self, type, value, traceback): | 
					
						
							|  |  |  |         self.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  | class addclosehook(addbase): | 
					
						
							|  |  |  |     """Class to add a close hook to an open file.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, fp, closehook, *hookargs): | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  |         super(addclosehook, self).__init__(fp) | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  |         self.closehook = closehook | 
					
						
							|  |  |  |         self.hookargs = hookargs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def close(self): | 
					
						
							| 
									
										
										
										
											2015-04-10 13:24:41 +03:00
										 |  |  |         try: | 
					
						
							|  |  |  |             closehook = self.closehook | 
					
						
							|  |  |  |             hookargs = self.hookargs | 
					
						
							|  |  |  |             if closehook: | 
					
						
							|  |  |  |                 self.closehook = None | 
					
						
							|  |  |  |                 self.hookargs = None | 
					
						
							|  |  |  |                 closehook(*hookargs) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             super(addclosehook, self).close() | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class addinfo(addbase): | 
					
						
							|  |  |  |     """class to add an info() method to an open file.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, fp, headers): | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  |         super(addinfo, self).__init__(fp) | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  |         self.headers = headers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def info(self): | 
					
						
							|  |  |  |         return self.headers | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class addinfourl(addinfo): | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  |     """class to add info() and geturl() methods to an open file.""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, fp, headers, url, code=None): | 
					
						
							| 
									
										
										
										
											2014-04-20 09:41:29 -07:00
										 |  |  |         super(addinfourl, self).__init__(fp, headers) | 
					
						
							| 
									
										
										
										
											2008-06-18 20:49:58 +00:00
										 |  |  |         self.url = url | 
					
						
							|  |  |  |         self.code = code | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def getcode(self): | 
					
						
							|  |  |  |         return self.code | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def geturl(self): | 
					
						
							|  |  |  |         return self.url |