From: Serhiy Storchaka Date: Mon, 18 Jan 2016 08:35:40 +0000 (+0200) Subject: Issue #6500: Fixed infinite recursion in urllib2.Request.__getattr__(). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=43beaebffb55e0b9250d996fd7a10f6e575f34e0;p=python Issue #6500: Fixed infinite recursion in urllib2.Request.__getattr__(). --- diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 32ffd0acef..5a631b3a57 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -1350,6 +1350,11 @@ class RequestTests(unittest.TestCase): req = Request(url) self.assertEqual(req.get_full_url(), url) + def test_private_attributes(self): + self.assertFalse(hasattr(self.get, '_Request__r_xxx')) + # Issue #6500: infinite recursion + self.assertFalse(hasattr(self.get, '_Request__r_method')) + def test_HTTPError_interface(self): """ Issue 13211 reveals that HTTPError didn't implement the URLError diff --git a/Lib/urllib2.py b/Lib/urllib2.py index 9277b1d1cd..8ec5e2aefe 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -248,11 +248,9 @@ class Request: # methods getting called in a non-standard order. this may be # too complicated and/or unnecessary. # XXX should the __r_XXX attributes be public? - if attr[:12] == '_Request__r_': - name = attr[12:] - if hasattr(Request, 'get_' + name): - getattr(self, 'get_' + name)() - return getattr(self, attr) + if attr in ('_Request__r_type', '_Request__r_host'): + getattr(self, 'get_' + attr[12:])() + return self.__dict__[attr] raise AttributeError, attr def get_method(self): diff --git a/Misc/NEWS b/Misc/NEWS index 6b5c418b1c..3117809ecc 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -39,6 +39,8 @@ Core and Builtins Library ------- +- Issue #6500: Fixed infinite recursion in urllib2.Request.__getattr__(). + - Issue #26083: Workaround a subprocess bug that raises an incorrect "ValueError: insecure string pickle" exception instead of the actual exception on some platforms such as Mac OS X when an exception raised