Added a get_host() method to HttpRequest. There is still an http.get_host() version in place, so this is fully backwards compatible.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@6296 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Malcolm Tredinnick 2007-09-15 17:46:03 +00:00
parent 061ed82b22
commit 4b610f42d3
5 changed files with 23 additions and 20 deletions

View File

@ -5,7 +5,7 @@ from django.contrib.admin.views.decorators import staff_member_required
from django.db import models from django.db import models
from django.shortcuts import render_to_response from django.shortcuts import render_to_response
from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
from django.http import Http404, get_host from django.http import Http404
from django.core import urlresolvers from django.core import urlresolvers
from django.contrib.admin import utils from django.contrib.admin import utils
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
@ -29,7 +29,7 @@ def bookmarklets(request):
# Hack! This couples this view to the URL it lives at. # Hack! This couples this view to the URL it lives at.
admin_root = request.path[:-len('doc/bookmarklets/')] admin_root = request.path[:-len('doc/bookmarklets/')]
return render_to_response('admin_doc/bookmarklets.html', { return render_to_response('admin_doc/bookmarklets.html', {
'admin_url': "%s://%s%s" % (request.is_secure() and 'https' or 'http', get_host(request), admin_root), 'admin_url': "%s://%s%s" % (request.is_secure() and 'https' or 'http', request.get_host(), admin_root),
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
bookmarklets = staff_member_required(bookmarklets) bookmarklets = staff_member_required(bookmarklets)

View File

@ -1,6 +1,5 @@
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.http import get_host
SITE_CACHE = {} SITE_CACHE = {}
@ -54,7 +53,7 @@ class RequestSite(object):
The save() and delete() methods raise NotImplementedError. The save() and delete() methods raise NotImplementedError.
""" """
def __init__(self, request): def __init__(self, request):
self.domain = self.name = get_host(request) self.domain = self.name = request.get_host()
def __unicode__(self): def __unicode__(self):
return self.domain return self.domain

View File

@ -142,7 +142,7 @@ def fix_location_header(request, response):
Code constructing response objects is free to insert relative paths and Code constructing response objects is free to insert relative paths and
this function converts them to absolute paths. this function converts them to absolute paths.
""" """
if 'Location' in response and http.get_host(request): if 'Location' in response and request.get_host():
response['Location'] = request.build_absolute_uri(response['Location']) response['Location'] = request.build_absolute_uri(response['Location'])
return response return response

View File

@ -44,6 +44,20 @@ class HttpRequest(object):
__contains__ = has_key __contains__ = has_key
def get_host(self):
"Returns the HTTP host using the environment or request headers."
# We try three options, in order of decreasing preference.
host = self.META.get('HTTP_X_FORWARDED_HOST', '')
if 'HTTP_HOST' in self.META:
host = self.META['HTTP_HOST']
else:
# Reconstruct the host using the algorithm from PEP 333.
host = self.META['SERVER_NAME']
server_port = self.META['SERVER_PORT']
if server_port != (self.is_secure() and 443 or 80):
host = '%s:%s' % (host, server_port)
return host
def get_full_path(self): def get_full_path(self):
return '' return ''
@ -57,7 +71,7 @@ class HttpRequest(object):
location = self.get_full_path() location = self.get_full_path()
if not ':' in location: if not ':' in location:
current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http', current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
get_host(self), self.path) self.get_host(), self.path)
location = urljoin(current_uri, location) location = urljoin(current_uri, location)
return location return location
@ -381,19 +395,9 @@ class HttpResponseServerError(HttpResponse):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
HttpResponse.__init__(self, *args, **kwargs) HttpResponse.__init__(self, *args, **kwargs)
# A backwards compatible alias for HttpRequest.get_host.
def get_host(request): def get_host(request):
"Gets the HTTP host from the environment or request headers." return request.get_host()
# We try three options, in order of decreasing preference.
host = request.META.get('HTTP_X_FORWARDED_HOST', '')
if 'HTTP_HOST' in request.META:
host = request.META['HTTP_HOST']
else:
# Reconstruct the host using the algorithm from PEP 333.
host = request.META['SERVER_NAME']
server_port = request.META['SERVER_PORT']
if server_port != (request.is_secure() and 443 or 80):
host = '%s:%s' % (host, server_port)
return host
# It's neither necessary nor appropriate to use # It's neither necessary nor appropriate to use
# django.utils.encoding.smart_unicode for parsing URLs and form inputs. Thus, # django.utils.encoding.smart_unicode for parsing URLs and form inputs. Thus,

View File

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