Mehari_lwt_unixAn IO module Mehari implementation for Unix and Windows using Lwt. Contains also extra features based on Unix filesystem such as CGI.
include Mehari_mirage.S with type addr = Ipaddr.tinclude Mehari.NET
with module IO := IO
and type addr = Ipaddr.t
and type clock := unit
with type addr = Ipaddr.tRate limiter. See Rate limit.
type middleware =
(addr Mehari.request -> Mehari.response IO.t) ->
addr Mehari.request ->
Mehari.response IO.tMiddlewares take a handler, and run some code before or after — producing a “bigger” handler. See Middleware.
val no_middleware : middlewareDoes nothing but call its inner handler. Useful for disabling middleware conditionally during application startup:
if development then
my_middleware
else
Mehari.no_middlewareval pipeline : middleware list -> middlewareCombines a list of middlewares into one, such that these two lines are equivalent: Mehari.pipeline [ mw1 ; mw2 ] @@ handler mw1 @@ mw2 @@ handler.
val router : route list -> addr Mehari.request -> Mehari.response IO.tCreates a router. If none of the routes match the Mehari.request, the router returns Mehari.not_found.
val route :
?rate_limit:rate_limiter ->
?mw:middleware ->
?regex:bool ->
string ->
(addr Mehari.request -> Mehari.response IO.t) ->
routeroute ~rate_limit ~mw ~regex path handler forwards requests for path to handler. path can be a string literal or a regex in Perl style depending of value of regex. If rate limit is in effect, handler is not executed and a respond with Mehari.status Mehari.slow_down is sended.
val scope :
?rate_limit:rate_limiter ->
?mw:middleware ->
string ->
route list ->
routescope ~rate_limit ~mw prefix routes groups routes under the path prefix, rate_limit and mw.
val no_route : routeA dummy value of type route that is completely ignored by the router. Useful for disabling routes conditionally during application start.
val virtual_hosts :
?meth:[ `ByURL | `SNI ] ->
(string * (addr Mehari.request -> Mehari.response IO.t)) list ->
addr Mehari.request ->
Mehari.response IO.tvirtual_hosts ?meth [(domain, handler); ...] produces a handler which enables virtual hosting at the TLS-layer using SNI.
meth can be used to choose which source to match the hostnames against. Defaults to `SNI.val make_rate_limit :
?period:int ->
int ->
[ `Second | `Minute | `Hour | `Day ] ->
rate_limiterSame as Mehari.NET.make_rate_limit but without the required trailing unit parameter.
Same as Mehari.NET.logger but without the required trailing unit parameter.
val respond : 'a Mehari.status -> 'a -> Mehari.response IO.tSame as Mehari.response, but the new Mehari.response is wrapped in a promise.
val respond_body : Mehari.body -> Mehari.mime -> Mehari.response IO.tSame as respond but respond with given Mehari.body and use given Mehari.mime as mime type.
val respond_text : string -> Mehari.response IO.tSame 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.tSame 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.tSame as Mehari.response_raw, but the new Mehari.response is wrapped in a promise.
include Mehari.FS
with module IO := IO
and type addr := addr
and type dir_path := stringtype handler = addr Mehari.request -> Mehari.response IO.tval response_document : ?mime:Mehari.mime -> string -> Mehari.response IO.tSame as Mehari.response but respond with content of given filename and use given Mehari.mime as mime type. If filename is not present on filesystem, responds with Mehari.not_found. If mime parameter is not supplied, use Mehari.no_mime as mime type.
val static :
?handler:(string -> handler) ->
?dir_listing:
(([ `Regular_file | `Directory | `Other ] * string) list -> handler) ->
?index:string ->
?show_hidden:bool ->
string ->
handlerstatic dir validates the path parameter (retrieved by calling Mehari.param req 1) by checking that it is relative and does not contain parent directory references. If these checks fail, responds with Mehari.not_found.
If the checks succeed, static calls handler path request, where path is the path generated by the concatenation of directory that was passed to static and path of request. handler defaults to response_document.
If a directory is requested, static will look for a file named index in that directory to return. Otherwise, a directory file listing will be generated by calling dir_listing [ filename; ... ] request. index is default on index.gmi.
show_hidden decides whether hidden files should be listed. It defaults to false for security reasons.
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.
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.trun_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.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.tSee Mehari_mirage.S.run.