package mehari

  1. Overview
  2. Docs

Source file mehari.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
type 'addr request = 'addr Request.t
type response = Response.t
type 'a status = 'a Response.status
type mime = Mime.t
type body = Response.body

module Gemtext = Gemtext

let paragraph = Gemtext.paragraph
let uri = Request.uri
let target = Request.target
let ip = Request.ip
let port = Request.port
let sni = Request.sni
let query = Request.query
let client_cert = Request.client_cert
let param = Request.param
let response = Response.response
let response_body = Response.response_body
let response_text = Response.response_text
let response_gemtext = Response.response_gemtext
let response_raw = Response.response_raw

include Response.Status

let string = Response.string
let gemtext = Response.gemtext
let lines = Response.lines
let seq = Response.seq
let stream = Response.stream
let page = Response.page
let make_mime = Mime.make_mime
let from_filename = Mime.from_filename
let from_content = Mime.from_content
let gemini = Mime.gemini
let app_octet_stream = Mime.app_octet_stream
let plaintext = Mime.plaintext
let text = Mime.text
let with_charset = Mime.with_charset

module type NET = sig
  module IO : Types.IO

  type route
  type rate_limiter
  type addr
  type handler = addr Request.t -> Response.t IO.t
  type middleware = handler -> handler
  type clock

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

  val route :
    ?rate_limit:rate_limiter ->
    ?mw:middleware ->
    ?regex:bool ->
    string ->
    handler ->
    route

  val scope :
    ?rate_limit:rate_limiter -> ?mw:middleware -> string -> route list -> route

  val no_route : route

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

  val virtual_hosts :
    ?meth:[ `ByURL | `SNI ] -> (string * handler) list -> handler

  val set_log_lvl : Logs.level -> unit
  val logger : clock -> handler -> handler
  val debug : 'a Logs.log
  val info : 'a Logs.log
  val warning : 'a Logs.log
  val error : 'a Logs.log
end

module type FS = sig
  module IO : Types.IO

  type addr
  type handler = addr Handler.Make(IO).t
  type dir_path

  val response_document : ?mime:mime -> dir_path -> response IO.t

  val static :
    ?handler:(dir_path -> handler) ->
    ?dir_listing:
      (([ `Regular_file | `Directory | `Other ] * string) list -> handler) ->
    ?index:string ->
    ?show_hidden:bool ->
    dir_path ->
    handler
end

module Private = struct
  module type IO = Types.IO
  module type ADDR = Types.ADDR
  module type PCLOCK = Types.PCLOCK

  type response_view = Response.view

  let view_of_resp = Response.view_of_resp

  module Cert = struct
    let get_certs ~exn_msg = function
      | default :: mult -> `Multiple_default (default, mult)
      | _ -> invalid_arg exn_msg
  end

  module CGI = Cgi
  module Handler = Handler
  module Logger_impl = Logger_impl
  module Protocol = Protocol
  module Rate_limiter_impl = Rate_limiter_impl
  module Router_impl = Router_impl
  module Static = Static
end
OCaml

Innovation. Community. Security.