Skip to content

Instantly share code, notes, and snippets.

@ke4roh
Created February 10, 2017 15:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ke4roh/3d11ada173c9bc13d0e56d0515b49f0e to your computer and use it in GitHub Desktop.
Save ke4roh/3d11ada173c9bc13d0e56d0515b49f0e to your computer and use it in GitHub Desktop.
Circuits Framework SSL web with redirector
#!/usr/bin/env python3
from circuits import Debugger, BaseComponent, handler
from circuits.web import Controller, Server
from circuits.web.errors import redirect
from urllib.parse import urlparse, urlunparse
class Root(Controller):
def index(self):
return "Hello World!"
class RedirectToSecure(BaseComponent):
def __init__(self, secure_port, **kwargs):
super().__init__(**kwargs)
self.secure_port = secure_port
@handler("request", priority=0.9)
def _on_request(self, event, request, response):
if request.uri._scheme == b'http':
parts = urlparse(request.uri.utf8())
new_parts = parts._replace(scheme=b'https')
if b':' in parts.netloc:
(host, port) = parts.netloc.split(b':', 2)
else:
host = parts.netloc
port = None
if self.secure_port == 443:
port = None
else:
port = str(self.secure_port).encode('utf-8')
if port:
new_netloc = b'%s:%s' % (host, port)
else:
new_netloc = host
new_parts = new_parts._replace(netloc=new_netloc)
try:
return redirect(request, response, (urlunparse(new_parts),), 301)
finally:
event.stop()
app = Server(("0.0.0.0", 8443), secure=True, certfile="cert.pem") + \
Debugger() + Root() + \
Server(8080, channel="onlysecure") + RedirectToSecure(8443, channel="onlysecure")
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment