aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlban Gruin2020-12-30 17:40:57 +0100
committerAlban Gruin2020-12-30 17:40:57 +0100
commit3e9d3b3437f2d63a47f9c962ba9187c5ef692328 (patch)
tree8b1f5e122ac9caeff3f56849a516e7b10d788d80
parent8dff924f4d598da653794e29fb9929017e161aa3 (diff)
ics: print the timezone name in the ICS file
Add the correct timezone in generated ICS files. The timezone is fetched from /etc/timezone. Even though this is not standard, if a tool needs it, it should be able to understand it correctly. Signed-off-by: Alban Gruin <alban at pa1ch dot fr>
-rw-r--r--src/ics.ml14
-rw-r--r--src/ics.mli2
-rw-r--r--src/server.ml15
3 files changed, 28 insertions, 3 deletions
diff --git a/src/ics.ml b/src/ics.ml
index 6dd747d..d1bb808 100644
--- a/src/ics.ml
+++ b/src/ics.ml
@@ -61,8 +61,19 @@ type t = Event.t list
let make events = events
-let to_string events =
+let gen_vtimezone tz =
+ if tz <> "" then
+ ["BEGIN:VTIMEZONE";
+ "TZID:" ^ tz;
+ "END:VTIMEZONE\n"]
+ |> List.map ics_split_line
+ |> String.concat "\n"
+ else
+ ""
+
+let to_string tz events =
let date = current_date () in
+ let vtimezone = gen_vtimezone tz in
let rec gen_events id str = function
| [] -> str
| event :: l ->
@@ -70,5 +81,6 @@ let to_string events =
"BEGIN:VCALENDAR\n\
VERSION:2.0\n\
PRODID:-//ucs//\n"
+ ^ vtimezone
^ gen_events 0 "" events
^ "END:VCALENDAR\n"
diff --git a/src/ics.mli b/src/ics.mli
index 219f851..a4cbbd6 100644
--- a/src/ics.mli
+++ b/src/ics.mli
@@ -26,4 +26,4 @@ end
type t
val make : Event.t list -> t
-val to_string : t -> string
+val to_string : string -> t -> string
diff --git a/src/server.ml b/src/server.ml
index d3cf00e..c1a0ba9 100644
--- a/src/server.ml
+++ b/src/server.ml
@@ -47,7 +47,20 @@ let respond ?(mime="text/html; charset=utf-8") ?(status=`OK) body =
let headers = Header.init_with "Content-Type" mime in
Server.respond_string ~status ~body ~headers ()
+let get_tz () =
+ Lwt_unix.file_exists "/etc/timezone" >>= fun exists ->
+ if exists then
+ Lwt_io.(open_file ~mode:Input "/etc/timezone") >>= fun file ->
+ Lwt.finalize
+ (fun () ->
+ Lwt_io.read file >|=
+ String.trim)
+ (fun () -> Lwt_io.close file)
+ else
+ Lwt.return ""
+
let serve base_url celcat_url mode stop =
+ get_tz () >>= fun tzname ->
let fetch = fetch celcat_url in
let callback _conn req _body =
let meth = Request.meth req and
@@ -68,7 +81,7 @@ let serve base_url celcat_url mode stop =
let group = String.(sub file 0 (length file - 4)) in
fetch group >>= fun body ->
Course.decode body
- |> Ics.to_string
+ |> Ics.to_string tzname
|> respond ~mime:"text/calendar; charset=utf-8"
| `GET, _, _ ->
Server.respond_string ~status:`Not_found ~body:"Not found\n" ()