File diff abf12d29dff0 → 55c195c73f99
www/conservancy/middleware.py
Show inline comments
...
 
@@ -4,24 +4,29 @@ from django.utils.cache import patch_response_headers
 

	
 
class ForceCanonicalHostnameMiddleware(object):
 

	
 
    def process_request(self, request):
 
        """Modified common middleware for Conservancy site
 

	
 
        * Performs redirects to strip trailing "index.html"
 
        * performs redirects based on APPEND_SLASH
 
        * performs redirects based on site-specific REDIRECT_TABLE
 
        * adds cache headers to provide hints to squid
 
        """
 

	
 
        # Never allow connection to the /admin part of the site without SSL
 
        if (not request.is_secure) and request.path.startswith('/admin'):
 
            url = 'https://sfconservancy.org%s' % request.path
 
            return http.HttpResponseRedirect(url)
 

	
 
        # Check for a redirect based on settings.APPEND_SLASH
 
        host = http.get_host(request)
 
        old_url = [host, request.path]
 
        new_url = old_url[:]
 
        # Append a slash if append_slash is set and the URL doesn't have a
 
        # trailing slash or a file extension.
 
        if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]):
 
            new_url[1] = new_url[1] + '/'
 
            if settings.DEBUG and request.method == 'POST':
 
                raise RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to %s%s (note the trailing slash), or set APPEND_SLASH=False in your Django settings." % (new_url[0], new_url[1])
 
        # Strip trailing index.html
 
        if new_url[1].endswith('/index.html'):