# HG changeset patch # User Matt Johnston # Date 1433863751 -28800 # Node ID 03e540c3ec2460b42f663948108530ce76199230 # Parent d0c29436bb63c1e073239640069e42b819628f28 fix server side long polling diff -r d0c29436bb63 -r 03e540c3ec24 web/config.py --- a/web/config.py Tue Jun 09 21:22:10 2015 +0800 +++ b/web/config.py Tue Jun 09 23:29:11 2015 +0800 @@ -56,6 +56,8 @@ # 1 hour CSRF_TIMEOUT = 3600 +LONG_POLL_TIMEOUT = 500 + try: from localconfig import * except ImportError: diff -r d0c29436bb63 -r 03e540c3ec24 web/log.py --- a/web/log.py Tue Jun 09 21:22:10 2015 +0800 +++ b/web/log.py Tue Jun 09 23:29:11 2015 +0800 @@ -247,8 +247,8 @@ tick_secs = int(entries['tick_secs']) return val_ticks + float(val_rem) * tick_secs / tick_wake -def write_current_params(current_params): - fridge_settings.update(current_params) +def write_current_params(current_params, current_epoch): + fridge_settings.update(current_params, current_epoch) def read_current_params(): params, epochtag = fridge_settings.get() diff -r d0c29436bb63 -r 03e540c3ec24 web/settings.py --- a/web/settings.py Tue Jun 09 21:22:10 2015 +0800 +++ b/web/settings.py Tue Jun 09 23:29:11 2015 +0800 @@ -2,6 +2,9 @@ import fcntl import hashlib +import binascii +import os + class Settings(object): RAND_SIZE = 15 # 120 bits @@ -22,7 +25,7 @@ self.epoch = None self.tag = None - self.update(self, None, 'startepoch') + self.update(None, 'startepoch') def wait(self, epoch_tag = None, timeout = None): """ returns false if the timeout was hit """ diff -r d0c29436bb63 -r 03e540c3ec24 web/templog.py --- a/web/templog.py Tue Jun 09 21:22:10 2015 +0800 +++ b/web/templog.py Tue Jun 09 23:29:11 2015 +0800 @@ -163,12 +163,16 @@ req_etag = request.headers.get('etag', None) if req_etag: # wait for it to change - if not log.fridge_settings.wait(req_etag, timeout=LONG_POLL_TIMEOUT): - response.status = 304 - return "Nothing happened" + # XXX this is meant to return True if it has been woken up + # but it isn't working. Instead compare epochtag below. + log.fridge_settings.wait(req_etag, timeout=config.LONG_POLL_TIMEOUT) + + contents, epoch_tag = log.fridge_settings.get() + if epoch_tag == req_etag: + response.status = 304 + return "Nothing happened" response.set_header('Content-Type', 'application/json') - contents, epoch_tag = client_settings.get() return json.dumps({'params': contents, 'epoch_tag': epoch_tag}) @bottle.get('/')