'Return a Request or None in response to a redirect.
This is called by the http_error_30x methods when a
redirection response is received.  If a redirection should
take place, return a new Request to allow http_error_30x to
perform the redirect.  Otherwise, raise HTTPError if no-one
else should try to handle this url.  Return None if you can\'t
but another Handler might.'

def redirect_request(self, req, fp, code, msg, headers, newurl):

    m = req.get_method()
    if (((code in (301, 302, 303, 307)) and (m in ('GET', 'HEAD'))) or ((code in (301, 302, 303)) and (m == 'POST'))):
        newurl = newurl.replace('    ', '%20')
        newheaders = dict(((k, v) for (k, v) in req.headers.items() if (k.lower() not in ('content-length', 'content-type'))))
        return Request(newurl, headers=newheaders, origin_req_host=req.get_origin_req_host(), unverifiable=True)
    else:
        raise HTTPError(req.get_full_url(), code, msg, headers, fp)
