--- urllib2.py 2007-08-06 01:51:54.000000000 +0530 +++ urllib2-mdf.py 2007-08-06 02:11:06.622305944 +0530 @@ -514,6 +514,9 @@ # assuming we're in a loop max_redirections = 10 + def __init__(self): + self.cache = {} + def redirect_request(self, req, fp, code, msg, headers, newurl): """Return a Request or None in response to a redirect. @@ -545,6 +548,28 @@ # infinite loop, the request object needs to track what URLs we # have already seen. Do this by adding a handler-specific # attribute to the Request object. + + def http_error_301(self, req, fp, code, msg, headers): + if req in self.cache: + if 'location' in headers: + newurl = headers.getheaders('location')[0] + elif 'uri' in headers: + newurl = headers.getheaders('uri')[0] + else: + return + if hasattr(req, 'redirect_dict'): + visited = req.redirect_dict + if (visited.get(newurl, 0) > (self.max_repeats -1 ) or + len(visited) >= (self.max_redirections - 1)): + raise HTTPError(req.get_full_url(), code, self.inf_msg + + msg, headers, fp) + else: + visited = req.redirect_dict = {} + visited[newurl] = visited.get(newurl, 0) + 1 + return self.cache[req] + self.cache[req] = self.http_error_302(req, fp, code, msg, headers) + return self.cache[req] + def http_error_302(self, req, fp, code, msg, headers): # Some servers (incorrectly) return multiple Location headers # (so probably same goes for URI). Use first header. @@ -582,7 +607,7 @@ return self.parent.open(new) - http_error_301 = http_error_303 = http_error_307 = http_error_302 + http_error_303 = http_error_307 = http_error_302 inf_msg = "The HTTP server returned a redirect error that would " \ "lead to an infinite loop.\n" \