From 6ee6819a74d185c1b9ce9e98c96cff1e330460f9 Mon Sep 17 00:00:00 2001 From: swrup Date: Thu, 6 Nov 2025 14:30:48 +0100 Subject: [PATCH] --- src/dune | 2 +- src/mte.ml | 4 ++-- unikernel/server.ml | 49 ++++++++++++++++++++++++++++++--------------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/dune b/src/dune index c58c8ebb..f92e1d16 100644 --- a/src/dune +++ b/src/dune @@ -1,4 +1,4 @@ (library (name mte) (wrapped false) - (libraries logs h2)) + (libraries logs h2 lwt)) diff --git a/src/mte.ml b/src/mte.ml index 483e14ae..f53defaa 100644 --- a/src/mte.ml +++ b/src/mte.ml @@ -39,8 +39,8 @@ let request_handler request = | [ "" ] -> let content = home_page_text in let headers = default_headers ~content `Text_plain in - { status= `OK; headers; content } + Lwt.return { status= `OK; headers; content } | _ -> let content = "Not found." in let headers = default_headers ~content `Text_plain in - { status= `Not_found; headers; content } + Lwt.return { status= `Not_found; headers; content } diff --git a/unikernel/server.ml b/unikernel/server.ml index 415c1757..874cc8ec 100644 --- a/unikernel/server.ml +++ b/unikernel/server.ml @@ -16,26 +16,43 @@ let http_1_1_request_handler reqd = let request = H1.Reqd.request reqd in Log.debug (fun m -> m "(HTTP/1.1) request-handler: %S" request.H1.Request.target); - let Mte.{ status; headers; content } = - Mte.request_handler (request_from_h1 ~scheme:"http" request) - in - let status = - match status with - | #H1.Status.t as status -> status - | _ -> Fmt.failwith "H2 status response on a H1 request" - in - let headers = H1.Headers.of_list (Headers.to_list headers) in - let response = H1.Response.create ~headers status in - H1.Reqd.respond_with_string reqd response content + Lwt.async @@ fun () -> + Lwt.catch + (fun () -> + let open Syntax in + let+ Mte.{ status; headers; content } = + Mte.request_handler (request_from_h1 ~scheme:"http" request) + in + let status = + match status with + | #H1.Status.t as status -> status + | _ -> Fmt.failwith "H2 status response on a H1 request" + in + let headers = H1.Headers.of_list (Headers.to_list headers) in + let response = H1.Response.create ~headers status in + H1.Reqd.respond_with_string reqd response content; + ()) + (fun exn -> + (* note: not sure what this does exactly, this is what is done in Dream *) + H1.Reqd.report_exn reqd exn; + Lwt.return_unit) let http_2_0_request_handler reqd = let request = H2.Reqd.request reqd in Log.debug (fun m -> m "(H2) request-handler: %S" request.H2.Request.target); - let Mte.{ status; headers; content } = - Mte.request_handler (request_from_h2 request) - in - let response = H2.Response.create ~headers status in - H2.Reqd.respond_with_string reqd response content + Lwt.async @@ fun () -> + Lwt.catch + (fun () -> + let open Syntax in + let+ Mte.{ status; headers; content } = + Mte.request_handler (request_from_h2 request) + in + let response = H2.Response.create ~headers status in + H2.Reqd.respond_with_string reqd response content; + ()) + (fun exn -> + H2.Reqd.report_exn reqd exn; + Lwt.return_unit) let alpn_request_handler : type reqd headers request response ro wo. reqd -> (reqd, headers, request, response, ro, wo) Alpn.protocol -> unit =