from http import cookies as Cookie from scrapling.core._types import ( List, Dict, Tuple, ) def _CookieParser(cookie_string): # Errors will be handled on call so the log can be specified cookie_parser = Cookie.SimpleCookie() cookie_parser.load(cookie_string) for key, morsel in cookie_parser.items(): yield key, morsel.value def _ParseHeaders(header_lines: List[str], parse_cookies: bool = True) -> Tuple[Dict[str, str], Dict[str, str]]: """Parses headers into separate header and cookie dictionaries.""" header_dict = dict() cookie_dict = dict() for header_line in header_lines: if ":" not in header_line: if header_line.endswith(";"): header_key = header_line[:-1].strip() header_value = "" header_dict[header_key] = header_value else: raise ValueError(f"Could not parse header without colon: '{header_line}'.") else: header_key, header_value = header_line.split(":", 1) header_key = header_key.strip() header_value = header_value.strip() if parse_cookies: if header_key.lower() == "cookie": try: cookie_dict = {key: value for key, value in _CookieParser(header_value)} except Exception as e: # pragma: no cover raise ValueError(f"Could not parse cookie string from header '{header_value}': {e}") else: header_dict[header_key] = header_value else: header_dict[header_key] = header_value return header_dict, cookie_dict