From 666a08c46e2690f4564a12bc8f1dd650471195ac Mon Sep 17 00:00:00 2001 From: swrup Date: Thu, 12 Feb 2026 12:45:07 +0100 Subject: [PATCH] --- src/headers.ml | 6 ------ src/respond.ml | 9 ++++++++ src/static.ml | 56 ++++++++++++++++++++++++++++---------------------- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/headers.ml b/src/headers.ml index fd6ebfc7..e3fccd79 100644 --- a/src/headers.ml +++ b/src/headers.ml @@ -12,9 +12,6 @@ let select_mimetype headers = Cohttp.Accept.media_ranges opt |> Cohttp.Accept.qsort |> List.find_map (fun (_q, (m, _p)) -> Assets.Mimetype.of_cohttp m) - |> function - | None -> Assets.Mimetype.default - | Some mime -> mime let select_language headers = let opt = Vif.Headers.get headers "accept-language" in @@ -22,9 +19,6 @@ let select_language headers = |> Cohttp.Accept.qsort |> List.map snd |> List.find_map Assets.Language.of_cohttp - |> function - | None -> Assets.Language.default - | Some lang -> lang let select_encoding headers = let opt = Vif.Headers.get headers "accept-encoding" in diff --git a/src/respond.ml b/src/respond.ml index ea17f7f7..a5388635 100644 --- a/src/respond.ml +++ b/src/respond.ml @@ -24,6 +24,15 @@ let bad_request ?hint req = let body = mk_error_content ?hint `Bad_request in respond_json req body `Bad_request +let unsupported_media_type req = + Logs.err (fun m -> m "unsupported media type"); + let open Vif.Response in + let open Syntax in + let* () = add ~field:"accept" Headers.accept_header_value in + let* () = add ~field:"avail-languages" Headers.avail_languages_header_value in + let body = mk_error_content `Unsupported_media_type in + respond_json req body `Unsupported_media_type + let ok content req = Logs.debug (fun m -> m "ok"); respond_json req content `OK diff --git a/src/static.ml b/src/static.ml index 6d556931..23367426 100644 --- a/src/static.ml +++ b/src/static.ml @@ -13,31 +13,37 @@ let aux asset req _server _env = match has_matching_etag with | Error e -> Respond.bad_request ~hint:e req | Ok true -> Respond.not_modified () - | Ok false -> - let mime = Headers.select_mimetype headers in - let lang = Headers.select_language headers in - let compression = Headers.select_encoding headers in - let data = Assets.get_content ~mime ~lang asset in - (* -- *) - let open Vif.Response in - let open Syntax in - let* () = with_string ?compression req data in - let* () = - let etag_field_value = Headers_lib.Etag.to_field_string etag in - add ~field:"etag" etag_field_value - in - let* () = - (* todo: is it "taler-privacy-version" for /policy ? *) - add ~field:"taler-terms-version" (Assets.legal_version asset) - in - let* () = - add ~field:"avail-languages" Headers.avail_languages_header_value - in - let* () = - let content_type = Fmt.str "%a" Assets.Mimetype.pp mime in - add ~field:"content-type" content_type - in - respond `OK + | Ok false -> ( + match Headers.select_mimetype headers with + | None -> Respond.unsupported_media_type req + | Some mime -> + let lang = + Headers.select_language headers + |> Option.value ~default:Assets.Language.default + in + let compression = Headers.select_encoding headers in + let data = Assets.get_content ~mime ~lang asset in + (* -- *) + let open Vif.Response in + let open Syntax in + let* () = with_string ?compression req data in + let* () = + let etag_field_value = Headers_lib.Etag.to_field_string etag in + add ~field:"etag" etag_field_value + in + let* () = add ~field:"accept" Headers.accept_header_value in + let* () = + add ~field:"avail-languages" Headers.avail_languages_header_value + in + let* () = + (* todo: is it "taler-privacy-version" for /policy ? *) + add ~field:"taler-terms-version" (Assets.legal_version asset) + in + let* () = + let content_type = Fmt.str "%a" Assets.Mimetype.pp mime in + add ~field:"content-type" content_type + in + respond `OK) let terms req _server _env = Logs.info (fun m -> m "GET /terms");