| from json import JSONEncoder, JSONDecoder |
| from base64 import b64decode |
| |
| def main(request, response): |
| uuid = request.GET.first("token", None) |
| if "querystate" in request.GET: |
| response.headers.set("Content-Type", "text/plain") |
| return JSONEncoder().encode(request.server.stash.take(uuid)) |
| |
| server_state = request.server.stash.take(uuid) |
| if not server_state: |
| server_state = [] |
| |
| requests = JSONDecoder().decode(b64decode(request.GET.first("info", ""))) |
| config = requests[len(server_state)] |
| |
| state = dict() |
| state["request_method"] = request.method |
| state["request_headers"] = dict([[h.lower(), request.headers[h]] for h in request.headers]) |
| server_state.append(state) |
| request.server.stash.put(uuid, server_state) |
| |
| note_headers = ['content-type', 'access-control-allow-origin', 'last-modified', 'etag'] |
| noted_headers = {} |
| for header in config.get('response_headers', []): |
| if header[0].lower() in ["location", "content-location"]: # magic! |
| header[1] = "%s&target=%s" % (request.url, header[1]) |
| response.headers.set(header[0], header[1]) |
| if header[0].lower() in note_headers: |
| noted_headers[header[0].lower()] = header[1] |
| |
| if "access-control-allow-origin" not in noted_headers: |
| response.headers.set("Access-Control-Allow-Origin", "*"); |
| if "content-type" not in noted_headers: |
| response.headers.set("Content-Type", "text/plain") |
| response.headers.set("Server-Request-Count", len(server_state)) |
| |
| code, phrase = config.get("response_status", [200, "OK"]) |
| |
| if request.headers.get("If-Modified-Since", False) == noted_headers.get('last-modified', True): |
| code, phrase = [304, "Not Modified"] |
| if request.headers.get("If-None-Match", False) == noted_headers.get('etag', True): |
| code, phrase = [304, "Not Modified"] |
| |
| response.status = (code, phrase) |
| |
| content = config.get("response_body", uuid) |
| if code in [204, 304]: |
| return "" |
| else: |
| return content |