package mehari-lwt-unix

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

An IO module Mehari implementation for Unix and Windows using Lwt. Contains also extra features based on Unix filesystem such as CGI.

Net

include Mehari_mirage.S with type addr = Ipaddr.t
module IO = Lwt
type stack

TCP/IP stack.

Net

include Mehari.NET with module IO := IO and type addr = Ipaddr.t and type clock := unit with type addr = Ipaddr.t
type addr = Ipaddr.t
type route
type rate_limiter
type middleware = (addr Mehari.request -> Mehari.response IO.t) -> addr Mehari.request -> Mehari.response IO.t
val no_middleware : middleware
val pipeline : middleware list -> middleware
val router : route list -> addr Mehari.request -> Mehari.response IO.t
val route : ?rate_limit:rate_limiter -> ?mw:middleware -> ?regex:bool -> string -> (addr Mehari.request -> Mehari.response IO.t) -> route
val scope : ?rate_limit:rate_limiter -> ?mw:middleware -> string -> route list -> route
val no_route : route
val virtual_hosts : ?meth:[ `ByURL | `SNI ] -> (string * (addr Mehari.request -> Mehari.response IO.t)) list -> addr Mehari.request -> Mehari.response IO.t
val set_log_lvl : Logs.level -> unit
val debug : 'a Logs.log
val info : 'a Logs.log
val warning : 'a Logs.log
val error : 'a Logs.log

Rate limit

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

Same as Mehari.NET.make_rate_limit but without the required trailing unit parameter.

Logging

val logger : {handler}3 -> {handler}3

Same as Mehari.NET.logger but without the required trailing unit parameter.

Response

val respond : 'a Mehari.status -> 'a -> Mehari.response IO.t

Same as Mehari.response, but the new Mehari.response is wrapped in a promise.

val respond_body : Mehari.body -> Mehari.mime -> Mehari.response IO.t

Same as respond but respond with given Mehari.body and use given Mehari.mime as mime type.

val respond_text : string -> Mehari.response IO.t

Same as respond but respond with given text and use text/plain as Mehari.mime type.

val respond_gemtext : ?charset:string -> ?lang:string list -> Mehari.Gemtext.t -> Mehari.response IO.t

Same as respond but respond with given Mehari.Gemtext.t and use text/gemini as Mehari.mime type.

val respond_raw : [ `Body of string | `Full of int * string * string ] -> Mehari.response IO.t

Same as Mehari.response_raw, but the new Mehari.response is wrapped in a promise.

Entry point

include Mehari.FS with module IO := IO and type addr := addr and type dir_path := string
type handler = addr Mehari.request -> Mehari.response IO.t
val response_document : ?mime:Mehari.mime -> string -> Mehari.response IO.t
val static : ?handler:(string -> handler) -> ?dir_listing: (([ `Directory | `Other | `Regular_file ] * string) list -> handler) -> ?index:string -> ?show_hidden:bool -> string -> handler

CGI

Mehari supports CGI scripting as described in RFC 3875

The CGI script must write the gemini response to the stdout stream. Status code and meta string on the first line, and the optional response body on subsequent lines. The bytes generated by the CGI script will be forwarded verbatim to the Gemini client, without any additional modification by the server.

Environment Variables

Some variables are empty for compatibility with other CGI script.

Let's say that the url requested is gemini://localhost/cgi/foo.cgi?input:

  • AUTH_TYPE: CERTIFICATE if a client certificate is provided, empty otherwise.
  • CONTENT_LENGTH: Empty.
  • CONTENT_TYPE: Empty.
  • GATEWAY_INTERFACE: CGI/1.1.
  • PATH_INFO: Example value: /cgi/foo.cgi.
  • PATH_TRANSLATED: Example value: /cgi/foo.cgi.
  • QUERY_STRING: Example value: input.
  • REMOTE_ADDR: Example value: 127.0.0.1.
  • REMOTE_HOST: Same as REMOTE_ADDR.
  • REMOTE_IDENT: Empty.
  • REMOTE_METHOD: Empty.
  • REMOTE_USER: Client certificate common if it is provided, empty otherwise.
  • SCRIPT_NAME: Example value: /var/cgi/foo.cgi.
  • SERVER_NAME: Example value: /var/cgi/foo.cgi.
  • SERVER_PORT: Example value: 1965.
  • SERVER_PROTOCOL: GEMINI.
  • SERVER_SOFTWARE: Example value: Mehari/1.0.
val run_cgi : ?timeout:float -> ?nph:bool -> string -> addr Mehari.request -> Mehari.response Lwt.t

run_cgi ?timeout ?nph script_path req executes the given file as a CGI script and return a Mehari.response based on bytes printed on stdout by script. Responds with Mehari.cgi_error in case of error or timeout exceeding.

  • timeout defaults to 5.0.
  • nph decides if NPH (Non-Parsed Header) is enable. Defaults to false.

Entry point

val run_lwt : ?port:int -> ?verify_url_host:bool -> ?config:Tls.Config.server -> ?timeout:float -> certchains:Tls.Config.certchain list -> ?v4:Ipaddr.V4.Prefix.t -> ?v6:Ipaddr.V6.Prefix.t -> handler -> unit Lwt.t
val run : ?port:int -> ?verify_url_host:bool -> ?config:Tls.Config.server -> ?timeout:float -> certchains:Tls.Config.certchain list -> ?v4:Ipaddr.V4.Prefix.t -> ?v6:Ipaddr.V6.Prefix.t -> handler -> unit

Like run_lwt but calls Lwt_main.run internally.

OCaml

Innovation. Community. Security.