diff py/configwaiter.py @ 253:0a1b642e3086

long polling config updates
author Matt Johnston <matt@ucc.asn.au>
date Mon, 08 Jun 2015 22:29:46 +0800
parents
children 26eee8591f61
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/py/configwaiter.py	Mon Jun 08 22:29:46 2015 +0800
@@ -0,0 +1,43 @@
+class ConfigWaiter(object):
+	""" Waits for config updates from the server. http long polling """
+
+	def __init__(self, server):
+		self.server = server
+		self.epoch_tag = None
+		self.http_session = aiohttp.ClientSession()
+
+	@asyncio.coroutine
+	def run(self):
+		# wait until someting has been uploaded (the uploader itself waits 5 seconds)
+		yield from asyncio.sleep(10)
+		while True:
+			yield from self.do()
+
+			# avoid spinning too fast
+			yield from server.sleep(1)
+
+	@asyncio.coroutine
+	def do(self):
+		try:
+			if self.epoch_tag:
+				headers = {'etag': self.epoch_tag}
+			else:
+				headers = None
+
+	        r = yield from asyncio.wait_for(
+	        	self.http_session.get(config.SETTINGS_URL, headers=headers), 
+	        	300)
+	        if r.status == 200:
+		        resp = yield from asyncio.wait_for(r.json(), 300)
+
+		        self.epoch_tag = resp['epoch_tag']
+		        epoch = self.epoch_tag.split('-')[0]
+		        if self.server.params.receive(resp['params'], epoch):
+		        	self.server.reload_signal(True)
+
+		 except Exception as e:
+		 	E("Error watching config: %s" % str(e))
+
+
+
+