Merge branch 'master' into timeheap
[ashd.git] / python3 / ashd / scgi.py
1 class protoerr(Exception):
2     pass
3
4 def readns(sk):
5     hln = 0
6     while True:
7         c = sk.read(1)
8         if c == b':':
9             break
10         elif c >= b'0' or c <= b'9':
11             hln = (hln * 10) + (ord(c) - ord(b'0'))
12         else:
13             raise protoerr("Invalid netstring length byte: " + c)
14     ret = sk.read(hln)
15     if sk.read(1) != b',':
16         raise protoerr("Non-terminated netstring")
17     return ret
18
19 def readhead(sk):
20     parts = readns(sk).split(b'\0')[:-1]
21     if len(parts) % 2 != 0:
22         raise protoerr("Malformed headers")
23     ret = {}
24     i = 0
25     while i < len(parts):
26         ret[parts[i]] = parts[i + 1]
27         i += 2
28     return ret
29
30 def decodehead(head, coding):
31     return {k.decode(coding): v.decode(coding) for k, v in head.items()}