1"""Exception classes raised by urllib. 2 3The base exception class is URLError, which inherits from IOError. It 4doesn't define any behavior of its own, but is the base class for all 5exceptions defined in this package. 6 7HTTPError is an exception class that is also a valid HTTP response 8instance. It behaves this way because HTTP protocol errors are valid 9responses, with a status code, headers, and a body. In some contexts, 10an application may want to handle an exception like a regular 11response. 12""" 13from __future__ import absolute_import, division, unicode_literals 14from future import standard_library 15 16from future.backports.urllib import response as urllib_response 17 18 19__all__ = ['URLError', 'HTTPError', 'ContentTooShortError'] 20 21 22# do these error classes make sense? 23# make sure all of the IOError stuff is overridden. we just want to be 24# subtypes. 25 26class URLError(IOError): 27 # URLError is a sub-type of IOError, but it doesn't share any of 28 # the implementation. need to override __init__ and __str__. 29 # It sets self.args for compatibility with other EnvironmentError 30 # subclasses, but args doesn't have the typical format with errno in 31 # slot 0 and strerror in slot 1. This may be better than nothing. 32 def __init__(self, reason, filename=None): 33 self.args = reason, 34 self.reason = reason 35 if filename is not None: 36 self.filename = filename 37 38 def __str__(self): 39 return '<urlopen error %s>' % self.reason 40 41class HTTPError(URLError, urllib_response.addinfourl): 42 """Raised when HTTP error occurs, but also acts like non-error return""" 43 __super_init = urllib_response.addinfourl.__init__ 44 45 def __init__(self, url, code, msg, hdrs, fp): 46 self.code = code 47 self.msg = msg 48 self.hdrs = hdrs 49 self.fp = fp 50 self.filename = url 51 # The addinfourl classes depend on fp being a valid file 52 # object. In some cases, the HTTPError may not have a valid 53 # file object. If this happens, the simplest workaround is to 54 # not initialize the base classes. 55 if fp is not None: 56 self.__super_init(fp, hdrs, url, code) 57 58 def __str__(self): 59 return 'HTTP Error %s: %s' % (self.code, self.msg) 60 61 # since URLError specifies a .reason attribute, HTTPError should also 62 # provide this attribute. See issue13211 for discussion. 63 @property 64 def reason(self): 65 return self.msg 66 67 def info(self): 68 return self.hdrs 69 70 71# exception raised when downloaded size does not match content-length 72class ContentTooShortError(URLError): 73 def __init__(self, message, content): 74 URLError.__init__(self, message) 75 self.content = content 76