diff -r e2faa18802bb Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py Wed Jan 06 03:08:12 2016 +0200 +++ b/Lib/test/test_urllib2.py Wed Jan 06 03:55:37 2016 +0200 @@ -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 -r e2faa18802bb Lib/urllib2.py --- a/Lib/urllib2.py Wed Jan 06 03:08:12 2016 +0200 +++ b/Lib/urllib2.py Wed Jan 06 03:55:37 2016 +0200 @@ -248,11 +248,10 @@ 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_': + if attr in ('_Request__r_type', '_Request__r_host'): name = attr[12:] - if hasattr(Request, 'get_' + name): - getattr(self, 'get_' + name)() - return getattr(self, attr) + getattr(self, 'get_' + name)() + return getattr(self, attr) raise AttributeError, attr def get_method(self):