You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Bebop/bebop/mime.py

45 lines
1.2 KiB

"""Basic MIME utilities (RFC 2046)."""
from dataclasses import dataclass
from typing import Optional
DEFAULT_CHARSET = "utf-8"
@dataclass
class MimeType:
main_type: str
sub_type: str
parameters: dict
@property
def short(self):
return f"{self.main_type or '*'}/{self.sub_type or '*'}"
@property
def charset(self):
return self.parameters.get("charset", DEFAULT_CHARSET)
@staticmethod
def from_str(mime_string) -> Optional["MimeType"]:
"""Parse a MIME string into a MimeType instance, or None on error."""
if ";" in mime_string:
type_str, *param_strs = mime_string.split(";")
parameters = {}
for param in map(lambda s: s.strip().lower(), param_strs):
if param.count("=") != 1:
return None
param_name, param_value = param.split("=")
parameters[param_name] = param_value
else:
type_str = mime_string.strip()
parameters = {}
if type_str.count("/") != 1:
return None
main_type, sub_type = type_str.split("/")
return MimeType(main_type, sub_type, parameters)
DEFAULT_MIME_TYPE = MimeType("text", "gemini", {"charset": DEFAULT_CHARSET})