mirror of
https://github.com/rembo10/headphones.git
synced 2026-05-03 18:29:32 +01:00
39
lib/cherrypy/_private_api/compat/headers.py
Normal file
39
lib/cherrypy/_private_api/compat/headers.py
Normal file
@@ -0,0 +1,39 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user