let mimetype_ext_assoc = [ (("text", "plain"), ".txt"); (("text", "markdown"), ".md") ; (("text", "html"), ".html"); (("text", "html"), ".htm") ; (("application", "pdf"), ".pdf"); (("image", "jpeg"), ".jpg") ; (("image", "jpeg"), ".jpeg"); (("image", "png"), ".png") ; (("image", "gif"), ".gif") ] (* <> than the actual set of "supported" extension (which depends on config files) *) let all_known_mimetypes, all_known_extensions = List.split mimetype_ext_assoc let is_valid_filename path = Fpath.mem_ext all_known_extensions path let media_to_known_mimetype = function | Cohttp.Accept.MediaType (m, m_sub) -> List.find_opt (( = ) (m, m_sub)) all_known_mimetypes | AnyMediaSubtype m -> List.find_opt (fun (m', _) -> String.equal m m') all_known_mimetypes | AnyMedia -> Some Config.default_mimetype let mimetype_to_extension (m, m_sub) = assert (m <> "*"); assert (m_sub <> "*"); List.assoc_opt (m, m_sub) mimetype_ext_assoc let extension_to_mimetype ext = List.find_map (fun (mime, ext') -> match String.equal ext ext' with false -> None | true -> Some mime) mimetype_ext_assoc (* -- pretty printers -- *) let pp_mime fmt mime = Fmt.pf fmt "%s/%s" (fst mime) (snd mime) let pp_array pp_item item = Fmt.array ~sep:(Fmt.any ", ") pp_item item