aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlban Gruin2020-09-13 20:09:03 +0200
committerAlban Gruin2020-09-13 20:14:01 +0200
commit30927e57da3dc38a8216e1df557fd8b8110b7899 (patch)
treeccc714e11e767158339b4678d23d1bd93d60db59
parent05bb26f8f89625fde4f1c41931b501025dfc7695 (diff)
ucs: move the server to its own module
Signed-off-by: Alban Gruin <alban at pa1ch dot fr>
-rw-r--r--src/server.ml70
-rw-r--r--src/server.mli18
-rw-r--r--src/ucs.ml55
3 files changed, 89 insertions, 54 deletions
diff --git a/src/server.ml b/src/server.ml
new file mode 100644
index 0000000..a6f0617
--- /dev/null
+++ b/src/server.ml
@@ -0,0 +1,70 @@
+(*
+ * Copyright (C) 2020 Alban Gruin
+ *
+ * ucs is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ucs is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with ucs. If not, see <http://www.gnu.org/licenses/>.
+ *)
+
+open Lwt
+open Cohttp
+open Cohttp_lwt_unix
+
+let fetch celcat_url group =
+ let parameters = Uri.encoded_of_query
+ ["start", ["2020-09-01"]; "end", ["2020-10-01"];
+ "resType", ["103"]; "calView", ["month"];
+ "federationIds[]", [group]; "colourScheme", ["3"]] in
+ let body = Cohttp_lwt.Body.of_string parameters and
+ headers = Header.init_with "Content-Type" "application/x-www-form-urlencoded" in
+ Client.post ~body ~headers celcat_url
+ >>= fun (_resp, body) ->
+ Cohttp_lwt.Body.to_string body
+
+let log uri =
+ let datetime = CalendarLib.(
+ Printer.Calendar.sprint "%Y-%m-%d %H:%M:%S" @@ Calendar.now ()) in
+ Lwt_io.printlf "[%s] %s" datetime (Uri.path_and_query uri)
+
+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 serve base_url celcat_url mode =
+ let fetch = fetch celcat_url in
+ let callback _conn req _body =
+ let meth = Request.meth req and
+ uri = Request.uri req in
+ let path = Uri.path uri
+ |> Astring.String.cuts ~empty:false ~sep:"/"
+ |> List.map Uri.pct_decode and
+ query = Uri.query uri in
+ log uri >>= fun () ->
+ match meth, path, query with
+ | `GET, ([] | ["index.html"]), [] -> respond Pages.main
+ | `GET, ["lnk"], ["group", [group]] ->
+ let lnk = base_url ^ "/ics/" ^ group ^ ".ics" in
+ respond @@ Pages.link lnk
+ | `GET, ["lnk"], _ ->
+ Server.respond_string ~status:`Bad_request ~body:"Bad request\n" ()
+ | `GET, ["ics"; file], [] when Astring.String.is_suffix ~affix:".ics" file ->
+ let group = String.(sub file 0 (length file - 4)) in
+ fetch group >>= fun body ->
+ Course.decode body
+ |> Ics.to_string
+ |> respond ~mime:"text/calendar; charset=utf-8"
+ | `GET, _, _ ->
+ Server.respond_string ~status:`Not_found ~body:"Not found\n" ()
+ | _ ->
+ Server.respond_string
+ ~status:`Method_not_allowed ~body:"Method not allowed\n" () in
+ Server.create ~mode (Server.make ~callback ())
diff --git a/src/server.mli b/src/server.mli
new file mode 100644
index 0000000..af3f0e8
--- /dev/null
+++ b/src/server.mli
@@ -0,0 +1,18 @@
+(*
+ * Copyright (C) 2020 Alban Gruin
+ *
+ * ucs is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ucs is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with ucs. If not, see <http://www.gnu.org/licenses/>.
+ *)
+
+val serve : string -> Uri.t -> Conduit_lwt_unix.server -> unit Lwt.t
diff --git a/src/ucs.ml b/src/ucs.ml
index d4ff220..cd5f018 100644
--- a/src/ucs.ml
+++ b/src/ucs.ml
@@ -15,58 +15,5 @@
* along with ucs. If not, see <http://www.gnu.org/licenses/>.
*)
-open Lwt
-open Cohttp
-open Cohttp_lwt_unix
-
-let fetch group =
- let parameters = Uri.encoded_of_query
- ["start", ["2020-09-01"]; "end", ["2020-10-01"];
- "resType", ["103"]; "calView", ["month"];
- "federationIds[]", [group]; "colourScheme", ["3"]] in
- let body = Cohttp_lwt.Body.of_string parameters and
- headers = Header.init_with "Content-Type" "application/x-www-form-urlencoded" in
- Client.post ~body ~headers (Uri.of_string "https://edt.univ-tlse3.fr/calendar2/Home/GetCalendarData")
- >>= fun (_resp, body) ->
- Cohttp_lwt.Body.to_string body
-
-let log uri =
- let datetime = CalendarLib.(
- Printer.Calendar.sprint "%Y-%m-%d %H:%M:%S" @@ Calendar.now ()) in
- Lwt_io.printlf "[%s] %s" datetime (Uri.path_and_query uri)
-
-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 server =
- let callback _conn req _body =
- let meth = Request.meth req and
- uri = Request.uri req in
- let path = Uri.path uri
- |> Astring.String.cuts ~empty:false ~sep:"/"
- |> List.map Uri.pct_decode and
- query = Uri.query uri in
- log uri >>= fun () ->
- match meth, path, query with
- | `GET, ([] | ["index.html"]), [] -> respond Pages.main
- | `GET, ["lnk"], ["group", [group]] ->
- let lnk = "/ics/" ^ group ^ ".ics" in
- respond @@ Pages.link lnk
- | `GET, ["lnk"], _ ->
- Server.respond_string ~status:`Bad_request ~body:"Bad request\n" ()
- | `GET, ["ics"; file], [] when Astring.String.is_suffix ~affix:".ics" file ->
- let group = String.(sub file 0 (length file - 4)) in
- fetch group >>= fun body ->
- Course.decode body
- |> Ics.to_string
- |> respond ~mime:"text/calendar; charset=utf-8"
- | `GET, _, _ ->
- Server.respond_string ~status:`Not_found ~body:"Not found\n" ()
- | _ ->
- Server.respond_string
- ~status:`Method_not_allowed ~body:"Method not allowed\n" () in
- Server.create ~mode:(`TCP (`Port 8080)) (Server.make ~callback ())
-
let () =
- Lwt_main.run server
+ Lwt_main.run (Server.serve "/" (Uri.of_string "/") (`TCP (`Port 8080)))