Skip to content

Commit

Permalink
Add some convenients functions.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim-ats-d committed Jan 3, 2023
1 parent 37e741d commit c71ae2b
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 9 deletions.
8 changes: 6 additions & 2 deletions mehari-eio/mehari_eio.ml
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,20 @@ type middleware = handler -> handler
type route = Router.route
type rate_limiter = RateLimiter.t

let make_rate_limit = RateLimiter.make
let set_log_lvl = Logger.set_level
let logger = Logger.logger
let debug = Logger.debug
let info = Logger.info
let warning = Logger.warning
let error = Logger.error
let no_middleware = Router.no_middleware
let pipeline = Router.pipeline
let router = Router.router
let route = Router.route
let scope = Router.scope
let virtual_hosts = Router.virtual_hosts
let no_route = Router.no_route

let response_document = File.response_document
let virtual_hosts = Router.virtual_hosts
let make_rate_limit = RateLimiter.make
let run = Server.run
7 changes: 6 additions & 1 deletion mehari-mirage/mehari_mirage.ml
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,21 @@ module Make
Mehari.response_gemtext ?charset ?lang g |> IO.return

let respond_raw g = Mehari.response_raw g |> IO.return
let make_rate_limit = RateLimiter.make
let set_log_lvl = Logger.set_level
let logger = Logger.logger
let debug = Logger.debug
let info = Logger.info
let warning = Logger.warning
let error = Logger.error

let no_middleware = Router.no_middleware
let pipeline = Router.pipeline

let router = Router.router
let route = Router.route
let scope = Router.scope
let no_route = Router.no_route
let virtual_hosts = Router.virtual_hosts
let make_rate_limit = RateLimiter.make
let run = Server.run
end
4 changes: 4 additions & 0 deletions mehari/mehari.ml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ module type NET = sig
type handler = addr Request.t -> Response.t IO.t
type middleware = handler -> handler

val no_middleware : middleware
val pipeline : middleware list -> middleware
val router : route list -> handler

val route :
Expand All @@ -60,6 +62,8 @@ module type NET = sig
val scope :
?rate_limit:rate_limiter -> ?mw:middleware -> string -> route list -> route

val no_route : route

val make_rate_limit :
?period:int -> int -> [ `Second | `Minute | `Hour | `Day ] -> rate_limiter

Expand Down
30 changes: 28 additions & 2 deletions mehari/mehari.mli
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ assert ([ quote "hello\nworld" ] = [ quote "hello"; text "world" ])
val heading : [ `H1 | `H2 | `H3 ] -> string -> line
val list_item : string -> line
val quote : string -> line

val pp : Format.formatter -> t -> unit
end

Expand Down Expand Up @@ -264,7 +263,26 @@ module type NET = sig

type middleware = handler -> handler
(** Middlewares take a {!type:handler}, and run some code before or
after — producing a “bigger” {!type:handler}. *)
after — producing a “bigger” {!type:handler}. See
{!section-middleware}. *)

(** {1:middleware} Middleware *)

val no_middleware : middleware
(** Does nothing but call its inner handler. Useful for disabling middleware
conditionally during application startup:
{@ocaml[
if development then
my_middleware
else
Mehari.no_middleware
]} *)

val pipeline : middleware list -> middleware
(** Combines a list of middlewares into one, such that these two lines are
equivalent: [Mehari.pipeline [ mw1 ; mw2 ] @@ handler]
[ mw1 @@ mw2 @@ handler]. *)

(** {1:routing Routing} *)

Expand All @@ -290,6 +308,11 @@ module type NET = sig
(** [scope ~rate_limit ~mw prefix routes] groups [routes] under the path
[prefix], [rate_limit] and [mw]. *)

val no_route : route
(** A dummy value of type {!type:route} that is completely ignored by the
router. Useful for disabling routes conditionally during application
start. *)

(** {1:rate_limit Rate limit} *)

val make_rate_limit :
Expand Down Expand Up @@ -433,6 +456,8 @@ module Private : sig
type handler = addr Handler.Make(IO).t
type middleware = handler -> handler

val no_middleware : middleware
val pipeline : middleware list -> middleware
val router : route list -> handler

val route :
Expand All @@ -450,6 +475,7 @@ module Private : sig
route list ->
route

val no_route : route
val virtual_hosts : (string * handler) list -> handler
end

Expand Down
18 changes: 14 additions & 4 deletions mehari/router_impl.ml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ module type S = sig
type handler = addr Handler.Make(IO).t
type middleware = handler -> handler

val no_middleware : middleware
val pipeline : middleware list -> middleware
val router : route list -> handler

val route :
Expand All @@ -20,6 +22,7 @@ module type S = sig
val scope :
?rate_limit:rate_limiter -> ?mw:middleware -> string -> route list -> route

val no_route : route
val virtual_hosts : (string * handler) list -> handler
end

Expand All @@ -42,6 +45,8 @@ module Make (RateLimiter : Rate_limiter_impl.S) (Logger : Logger_impl.S) :
rate_limit : RateLimiter.t option;
}

let no_route = []

let route ?rate_limit ?(mw = Fun.id) ?(typ = `Raw) r handler =
[ { route = (typ, r); handler = mw handler; rate_limit } ]

Expand Down Expand Up @@ -98,6 +103,11 @@ module Make (RateLimiter : Rate_limiter_impl.S) (Logger : Logger_impl.S) :
handler req
| Some resp -> resp))

let scope ?rate_limit ?(mw = Fun.id) prefix routes =
List.concat routes
|> List.map (fun { route = typ, r; handler; _ } ->
{ route = (typ, prefix ^ r); handler = mw handler; rate_limit })

let virtual_hosts domains_handler req =
let req_host =
Request.uri req |> Uri.host
Expand All @@ -107,8 +117,8 @@ module Make (RateLimiter : Rate_limiter_impl.S) (Logger : Logger_impl.S) :
| None -> assert false (* Guaranteed by [Protocol.make_request]. *)
| Some (_, handler) -> handler req

let scope ?rate_limit ?(mw = Fun.id) prefix routes =
List.concat routes
|> List.map (fun { route = typ, r; handler; _ } ->
{ route = (typ, prefix ^ r); handler = mw handler; rate_limit })
let no_middleware h req = h req

let rec pipeline mws handler =
match mws with [] -> handler | m :: ms -> m (pipeline ms handler)
end

0 comments on commit c71ae2b

Please sign in to comment.