From 86b03e698539d334965dd5a6410c4950c1a35d00 Mon Sep 17 00:00:00 2001 From: swrup Date: Sun, 12 Apr 2026 20:15:08 +0200 Subject: [PATCH] add unsupported media type response --- src/mte_tos.ml | 46 +++++++++++++++++++++++++--------------------- src/respond.ml | 1 + 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/mte_tos.ml b/src/mte_tos.ml index e8490aed..c20f3d65 100644 --- a/src/mte_tos.ml +++ b/src/mte_tos.ml @@ -83,32 +83,36 @@ let get_content t accept accept_language = | AnyMediaSubtype m -> Array.find_index (fun (m', _) -> m = m') supported_mimetypes in - let i = List.find_map find_lang_index accept_language in - let j = List.find_map find_mime_index accept in - (* TODO *) - let i = Option.get i in - let j = Option.get j in - (supported_languages.(i), supported_mimetypes.(j), content_matrix.(i).(j)) + let i_opt = List.find_map find_lang_index accept_language in + let j_opt = List.find_map find_mime_index accept in + match (i_opt, j_opt) with + | None, _ | _, None -> None + | Some i, Some j -> + Some + ( supported_languages.(i), + supported_mimetypes.(j), + content_matrix.(i).(j) ) let aux t req _server _env = let headers = Vifu.Request.headers req in if has_matching_etag (asset_etag t) headers then Respond.not_modified () else - let compression = select_encoding headers in - let language, mimetype, content = - get_content t (get_accept headers) (get_accept_language headers) - in - (* -- *) - let open Vifu.Response in - let open Syntax in - let* () = with_string ?compression req content in - let* () = add ~field:"etag" (asset_etag t) in - let* () = add ~field:"taler-terms-version" Cfg.terms_legal_version in - let* () = add ~field:"accept" (accept t) in - let* () = add ~field:"avail-languages" (avail_languages t) in - let* () = add ~field:"content-type" (Fmt.str "%a" pp_mimetype mimetype) in - let* () = add ~field:"content-language" language in - respond `OK + match get_content t (get_accept headers) (get_accept_language headers) with + | None -> Respond.unsupported_media_type () + | Some (language, mimetype, content) -> + let open Vifu.Response in + let open Syntax in + let compression = select_encoding headers in + let* () = with_string ?compression req content in + let* () = add ~field:"etag" (asset_etag t) in + let* () = add ~field:"taler-terms-version" Cfg.terms_legal_version in + let* () = add ~field:"accept" (accept t) in + let* () = add ~field:"avail-languages" (avail_languages t) in + let* () = + add ~field:"content-type" (Fmt.str "%a" pp_mimetype mimetype) + in + let* () = add ~field:"content-language" language in + respond `OK let terms req _server _env = Logs.info (fun m -> m "GET /terms"); diff --git a/src/respond.ml b/src/respond.ml index a5606866..45391b07 100644 --- a/src/respond.ml +++ b/src/respond.ml @@ -16,6 +16,7 @@ let bad_request () = empty `Bad_request let no_content () = empty `No_content let not_modified () = empty `Not_modified let not_implemented () = empty `Not_implemented +let unsupported_media_type () = empty `Unsupported_media_type let respond_json req jsont status body = Logs.info (fun m -> m "%a" pp_status status);