mirror of
https://github.com/rembo10/headphones.git
synced 2026-01-15 01:08:44 -05:00
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
"""HTTP header parsing helpers."""
|
|
|
|
|
|
def _parse_param(s):
|
|
while s[:1] == ';':
|
|
s = s[1:]
|
|
end = s.find(';')
|
|
while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2:
|
|
end = s.find(';', end + 1)
|
|
if end < 0:
|
|
end = len(s)
|
|
f = s[:end]
|
|
yield f.strip()
|
|
s = s[end:]
|
|
|
|
|
|
def parse_header(line):
|
|
"""Parse a ``Content-Type`` like header.
|
|
|
|
Return the main ``Content-Type`` and a dictionary of options.
|
|
|
|
Copied from removed stdlib :mod:`cgi` module. See
|
|
`cherrypy/cherrypy#2014 (comment)
|
|
<https://github.com/cherrypy/cherrypy/issues/2014#issuecomment-1883774891>`_
|
|
for background.
|
|
"""
|
|
parts = _parse_param(';' + line)
|
|
key = parts.__next__()
|
|
pdict = {}
|
|
for p in parts:
|
|
i = p.find('=')
|
|
if i >= 0:
|
|
name = p[:i].strip().lower()
|
|
value = p[i + 1:].strip()
|
|
if len(value) >= 2 and value[0] == value[-1] == '"':
|
|
value = value[1:-1]
|
|
value = value.replace('\\\\', '\\').replace('\\"', '"')
|
|
pdict[name] = value
|
|
return key, pdict
|