import cherrypy
from cherrypy.lib.filter.basefilter import BaseFilter

class StunnelFilter:
    def __init__(self, sslWrapAddr='127.0.0.1', sslWrapPort=None):
        self.sslWrapAddr = sslWrapAddr
        self.sslWrapPort = sslWrapPort

    def onStartResource(self): 
        if cherrypy.request.remoteAddr == self.sslWrapAddr:
            cherrypy.request.scheme = 'https'

    def beforeMain(self):
        if cherrypy.request.remoteAddr == self.sslWrapAddr and self.sslWrapPort:
            if ':' in cherrypy.request.base:
                baseURL, port = cherrypy.request.base.rsplit(':', 1)
                port = self.sslWrapPort
                cherrypy.request.base = ':'.join((baseURL, port))


def requireSSL(f):
    def _wrapper(*args, **kwargs):
        if cherrypy.request.scheme != 'https':
            return ['<h3>SSL required</h3>']
        else:
            return ''.join(f(*args, **kwargs))
    return _wrapper

        
if __name__ == '__main__':
    class Test:
        _cpFilterList = [StunnelFilter()]
        
        @cherrypy.expose
        def index(self):
            return "the index"

    class SubSection:
        
        @cherrypy.expose
        def index(self):
            return "the sub index"

        @cherrypy.expose
        @requireSSL
        def secure(self):
            return "a secure method"
        
cherrypy.root = Test()
cherrypy.root.more = SubSection()
cherrypy.root.more.still = SubSection()

cherrypy.server.start()