add content-type header

This commit is contained in:
Swrup 2025-09-28 19:37:49 +02:00
parent 0447857d1e
commit 06332cac8c
4 changed files with 66 additions and 57 deletions

View file

@ -23,18 +23,6 @@
- When returning a full response (not a "304 Not Modified"),
include a "Avail-Languages" header: a comma-separated list of the languages available *)
module Static = struct
let select_file headers kind =
let open Syntax in
let* ext =
Option.to_result ~none:"no acceptable mimetype"
(Headers.select_extension headers)
in
let* lang =
Option.to_result ~none:"no acceptable language"
(Headers.select_language headers)
in
Assets.get_content ~lang ~ext kind
let static kind req _server _env =
let get_ok = function
| Error e -> Fmt.failwith "TODO handle me, %s" e
@ -46,24 +34,28 @@ module Static = struct
in
let headers = Vif.Request.headers req in
let has_matching_etag =
get_ok
@@
match Vif.Headers.get headers "if-none-match" with
| None -> Ok false
| None -> false
| Some s ->
Headers.Etag.parse s |> Result.map (Headers.Etag.evaluate etag)
s |> Headers.Etag.parse |> get_ok |> Headers.Etag.evaluate etag
in
let open Vif.Response.Syntax in
match has_matching_etag with
| true ->
let open Vif.Response.Syntax in
let* () = Vif.Response.empty in
Vif.Response.respond `Not_modified
| false ->
let data = select_file headers kind |> get_ok in
let mime = Headers.select_mimetype headers |> get_ok in
let lang = Headers.select_language headers |> get_ok in
let compression = Headers.select_encoding headers in
let data = Assets.get_content ~mime ~lang kind in
(* -- *)
let open Vif.Response.Syntax in
let* () = Vif.Response.with_string ?compression req data in
let etag_field_value = Headers.Etag.to_field_value etag in
let* () = Vif.Response.add ~field:"etag" etag_field_value in
let* () =
let etag_field_value = Headers.Etag.to_field_value etag in
Vif.Response.add ~field:"etag" etag_field_value
in
let* () =
(* todo: is it "taler-privacy-version" for /policy ? *)
Vif.Response.add ~field:"taler-terms-version"
@ -73,9 +65,9 @@ module Static = struct
Vif.Response.add ~field:"avail-languages"
Headers.avail_languages_header_value
in
(* TODO content-type *)
let* () =
Vif.Response.add ~field:"content-type" "html; charset=utf-8"
let content_type = Fmt.str "%s/%s" (fst mime) (snd mime) in
Vif.Response.add ~field:"content-type" content_type
in
Vif.Response.respond `OK