summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDong-hee Na <donghee.na@python.org>2022-12-08 02:20:34 (GMT)
committerGitHub <noreply@github.com>2022-12-08 02:20:34 (GMT)
commitdc8a86893df37e137cfe992e95e7d66cd68e9eaf (patch)
tree4894d493412dbaea966d149bb35236f4a311ae12
parent3c892022472eb975360fb3f0caa6f6fcc6fbf220 (diff)
downloadcpython-dc8a86893df37e137cfe992e95e7d66cd68e9eaf.zip
cpython-dc8a86893df37e137cfe992e95e7d66cd68e9eaf.tar.gz
cpython-dc8a86893df37e137cfe992e95e7d66cd68e9eaf.tar.bz2
gh-98778: Update HTTPError to initialize properly even if fp is None (gh-99966)
-rw-r--r--Lib/test/test_urllib2.py4
-rw-r--r--Lib/urllib/error.py11
-rw-r--r--Misc/NEWS.d/next/Library/2022-12-03-20-06-16.gh-issue-98778.t5U9uc.rst2
3 files changed, 10 insertions, 7 deletions
diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py
index 28f8841..498c038 100644
--- a/Lib/test/test_urllib2.py
+++ b/Lib/test/test_urllib2.py
@@ -1824,6 +1824,10 @@ class MiscTests(unittest.TestCase):
expected_errmsg = '<HTTPError %s: %r>' % (err.code, err.msg)
self.assertEqual(repr(err), expected_errmsg)
+ def test_gh_98778(self):
+ x = urllib.error.HTTPError("url", 405, "METHOD NOT ALLOWED", None, None)
+ self.assertEqual(getattr(x, "__notes__", ()), ())
+
def test_parse_proxy(self):
parse_proxy_test_cases = [
('proxy.example.com',
diff --git a/Lib/urllib/error.py b/Lib/urllib/error.py
index 8cd901f..feec0e7 100644
--- a/Lib/urllib/error.py
+++ b/Lib/urllib/error.py
@@ -10,7 +10,7 @@ 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 io
import urllib.response
__all__ = ['URLError', 'HTTPError', 'ContentTooShortError']
@@ -42,12 +42,9 @@ class HTTPError(URLError, urllib.response.addinfourl):
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)
+ if fp is None:
+ fp = io.StringIO()
+ self.__super_init(fp, hdrs, url, code)
def __str__(self):
return 'HTTP Error %s: %s' % (self.code, self.msg)
diff --git a/Misc/NEWS.d/next/Library/2022-12-03-20-06-16.gh-issue-98778.t5U9uc.rst b/Misc/NEWS.d/next/Library/2022-12-03-20-06-16.gh-issue-98778.t5U9uc.rst
new file mode 100644
index 0000000..b1c170d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-12-03-20-06-16.gh-issue-98778.t5U9uc.rst
@@ -0,0 +1,2 @@
+Update :exc:`~urllib.error.HTTPError` to be initialized properly, even if
+the ``fp`` is ``None``. Patch by Dong-hee Na.