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