mte/src/headers.ml

47 lines
1.6 KiB
OCaml
Raw Normal View History

2025-09-28 22:12:16 +02:00
let accept_header_value =
let s = Fmt.str "%a" Util.(pp_array pp_mime) Assets.supported_mimetype_arr in
s
2025-09-28 18:36:25 +02:00
let avail_languages_header_value =
2025-09-28 22:12:16 +02:00
let s = Fmt.str "%a" (Util.pp_array Fmt.string) Assets.supported_lang_arr in
2025-09-28 18:36:25 +02:00
s
2025-09-28 19:37:49 +02:00
let select_mimetype headers =
2025-09-27 23:49:59 +02:00
let accept = Vif.Headers.get headers "accept" in
Cohttp.Accept.media_ranges accept
|> Cohttp.Accept.qsort
2025-09-28 19:37:49 +02:00
|> List.filter_map (fun (_q, (m, _p)) -> Util.media_to_known_mimetype m)
|> List.find_opt Assets.is_supported_mimetype
2025-09-27 23:49:59 +02:00
let select_language headers =
let accept_language = Vif.Headers.get headers "accept-language" in
Cohttp.Accept.languages accept_language
|> Cohttp.Accept.qsort
|> List.map (fun (_q, lang) -> lang)
|> List.map (function
| Cohttp.Accept.AnyLanguage -> Config.default_lang
| Language language_range -> (
(* ignore language subtags (e.g. "en-US" -> "en") *)
match language_range with
| [] -> assert false
| primary_tag :: _ -> primary_tag))
|> List.find_opt Assets.is_supported_lang
2025-09-28 22:12:16 +02:00
|> Option.value ~default:Config.default_lang
2025-09-27 23:49:59 +02:00
let select_encoding headers =
Vif.Headers.get headers "accept-encoding"
|> Cohttp.Accept.encodings
|> Cohttp.Accept.qsort
|> List.map snd
|> List.filter_map (function
| Cohttp.Accept.Identity -> Some `Identity
| Deflate -> Some `DEFLATE
| Gzip -> Some `Gzip
| AnyEncoding -> Some Config.default_encoding
| Encoding _ | Compress -> (* unsupported *) None)
|> function
| [] -> assert false
| `Identity :: _ -> None
| `DEFLATE :: _ -> Some `DEFLATE
| `Gzip :: _ -> Some `Gzip