From 8102d1262e9b51663dc911882a39717cb496b0ab Mon Sep 17 00:00:00 2001 From: Luke Plant Date: Thu, 30 Mar 2006 23:03:19 +0000 Subject: [PATCH] magic-removal: Added support for HTTP_X_FORWARDED_HOST in all places where HTTP_HOST is used, for support of virtual hosting situations. git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@2601 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/views/doc.py | 4 ++-- django/http/__init__.py | 7 +++++++ django/middleware/common.py | 5 +++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/django/contrib/admin/views/doc.py b/django/contrib/admin/views/doc.py index e060e53867..fa7088d5d9 100644 --- a/django/contrib/admin/views/doc.py +++ b/django/contrib/admin/views/doc.py @@ -5,7 +5,7 @@ from django.contrib.admin.views.decorators import staff_member_required from django.db import models from django.shortcuts import render_to_response from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist -from django.http import Http404 +from django.http import Http404, get_host from django.core import urlresolvers from django.contrib.admin import utils from django.contrib.sites.models import Site @@ -24,7 +24,7 @@ def bookmarklets(request): # Hack! This couples this view to the URL it lives at. admin_root = request.path[:-len('doc/bookmarklets/')] return render_to_response('admin_doc/bookmarklets', { - 'admin_url': "%s://%s%s" % (os.environ.get('HTTPS') == 'on' and 'https' or 'http', request.META['HTTP_HOST'], admin_root), + 'admin_url': "%s://%s%s" % (os.environ.get('HTTPS') == 'on' and 'https' or 'http', get_host(request), admin_root), }, context_instance=RequestContext(request)) bookmarklets = staff_member_required(bookmarklets) diff --git a/django/http/__init__.py b/django/http/__init__.py index 34cd0a3005..75e1873a4c 100644 --- a/django/http/__init__.py +++ b/django/http/__init__.py @@ -252,3 +252,10 @@ class HttpResponseServerError(HttpResponse): def __init__(self, *args, **kwargs): HttpResponse.__init__(self, *args, **kwargs) self.status_code = 500 + +def get_host(request): + """Gets the HTTP host from the environment or request headers.""" + host = request.META.get('HTTP_X_FORWARDED_HOST', '') + if not host: + host = request.META.get('HTTP_HOST', '') + return host diff --git a/django/middleware/common.py b/django/middleware/common.py index 720de3c681..c34160cf1d 100644 --- a/django/middleware/common.py +++ b/django/middleware/common.py @@ -30,7 +30,8 @@ class CommonMiddleware: return http.HttpResponseForbidden('

Forbidden

') # Check for a redirect based on settings.APPEND_SLASH and settings.PREPEND_WWW - old_url = [request.META.get('HTTP_HOST', ''), request.path] + host = http.get_host(request) + old_url = [host, request.path] new_url = old_url[:] if settings.PREPEND_WWW and old_url[0] and not old_url[0].startswith('www.'): new_url[0] = 'www.' + old_url[0] @@ -56,7 +57,7 @@ class CommonMiddleware: if settings.SEND_BROKEN_LINK_EMAILS: # If the referrer was from an internal link or a non-search-engine site, # send a note to the managers. - domain = request.META['HTTP_HOST'] + domain = http.get_host(request) referer = request.META.get('HTTP_REFERER', None) is_internal = referer and (domain in referer) path = request.get_full_path()