Cohttp_lwt_unix.Server
The Server
module implements the full UNIX HTTP server interface, including the UNIX-specific functions defined in S
.
The Logs
source name for this module logger is "cohttp.lwt.server"
. Refer to the Debug
module for further details.
include Cohttp_lwt.S.Server with module IO = Cohttp_lwt_unix__.Io
module IO : sig ... end
The Io
module contains the IO implementation for cohttp-lwt-unix
.
include Cohttp.Generic.Server.S
with type body = Cohttp_lwt.Body.t
and module IO := IO
and type response = Http.Response.t * Cohttp_lwt.Body.t
type body = Cohttp_lwt.Body.t
type conn = IO.conn * Cohttp.Connection.t
type response = Http.Response.t * Cohttp_lwt.Body.t
type response_action = [
| `Expert of Http.Response.t * (IO.ic -> IO.oc -> unit IO.t)
| `Response of response
]
A request handler can respond in two ways:
`Response
, with a Response.t
and a body
.`Expert
, with a Response.t
and an IO function that is expected to write the response body. The IO function has access to the underlying IO.ic
and IO.oc
, which allows writing a response body more efficiently, stream a response or to switch protocols entirely (e.g. websockets). Processing of pipelined requests continue after the unit IO.t
is resolved. The connection can be closed by closing the IO.ic
.val make_response_action :
?conn_closed:(conn -> unit) ->
callback:(conn -> Http.Request.t -> body -> response_action IO.t) ->
unit ->
t
val make_expert :
?conn_closed:(conn -> unit) ->
callback:
(conn ->
Http.Request.t ->
body ->
(Http.Response.t * (IO.ic -> IO.oc -> unit IO.t)) IO.t) ->
unit ->
t
val respond :
?headers:Http.Header.t ->
status:Http.Status.t ->
body:body ->
unit ->
response IO.t
respond ?headers ~status ~body
will respond to an HTTP request with the given status
code and response body
. The transfer encoding will be detected from the body
value and set to chunked encoding if it cannot be determined immediately. You can override the encoding by supplying an appropriate Content-length
or Transfer-encoding
in the headers
parameter.
val respond_string :
?headers:Http.Header.t ->
status:Http.Status.t ->
body:string ->
unit ->
response IO.t
Resolve a URI and a docroot into a concrete local filename.
val respond_error :
?headers:Http.Header.t ->
?status:Http.Status.t ->
body:string ->
unit ->
(Http.Response.t * body) IO.t
val respond_redirect :
?headers:Http.Header.t ->
uri:Uri.t ->
unit ->
(Http.Response.t * body) IO.t
val respond_need_auth :
?headers:Http.Header.t ->
auth:Cohttp.Auth.challenge ->
unit ->
(Http.Response.t * body) IO.t
val respond_not_found : ?uri:Uri.t -> unit -> (Http.Response.t * body) IO.t
val respond_file :
?headers:Http.Header.t ->
fname:string ->
unit ->
(Http.Response.t * Cohttp_lwt.Body.t) Lwt.t
val create :
?timeout:int ->
?backlog:int ->
?stop:unit Lwt.t ->
?on_exn:(exn -> unit) ->
?ctx:Net.ctx ->
?mode:Conduit_lwt_unix.server ->
t ->
unit Lwt.t
create ?timeout ?backlog ?stop ?on_exn ?mode t
is a new HTTP server.
The user can decide to start a simple HTTP server (without encryption) or one with TLS encryption. It depends on what the user gives as mode
and how conduit-unix
is configured.
To create a simple HTTP server listening on port 8089:
let run = create (`TCP 8080)
When provided, the stop
thread will terminate the server if it ever becomes determined.
When provided, backlog
will limit the number of open connections.
Every connection will be served in a new lightweight thread that is invoked via the callback defined in t
. If the callback raises an exception, it is passed to on_exn
(by default, to a function that logs the exception using the Logs
library).