diff --git a/tools/run-dev.py b/tools/run-dev.py new file mode 100755 index 0000000000..bed5081a83 --- /dev/null +++ b/tools/run-dev.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python +import subprocess +import os +from os import path + +from twisted.internet import reactor +from twisted.web import proxy, server, resource + +""" +Starts the app listening on localhost, for local development. + +This script launches the Django and Tornado servers, then runs a reverse proxy +which serves to both of them. After it's all up and running, browse to + + http://localhost:9991/ + +Note that, while runserver and runtornado have the usual auto-restarting +behavior, the reverse proxy itself does *not* automatically restart on changes +to this file. +""" + +proxy_port = 9991 +proxy_host = 'localhost:%d' % (proxy_port,) + +os.chdir(path.join(path.dirname(__file__), '..')) + +procs = [] +for cmd in ['python manage.py runserver localhost:9992', + 'python manage.py runtornado localhost:9993']: + procs.append(subprocess.Popen(cmd, shell=True)) + +class Resource(resource.Resource): + def getChild(self, name, request): + request.requestHeaders.setRawHeaders('X-Forwarded-Host', [proxy_host]) + + if request.uri in ['/get_updates', '/api/v1/get_messages']: + return proxy.ReverseProxyResource('localhost', 9993, '/'+name) + + return proxy.ReverseProxyResource('localhost', 9992, '/'+name) + +reactor.listenTCP(proxy_port, server.Site(Resource()), interface='127.0.0.1') + +try: + reactor.run() +finally: + for proc in procs: + proc.terminate()