class WebFactionFixes(object):
"""
Middleware that applies some fixes for people using
the WebFaction hosting provider. In particular:
* sets 'REMOTE_ADDR' based on 'HTTP_X_FORWARDED_FOR', if the
latter is set.
* Monkey patches request.is_secure() to respect HTTP_X_FORWARDED_SSL.
PLEASE NOTE that this is not reliable, since a user could set
X-Forwarded-SSL manually and the main WebFaction Apache instance
does not remove it, so it will appear to be a secure request
when it is not. Usually if they do that, they will be harming
only themselves, but it depends how you use request.is_secure().
"""
def process_request(self, request):
# Fix REMOTE_ADDR
try:
real_ip = request.META['HTTP_X_FORWARDED_FOR']
except KeyError:
pass
else:
# HTTP_X_FORWARDED_FOR can be a comma-separated list of IPs. The
# client's IP will be the first one.
real_ip = real_ip.split(",")[0].strip()
request.META['REMOTE_ADDR'] = real_ip
# Fix HTTPS
if 'HTTP_X_FORWARDED_SSL' in request.META:
request.is_secure = lambda: request.META['HTTP_X_FORWARDED_SSL'] == 'on'
Comments
Spookylukey,
thanks for the patch. It works! I would think WF should post this as part of their installation/setup instruction for django. After all, https and django are not such a rare combination. Have you considered alerting the webfaction folks?
thanks again.
#
Cheers pingyip, I've done so now.
#