mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			60 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								"""Exception classes raised by urllib.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The base exception class is URLError, which inherits from IOError.  It
							 | 
						||
| 
								 | 
							
								doesn't define any behavior of its own, but is the base class for all
							 | 
						||
| 
								 | 
							
								exceptions defined in this package.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HTTPError is an exception class that is also a valid HTTP response
							 | 
						||
| 
								 | 
							
								instance.  It behaves this way because HTTP protocol errors are valid
							 | 
						||
| 
								 | 
							
								responses, with a status code, headers, and a body.  In some contexts,
							 | 
						||
| 
								 | 
							
								an application may want to handle an exception like a regular
							 | 
						||
| 
								 | 
							
								response.
							 | 
						||
| 
								 | 
							
								"""
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import urllib.response
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# do these error classes make sense?
							 | 
						||
| 
								 | 
							
								# make sure all of the IOError stuff is overridden.  we just want to be
							 | 
						||
| 
								 | 
							
								# subtypes.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class URLError(IOError):
							 | 
						||
| 
								 | 
							
								    # URLError is a sub-type of IOError, but it doesn't share any of
							 | 
						||
| 
								 | 
							
								    # the implementation.  need to override __init__ and __str__.
							 | 
						||
| 
								 | 
							
								    # It sets self.args for compatibility with other EnvironmentError
							 | 
						||
| 
								 | 
							
								    # subclasses, but args doesn't have the typical format with errno in
							 | 
						||
| 
								 | 
							
								    # slot 0 and strerror in slot 1.  This may be better than nothing.
							 | 
						||
| 
								 | 
							
								    def __init__(self, reason, filename=None):
							 | 
						||
| 
								 | 
							
								        self.args = reason,
							 | 
						||
| 
								 | 
							
								        self.reason = reason
							 | 
						||
| 
								 | 
							
								        if filename is not None:
							 | 
						||
| 
								 | 
							
								            self.filename = filename
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __str__(self):
							 | 
						||
| 
								 | 
							
								        return '<urlopen error %s>' % self.reason
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class HTTPError(URLError, urllib.response.addinfourl):
							 | 
						||
| 
								 | 
							
								    """Raised when HTTP error occurs, but also acts like non-error return"""
							 | 
						||
| 
								 | 
							
								    __super_init = urllib.response.addinfourl.__init__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(self, url, code, msg, hdrs, fp):
							 | 
						||
| 
								 | 
							
								        self.code = code
							 | 
						||
| 
								 | 
							
								        self.msg = msg
							 | 
						||
| 
								 | 
							
								        self.hdrs = hdrs
							 | 
						||
| 
								 | 
							
								        self.fp = fp
							 | 
						||
| 
								 | 
							
								        self.filename = url
							 | 
						||
| 
								 | 
							
								        # The addinfourl classes depend on fp being a valid file
							 | 
						||
| 
								 | 
							
								        # object.  In some cases, the HTTPError may not have a valid
							 | 
						||
| 
								 | 
							
								        # file object.  If this happens, the simplest workaround is to
							 | 
						||
| 
								 | 
							
								        # not initialize the base classes.
							 | 
						||
| 
								 | 
							
								        if fp is not None:
							 | 
						||
| 
								 | 
							
								            self.__super_init(fp, hdrs, url, code)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __str__(self):
							 | 
						||
| 
								 | 
							
								        return 'HTTP Error %s: %s' % (self.code, self.msg)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# exception raised when downloaded size does not match content-length
							 | 
						||
| 
								 | 
							
								class ContentTooShortError(URLError):
							 | 
						||
| 
								 | 
							
								    def __init__(self, message, content):
							 | 
						||
| 
								 | 
							
								        URLError.__init__(self, message)
							 | 
						||
| 
								 | 
							
								        self.content = content
							 |