diff --git a/dev/tiny_httpd/Tiny_httpd_dir/Embedded_fs/index.html b/dev/tiny_httpd/Tiny_httpd_dir/Embedded_fs/index.html new file mode 100644 index 00000000..f62ccfb8 --- /dev/null +++ b/dev/tiny_httpd/Tiny_httpd_dir/Embedded_fs/index.html @@ -0,0 +1,2 @@ + +
Tiny_httpd_dir.Embedded_fsAn embedded file system, as a list of files with (relative) paths. This is useful in combination with the "tiny-httpd-mkfs" tool, which embeds the files it's given into a OCaml module.
val create : ?mtime:float -> unit -> tval add_file : ?mtime:float -> t -> path:string -> string -> unitAdd file to the virtual file system.
Tiny_httpd_dir.VFSVirtual file system.
This is used to emulate a file system from pure OCaml functions and data, e.g. for resources bundled inside the web server.
file_exists vfs path returns true if path points to a file or directory inside vfs.
List directory. This only returns basenames, the files need to be put in the directory path using Filename.concat.
Create a file and obtain a pair write, close
val read_file_content : string -> Tiny_httpd_stream.tRead content of a file
Tiny_httpd_html_.AAttributes.
This module contains combinator for the standard attributes. One can also just use a pair of strings.
type t = string -> attributeAttribute builder
val accept : tAttribute "accept".
val accept_charset : tAttribute "accept-charset".
val accesskey : tAttribute "accesskey".
val action : tAttribute "action".
val align : tAttribute "align".
val allow : tAttribute "allow".
val alt : tAttribute "alt".
val async : tAttribute "async".
val autocapitalize : tAttribute "autocapitalize".
val autocomplete : tAttribute "autocomplete".
val autofocus : tAttribute "autofocus".
val autoplay : tAttribute "autoplay".
val buffered : tAttribute "buffered".
val capture : tAttribute "capture".
val challenge : tAttribute "challenge".
val charset : tAttribute "charset".
val checked : tAttribute "checked".
val cite : tAttribute "cite".
val class_ : tAttribute "class".
val code : tAttribute "code".
val codebase : tAttribute "codebase".
val cols : tAttribute "cols".
val colspan : tAttribute "colspan".
val content : tAttribute "content".
val contenteditable : tAttribute "contenteditable".
Attribute "contextmenu".
val controls : tAttribute "controls".
val coords : tAttribute "coords".
val crossorigin : tAttribute "crossorigin".
val csp : tAttribute "csp".
val data : tAttribute "data".
val data_star : tAttribute "data-*".
val datetime : tAttribute "datetime".
val decoding : tAttribute "decoding".
val default : tAttribute "default".
val defer : tAttribute "defer".
val dir : tAttribute "dir".
val dirname : tAttribute "dirname".
val disabled : tAttribute "disabled".
val download : tAttribute "download".
val draggable : tAttribute "draggable".
val enctype : tAttribute "enctype".
val enterkeyhint : tAttribute "enterkeyhint".
val for_ : tAttribute "for".
val form : tAttribute "form".
val formaction : tAttribute "formaction".
val formenctype : tAttribute "formenctype".
val formmethod : tAttribute "formmethod".
val formnovalidate : tAttribute "formnovalidate".
val formtarget : tAttribute "formtarget".
val headers : tAttribute "headers".
Attribute "hidden".
val high : tAttribute "high".
val href : tAttribute "href".
val hreflang : tAttribute "hreflang".
val http_equiv : tAttribute "http-equiv".
val icon : tAttribute "icon".
val id : tAttribute "id".
val importance : tAttribute "importance".
val integrity : tAttribute "integrity".
val ismap : tAttribute "ismap".
val itemprop : tAttribute "itemprop".
val keytype : tAttribute "keytype".
val kind : tAttribute "kind".
val label : tAttribute "label".
val lang : tAttribute "lang".
val language : tAttribute "language".
val list : tAttribute "list".
val loop : tAttribute "loop".
val low : tAttribute "low".
val manifest : tAttribute "manifest".
val max : tAttribute "max".
val maxlength : tAttribute "maxlength".
val minlength : tAttribute "minlength".
val media : tAttribute "media".
val method_ : tAttribute "method".
val min : tAttribute "min".
val multiple : tAttribute "multiple".
val muted : tAttribute "muted".
val name : tAttribute "name".
val novalidate : tAttribute "novalidate".
val open_ : tAttribute "open".
val optimum : tAttribute "optimum".
val pattern : tAttribute "pattern".
val ping : tAttribute "ping".
val placeholder : tAttribute "placeholder".
val poster : tAttribute "poster".
val preload : tAttribute "preload".
val radiogroup : tAttribute "radiogroup".
val readonly : tAttribute "readonly".
val referrerpolicy : tAttribute "referrerpolicy".
val rel : tAttribute "rel".
val required : tAttribute "required".
val reversed : tAttribute "reversed".
val rows : tAttribute "rows".
val rowspan : tAttribute "rowspan".
val sandbox : tAttribute "sandbox".
val scope : tAttribute "scope".
val scoped : tAttribute "scoped".
val selected : tAttribute "selected".
val shape : tAttribute "shape".
val size : tAttribute "size".
val sizes : tAttribute "sizes".
val slot : tAttribute "slot".
val span : tAttribute "span".
val spellcheck : tAttribute "spellcheck".
val src : tAttribute "src".
val srcdoc : tAttribute "srcdoc".
val srclang : tAttribute "srclang".
val srcset : tAttribute "srcset".
val start : tAttribute "start".
val step : tAttribute "step".
val style : tAttribute "style".
val summary : tAttribute "summary".
val tabindex : tAttribute "tabindex".
val target : tAttribute "target".
val title : tAttribute "title".
val translate : tAttribute "translate".
val text : tAttribute "Text".
val type_ : tAttribute "type".
val usemap : tAttribute "usemap".
val value : tAttribute "value".
val width : tAttribute "width".
val wrap : tAttribute "wrap".
Tiny_httpd_html_.OutOutput for HTML combinators.
This output type is used to produce a string reasonably efficiently from a tree of combinators.
NOTE: this is experimental and an unstable API.
val create_of_buffer : Stdlib.Buffer.t -> tval create_of_out : Tiny_httpd_io.Output.t -> tval flush : t -> unitval add_char : t -> char -> unitval add_string : t -> string -> unitval add_format_nl : t -> unitval with_no_format_nl : t -> (unit -> 'a) -> 'aTiny_httpd_io.InputInput channel (byte source)
type t = {input : bytes -> int -> int -> int;Read into the slice. Returns 0 only if the channel is closed.
close : unit -> unit;Close the input. Must be idempotent.
*)}An input channel, i.e an incoming stream of bytes.
This can be a string, an int_channel, an Unix.file_descr, a decompression wrapper around another input channel, etc.
val of_in_channel : ?close_noerr:bool -> Stdlib.in_channel -> tval of_unix_fd : ?close_noerr:bool -> Unix.file_descr -> tval input : t -> bytes -> int -> int -> intRead into the given slice.
val close : t -> unitClose the channel.
Tiny_httpd_io.OutputOutput channel (byte sink)
type t = {output_char : char -> unit;Output a single char
*)output : bytes -> int -> int -> unit;Output slice
*)flush : unit -> unit;Flush underlying buffer
*)close : unit -> unit;Close the output. Must be idempotent.
*)}An output channel, ie. a place into which we can write bytes.
This can be a Buffer.t, an out_channel, a Unix.file_descr, etc.
val of_out_channel : ?close_noerr:bool -> Stdlib.out_channel -> tof_out_channel oc wraps the channel into a Output.t.
val of_buffer : Stdlib.Buffer.t -> tof_buffer buf is an output channel that writes directly into buf. flush and close have no effect.
val output_char : t -> char -> unitOutput the buffer slice into this channel
val output : t -> bytes -> int -> int -> unitOutput the buffer slice into this channel
val output_string : t -> string -> unitval close : t -> unitClose the channel.
val flush : t -> unitFlush (ie. force write) any buffered bytes.
Tiny_httpd_io.TCP_serverA TCP server abstraction.
type t = {endpoint : unit -> string * int;Endpoint we listen on. This can only be called from within serve.
active_connections : unit -> int;Number of connections currently active
*)running : unit -> bool;Is the server currently running?
*)stop : unit -> unit;Ask the server to stop. This might not take effect immediately, and is idempotent. After this server.running() must return false.
}A running TCP server.
This contains some functions that provide information about the running server, including whether it's active (as opposed to stopped), a function to stop it, and statistics about the number of connections.
type builder = {serve : after_init:(t -> unit) -> handle:conn_handler -> unit -> unit;Blocking call to listen for incoming connections and handle them. Uses the connection handler handle to handle individual client connections in individual threads/fibers/tasks.
}A TCP server builder implementation.
Calling builder.serve ~after_init ~handle () starts a new TCP server on an unspecified endpoint (most likely coming from the function returning this builder) and returns the running server.
Tiny_httpd_io.WriterA writer abstraction.
Writer.
A writer is a push-based stream of bytes. Give it an output channel and it will write the bytes in it.
This is useful for responses: an http endpoint can return a writer as its response's body, and output into it as if it were a regular out_channel, including controlling calls to flush.
val empty : tEmpty writer, will output 0 bytes.
val of_string : string -> tA writer that just emits the bytes from the given string.
Tiny_httpd_server.HeadersThe header files of a request or response.
Neither the key nor the value can contain '\r' or '\n'. See https://tools.ietf.org/html/rfc7230#section-3.2
val empty : tEmpty list of headers.
val get : ?f:(string -> string) -> string -> t -> string optionget k headers looks for the header field with key k.
set k v headers sets the key k to value v. It erases any previous entry for k
val contains : string -> t -> boolIs there a header with the given key?
val pp : Stdlib.Format.formatter -> t -> unitPretty print the headers.
Tiny_httpd_server.MethA HTTP method. For now we only handle a subset of these.
See https://tools.ietf.org/html/rfc7231#section-4
val pp : Stdlib.Format.formatter -> t -> unitval to_string : t -> stringTiny_httpd_server.Middlewaretype handler = byte_stream Request.t -> resp:(Response.t -> unit) -> unitHandlers are functions returning a response to a request. The response can be delayed, hence the use of a continuation as the resp parameter.
A middleware is a handler transformation.
It takes the existing handler h, and returns a new one which, given a query, modify it or log it before passing it to h, or fail. It can also log or modify or drop the response.
val nil : tTrivial middleware that does nothing.
Tiny_httpd_server.Requesttype 'body t = private {meth : Meth.t;HTTP method for this request.
*)host : string;client_addr : Unix.sockaddr;Client address. Available since NEXT_RELEASE.
*)headers : Headers.t;List of headers.
*)http_version : int * int;HTTP version. This should be either 1, 0 or 1, 1.
path : string;Full path of the requested URL.
*)path_components : string list;Components of the path of the requested URL.
*)query : (string * string) list;Query part of the requested URL.
*)body : 'body;Body of the request.
*)start_time : float;}A request with method, path, host, headers, and a body, sent by a client.
The body is polymorphic because the request goes through several transformations. First it has no body, as only the request and headers are read; then it has a stream body; then the body might be entirely read as a string via read_body_full.
val pp : Stdlib.Format.formatter -> string t -> unitPretty print the request and its body. The exact format of this printing is not specified.
val pp_ : Stdlib.Format.formatter -> _ t -> unitPretty print the request without its body. The exact format of this printing is not specified.
val get_header : ?f:(string -> string) -> _ t -> string -> string optionget_header req h looks up header h in req. It returns None if the header is not present. This is case insensitive and should be used rather than looking up h verbatim in headers.
val get_header_int : _ t -> string -> int optionSame as get_header but also performs a string to integer conversion.
set_header k v req sets k: v in the request req's headers.
Modify headers using the given function.
val host : _ t -> stringHost field of the request. It also appears in the headers.
val path : _ t -> stringRequest path.
val body : 'b t -> 'bRequest body, possibly empty.
val start_time : _ t -> floattime stamp (from Unix.gettimeofday) after parsing the first line of the request
val limit_body_size : max_size:int -> byte_stream t -> byte_stream tLimit the body size to max_size bytes, or return a 413 error.
val read_body_full :
+ ?buf:Tiny_httpd_buf.t ->
+ ?buf_size:int ->
+ byte_stream t ->
+ string tRead the whole body into a string. Potentially blocking.
Tiny_httpd_server.Responsetype body = [ | `String of string| `Stream of byte_stream| `Writer of Tiny_httpd_io.Writer.t| `Void ]Body of a response, either as a simple string, or a stream of bytes, or nothing (for server-sent events notably).
`String str replies with a body set to this string, and a known content-length.`Stream str replies with a body made from this string, using chunked encoding.`Void replies with no body.`Writer w replies with a body created by the writer w, using a chunked encoding. It is available since NEXT_RELEASE.type t = private {code : Response_code.t;headers : Headers.t;Headers of the reply. Some will be set by Tiny_httpd automatically.
body : body;Body of the response. Can be empty.
*)}A response to send back to a client.
val set_code : Response_code.t -> t -> tSet the response code.
val make_raw : ?headers:Headers.t -> code:Response_code.t -> string -> tMake a response from its raw components, with a string body. Use "" to not send a body at all.
val make_raw_stream :
+ ?headers:Headers.t ->
+ code:Response_code.t ->
+ byte_stream ->
+ tSame as make_raw but with a stream body. The body will be sent with the chunked transfer-encoding.
val make :
+ ?headers:Headers.t ->
+ ?code:int ->
+ (body, Response_code.t * string) Stdlib.result ->
+ tmake r turns a result into a response.
make (Ok body) replies with 200 and the body.make (Error (code,msg)) replies with the given error code and message as body.val make_string :
+ ?headers:Headers.t ->
+ ?code:int ->
+ (string, Response_code.t * string) Stdlib.result ->
+ tSame as make but with a string body.
val make_writer :
+ ?headers:Headers.t ->
+ ?code:int ->
+ (Tiny_httpd_io.Writer.t, Response_code.t * string) Stdlib.result ->
+ tSame as make but with a writer body.
val make_stream :
+ ?headers:Headers.t ->
+ ?code:int ->
+ (byte_stream, Response_code.t * string) Stdlib.result ->
+ tSame as make but with a stream body.
Make the current request fail with the given code and message. Example: fail ~code:404 "oh noes, %s not found" "waldo".
Similar to fail but raises an exception that exits the current handler. This should not be used outside of a (path) handler. Example: fail_raise ~code:404 "oh noes, %s not found" "waldo"; never_executed()
val pp : Stdlib.Format.formatter -> t -> unitPretty print the response. The exact format is not specified.
Tiny_httpd_server.Response_codeval ok : tThe code 200
val not_found : tThe code 404
val descr : t -> stringA description of some of the error codes. NOTE: this is not complete (yet).
Tiny_httpd_server.Routeval int : (int -> 'a, 'a) compMatches an integer.
val string : (string -> 'a, 'a) compMatches a string not containing '/' and binds it as is.
val string_urlencoded : (string -> 'a, 'a) compMatches a URL-encoded string, and decodes it.
val exact : string -> ('a, 'a) compexact "s" matches "s" and nothing else.
val return : ('a, 'a) tMatches the empty path.
val rest_of_path : (string -> 'a, 'a) tMatches a string, even containing '/'. This will match the entirety of the remaining route.
val rest_of_path_urlencoded : (string -> 'a, 'a) tMatches a string, even containing '/', an URL-decode it. This will match the entirety of the remaining route.
comp / route matches "foo/bar/…" iff comp matches "foo", and route matches "bar/…".
exact_path "foo/bar/..." r is equivalent to exact "foo" @/ exact "bar" @/ ... @/ r
val pp : Stdlib.Format.formatter -> (_, _) t -> unitPrint the route.
val to_string : (_, _) t -> stringPrint the route.
Tiny_httpd_server.IO_BACKENDA backend that provides IO operations, network operations, etc.
This is used to decouple tiny_httpd from the scheduler/IO library used to actually open a TCP server and talk to clients. The classic way is based on Unix and blocking IOs, but it's also possible to use an OCaml 5 library using effects and non blocking IOs.
val tcp_server : unit -> Tiny_httpd_io.TCP_server.builderTCP server builder, to create servers that can listen on a port and handle clients.
Tiny_httpd_server.SERVER_SENT_GENERATORA server-side function to generate of Server-sent events.
See the w3c page and this blog post.
val set_headers : Headers.t -> unitSet headers of the response. This is not mandatory but if used at all, it must be called before any call to send_event (once events are sent the response is already sent too).