tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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""