Index: third_party/google-endpoints/future/backports/urllib/error.py |
diff --git a/third_party/google-endpoints/future/backports/urllib/error.py b/third_party/google-endpoints/future/backports/urllib/error.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a473e4453d7a82e6fa6db63da089b9dd187f75f5 |
--- /dev/null |
+++ b/third_party/google-endpoints/future/backports/urllib/error.py |
@@ -0,0 +1,75 @@ |
+"""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. |
+""" |
+from __future__ import absolute_import, division, unicode_literals |
+from future import standard_library |
+ |
+from future.backports.urllib import response as urllib_response |
+ |
+ |
+__all__ = ['URLError', 'HTTPError', 'ContentTooShortError'] |
+ |
+ |
+# 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) |
+ |
+ # since URLError specifies a .reason attribute, HTTPError should also |
+ # provide this attribute. See issue13211 for discussion. |
+ @property |
+ def reason(self): |
+ return self.msg |
+ |
+ def info(self): |
+ return self.hdrs |
+ |
+ |
+# 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 |