def get_outgoing_url(url): """ Bounce a URL off an outgoing URL redirector, such as outgoing.prod.mozaws.net. """ if not settings.REDIRECT_URL: return url parsed_url = urlparse(url) url_netloc = parsed_url.netloc # This prevents a link like javascript://addons.mozilla.org... # being returned unchanged since the netloc matches the # safe list see bug 1251023 if parsed_url.scheme not in ['http', 'https']: return '/' # No double-escaping, and some domain names are excluded. if (url_netloc == urlparse(settings.REDIRECT_URL).netloc or url_netloc in settings.REDIRECT_URL_ALLOW_LIST): return url url = force_bytes(jinja2.utils.Markup(url).unescape()) sig = hmac.new(settings.REDIRECT_SECRET_KEY, msg=url, digestmod=hashlib.sha256).hexdigest() # Let '&=' through so query params aren't escaped. We probably shouldn't # bother to quote the query part at all. return '/'.join([settings.REDIRECT_URL.rstrip('/'), sig, urllib.quote(url, safe='/&=')])
def process_response(self, request, response): if response.status_code != 404: return response full_path = request.get_full_path() parsed_path = urlparse(full_path) path_without_query = parsed_path.path current_site = get_current_site(request) r = None try: r = Redirect.objects.get(site=current_site, old_path=path_without_query) except Redirect.DoesNotExist: pass if settings.APPEND_SLASH and not request.path.endswith('/'): # Try appending a trailing slash. path_without_query = path_without_query + "/" try: r = Redirect.objects.get(site=current_site, old_path=path_without_query) except Redirect.DoesNotExist: pass if r is not None: if r.new_path == '': return http.HttpResponseGone() # preserve query string dest = "%s%s%s" % (r.new_path, ('?' in r.new_path and '&' or '?'), parsed_path.query) return http.HttpResponsePermanentRedirect(dest) # No redirect was found. Return the response. return response
def __init__(self, url, region, http_method, http_headers, creds, non_amz_headers_to_sign): self.http_method = http_method self.access_key_id, self.secret_access_key = creds parsed_url = urlparse(url) self.http_request_uri = parsed_url.path self.bucket = parsed_url.netloc.replace(get_s3_endpoint(region),'')[:-1] self.non_amz_headers, self.amz_headers = self._get_headers_for_sign(http_headers, non_amz_headers_to_sign)