diff -r 70337a6d5dde Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py Thu Dec 08 22:14:56 2011 -0500 +++ b/Lib/test/test_urllib2.py Fri Dec 09 16:13:15 2011 +0200 @@ -1327,6 +1327,17 @@ >>> assert hasattr(err, 'reason') >>> err.reason 'something bad happened' + + HTTPError is a subclass of addinfourl, so geturl(), getcode() and info() + should work. + + >>> url = "http://url.com" + >>> code = 404 + >>> hdrs = {"foo": "bar"} + >>> err = urllib2.HTTPError(url=url, code=code, hdrs=hdrs, msg=None, fp=None) + >>> assert err.geturl() == url + >>> assert err.getcode() == code + >>> assert err.info() == hdrs """ def test_main(verbose=None): diff -r 70337a6d5dde Lib/urllib2.py --- a/Lib/urllib2.py Thu Dec 08 22:14:56 2011 -0500 +++ b/Lib/urllib2.py Fri Dec 09 16:13:15 2011 +0200 @@ -151,10 +151,8 @@ __super_init = 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 @@ -162,6 +160,12 @@ # not initialize the base classes. if fp is not None: self.__super_init(fp, hdrs, url, code) + else: + self.headers = hdrs + self.url = url + self.code = code + self.fp = fp + def __str__(self): return 'HTTP Error %s: %s' % (self.code, self.msg)