from twisted.internet import reactor from twisted.web import proxy as twisted_proxy from twisted.web import server from twisted.web import resource from twisted.web.resource import NoResource from owsdev.service import active_services class ServicesResource(resource.Resource): isLeaf = False def __init__(self, reporter): resource.Resource.__init__(self) self.reporter = reporter self.port_map = { service.qa_host(): service.port for service in active_services()} def getChild(self, path, request): request_host = request.getHeader('host').split(':')[0] if request_host not in self.port_map: self.reporter.echo( 'Error: request for {} not proxied.'.format(request_host)) return NoResource() port = self.port_map[request_host] proxy_resource = twisted_proxy.ReverseProxyResource( 'localhost', port, request.path) proxy_resource.isLeaf = 1 return proxy_resource def run_proxy(reporter): site = server.Site(ServicesResource(reporter)) reactor.listenTCP(80, site) reactor.run()