304.py (2318B)
1 # A header used to correlate requests and responses 2 state_header = b"content-language" 3 4 # Static ETag to use (and expect) 5 etag = b"abcdef" 6 7 def error(msg): 8 return (299, u"Client Error"), [ 9 (b'content-type', b'text/plain'), 10 (b'access-control-allow-origin', b"*"), 11 (b'access-control-expose-headers', state_header), 12 (b'cache-control', b'no-store') 13 ], msg 14 15 def main(request, response): 16 headers = [] 17 18 inm = request.headers.get(b'if-none-match', None) 19 raw_req_num = request.headers.get(state_header, None) 20 if raw_req_num == None: 21 return error(u"no req_num header in request") 22 else: 23 req_num = int(raw_req_num) 24 if req_num > 8: 25 return error(u"req_num %s out of range" % req_num) 26 27 headers.append((b"Access-Control-Expose-Headers", state_header)) 28 headers.append((state_header, req_num)) 29 headers.append((b"A", req_num)) 30 headers.append((b"B", req_num)) 31 32 if req_num % 2: # odd requests are the first in a test pair 33 if inm: 34 # what are you doing here? This should be a fresh request. 35 return error(u"If-None-Match on first request") 36 else: 37 status = 200, b"OK" 38 headers.append((b"Access-Control-Allow-Origin", b"*")) 39 headers.append((b"Content-Type", b"text/plain")) 40 headers.append((b"Cache-Control", b"private, max-age=3, must-revalidate")) 41 headers.append((b"ETag", etag)) 42 return status, headers, b"Success" 43 else: # even requests are the second in a pair, and should have a good INM. 44 if inm != etag: 45 # Bad browser. 46 if inm == None: 47 return error(u"If-None-Match missing") 48 else: 49 return error(u"If-None-Match '%s' mismatches") 50 else: 51 if req_num == 2: 52 pass # basic, vanilla check 53 elif req_num == 4: 54 headers.append((b"Access-Control-Expose-Headers", b"a, b")) 55 elif req_num == 6: 56 headers.append((b"Access-Control-Expose-Headers", b"a")) 57 elif req_num == 8: 58 headers.append((b"Access-Control-Allow-Origin", b"other.origin.example:80")) 59 status = 304, b"Not Modified" 60 return status, headers, b""