| import time |
| import json |
| import re |
| |
| def retrieve_from_stash(request, key, timeout, default_value): |
| t0 = time.time() |
| while time.time() - t0 < timeout: |
| time.sleep(0.5) |
| value = request.server.stash.take(key=key) |
| if value is not None: |
| return value |
| |
| return default_value |
| |
| def main(request, response): |
| op = request.GET.first("op"); |
| key = request.GET.first("reportID") |
| cookie_key = re.sub('^....', 'cccc', key) |
| count_key = re.sub('^....', 'dddd', key) |
| |
| try: |
| timeout = request.GET.first("timeout") |
| except: |
| timeout = 0.5 |
| timeout = float(timeout) |
| |
| if op == "retrieve_report": |
| return [("Content-Type", "application/json")], retrieve_from_stash(request, key, timeout, json.dumps({'error': 'No such report.' , 'guid' : key})) |
| |
| if op == "retrieve_cookies": |
| return [("Content-Type", "application/json")], "{ \"reportCookies\" : " + str(retrieve_from_stash(request, cookie_key, timeout, "\"None\"")) + "}" |
| |
| if op == "retrieve_count": |
| return [("Content-Type", "application/json")], json.dumps({'report_count': str(retrieve_from_stash(request, count_key, timeout, 0))}) |
| |
| # save cookies |
| if hasattr(request, 'cookies') and len(request.cookies.keys()) > 0: |
| # convert everything into strings and dump it into a dict so it can be jsoned |
| temp_cookies_dict = {} |
| for dict_key in request.cookies.keys(): |
| temp_cookies_dict[str(dict_key)] = str(request.cookies.get_list(dict_key)) |
| with request.server.stash.lock: |
| request.server.stash.take(key=cookie_key) |
| request.server.stash.put(key=cookie_key, value=json.dumps(temp_cookies_dict)) |
| |
| # save latest report |
| report = request.body |
| report.rstrip() |
| with request.server.stash.lock: |
| request.server.stash.take(key=key) |
| request.server.stash.put(key=key, value=report) |
| |
| with request.server.stash.lock: |
| # increment report count |
| count = request.server.stash.take(key=count_key) |
| if count is None: |
| count = 0 |
| count += 1 |
| request.server.stash.put(key=count_key, value=count) |
| |
| # return acknowledgement report |
| return [("Content-Type", "text/plain")], "Recorded report " + report |