89 lines
2.5 KiB
Python
Executable File
89 lines
2.5 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
import datetime
|
|
import os
|
|
import sys
|
|
|
|
# If ../nova/__init__.py exists, add ../ to Python search path, so that
|
|
# it will override what happens to be installed in /usr/(local/)lib/python...
|
|
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
|
|
os.pardir,
|
|
os.pardir))
|
|
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|
sys.path.insert(0, possible_topdir)
|
|
|
|
from nova import utils
|
|
from nova import flags
|
|
from nova import rpc
|
|
|
|
import exceptions
|
|
import logging
|
|
import urlparse
|
|
|
|
FLAGS = flags.FLAGS
|
|
from twisted.internet import reactor
|
|
from twisted.internet import task
|
|
from twisted.web import http
|
|
from twisted.web.proxy import Proxy, ProxyRequest
|
|
|
|
class AjaxProxyRequest(ProxyRequest):
|
|
def process(self):
|
|
if 'referer' in self.received_headers:
|
|
auth_uri = self.received_headers['referer']
|
|
else:
|
|
auth_uri = self.uri
|
|
|
|
try:
|
|
auth_params = urlparse.parse_qs(urlparse.urlparse(auth_uri).query)
|
|
parsed_uri = urlparse.urlparse(self.uri)
|
|
|
|
self.uri = "http://%s:%s%s?%s"% (auth_params['host'][0], auth_params['port'][0], parsed_uri.path, parsed_uri.query)
|
|
|
|
ProxyRequest.process(self)
|
|
except (exceptions.KeyError):
|
|
pass
|
|
|
|
class AjaxProxy(Proxy):
|
|
tokens = {}
|
|
requestFactory = AjaxProxyRequest
|
|
|
|
def start(self):
|
|
conn = rpc.Connection.instance(new=True)
|
|
self.consumer = rpc.TopicConsumer(
|
|
connection=conn,
|
|
topic=FLAGS.ajax_proxy_topic)
|
|
self.consumer.register_callback(self)
|
|
|
|
task.LoopingCall(self.age).start(1.0)
|
|
task.LoopingCall(self.pollq).start(0.1)
|
|
|
|
factory = http.HTTPFactory()
|
|
factory.protocol = AjaxProxy
|
|
|
|
reactor.listenTCP(8000, factory)
|
|
reactor.run()
|
|
|
|
def age(self):
|
|
pass
|
|
|
|
def pollq(self):
|
|
self.consumer.fetch(auto_ack=True, enable_callbacks=True)
|
|
|
|
def __call__(self, data, message):
|
|
if data['method'] == 'authorize':
|
|
AjaxProxy.tokens['token'] = {'args': data['args'], 'born_at': datetime.datetime.now()}
|
|
|
|
|
|
if __name__ == '__main__':
|
|
utils.default_flagfile()
|
|
FLAGS(sys.argv)
|
|
|
|
formatter = logging.Formatter('(%(name)s): %(levelname)s %(message)s')
|
|
handler = logging.StreamHandler()
|
|
handler.setFormatter(formatter)
|
|
logging.getLogger().addHandler(handler)
|
|
|
|
ajaxproxy = AjaxProxy()
|
|
ajaxproxy.start()
|
|
|