Better fix for newurl as suggested by Jim Jewett in SF bug #730963.

This commit is contained in:
Jeremy Hylton 2003-05-05 04:09:13 +00:00
parent f6b444ede4
commit 0389295dcd
1 changed files with 2 additions and 12 deletions

View File

@ -408,7 +408,7 @@ class HTTPDefaultErrorHandler(BaseHandler):
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
class HTTPRedirectHandler(BaseHandler): class HTTPRedirectHandler(BaseHandler):
def redirect_request(self, req, fp, code, msg, headers): def redirect_request(self, req, fp, code, msg, headers, newurl):
"""Return a Request or None in response to a redirect. """Return a Request or None in response to a redirect.
This is called by the http_error_30x methods when a redirection This is called by the http_error_30x methods when a redirection
@ -417,16 +417,6 @@ class HTTPRedirectHandler(BaseHandler):
raise HTTPError if no-one else should try to handle this url. Return raise HTTPError if no-one else should try to handle this url. Return
None if you can't but another Handler might. None if you can't but another Handler might.
""" """
# XXX 301 and 302 errors must have a location or uri header.
# Not sure about the other error codes.
if "location" in headers:
newurl = headers["location"]
elif "uri" in headers:
newurl = headers["uri"]
else:
return
newurl = urlparse.urljoin(req.get_full_url(), newurl)
m = req.get_method() m = req.get_method()
if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") if (code in (301, 302, 303, 307) and m in ("GET", "HEAD")
or code in (302, 303) and m == "POST"): or code in (302, 303) and m == "POST"):
@ -455,7 +445,7 @@ class HTTPRedirectHandler(BaseHandler):
# XXX Probably want to forget about the state of the current # XXX Probably want to forget about the state of the current
# request, although that might interact poorly with other # request, although that might interact poorly with other
# handlers that also use handler-specific request attributes # handlers that also use handler-specific request attributes
new = self.redirect_request(req, fp, code, msg, headers) new = self.redirect_request(req, fp, code, msg, headers, newurl)
if new is None: if new is None:
return return