Last active
February 22, 2016 22:58
-
-
Save bryanchow/6917ddc1823c09b5cc9f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://gist.github.com/bryanchow/6917ddc1823c09b5cc9f | |
import re | |
from django.http import HttpResponseRedirect | |
from django.conf import settings | |
SHOULD_REDIRECT_SSL = getattr( | |
settings, 'SHOULD_REDIRECT_SSL', not settings.DEBUG | |
) | |
SSL_URLS = getattr(settings, 'SSL_URLS', []) | |
SSL_IGNORE_URLS = getattr(settings, 'SSL_IGNORE_URLS', []) | |
class SSLRedirectMiddleware: | |
secure_urls = tuple([re.compile(url) for url in SSL_URLS]) | |
ignore_urls = tuple([re.compile(url) for url in SSL_IGNORE_URLS]) | |
def process_request(self, request): | |
if not SHOULD_REDIRECT_SSL: | |
return | |
secure = False | |
ignore = False | |
for url in self.ignore_urls: | |
if url.match(request.path): | |
ignore = True | |
break | |
if not ignore: | |
for url in self.secure_urls: | |
if url.match(request.path): | |
secure = True | |
break | |
if not secure == self._is_secure(request): | |
return self._redirect(request, secure) | |
def _is_secure(self, request): | |
if request.is_secure(): | |
return True | |
return False | |
def _redirect(self, request, secure): | |
protocol = secure and "https" or "http" | |
if secure: | |
host = getattr(settings, 'SSL_HOST', request.get_host()) | |
else: | |
host = getattr(settings, 'HTTP_HOST', request.get_host()) | |
new_url = "%s://%s%s" % (protocol, host, request.get_full_path()) | |
if settings.DEBUG and request.method == 'POST': | |
raise RuntimeError, ( | |
"Django can't perform a SSL redirect while maintaining POST " | |
"data. Please structure your views so that redirects only " | |
"occur during GETs." | |
) | |
return HttpResponseRedirect(new_url) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment