Source code for duck.utils.headers
"""
Headers utilities module.
"""
from typing import Dict, List
[docs]
def parse_headers_from_bytes(data: bytes, delimiter: str = "\r\n") -> Dict[str, List[str]]:
"""
Parse headers from bytes and store all headers as lists, even if they appear once.
Args:
data (bytes): The raw header data in bytes format.
delimiter (str | bytes): Delimiter separating headers.
Returns:
Dict[str, List[str]]: A dictionary with header names as keys (in lowercase) and lists of their respective values.
"""
assert isinstance(data, bytes), "Only bytes is allowed as data."
delimiter = (delimiter.decode("utf-8") if isinstance(delimiter, bytes) else delimiter)
data = data.strip().decode("utf-8")
lines = data.split(delimiter)
headers: Dict[str, List[str]] = {}
# Parse each line and add to headers dictionary
for line in lines:
if ":" in line:
header, value = line.split(": ", 1)
header = header.strip().lower() # Normalize header to lowercase
value = value.strip()
# Ensure the header is always a list (even if it's not duplicated)
if header in headers:
headers[header].append(value)
else:
headers[header] = [value]
return headers