5b50279851
The new version of ocplib-resto : - uses jbuilder ; - is functorized over `Json_encoding` rather than `Json_repr` ; - handles query parameters ; - handles HTTP methods (GET, POST, DELETE, PUT, PATCH) ; - replaces `custom_service` by a more generic trailer argument ; - replaces generic answer `(code, body)` by a more ad-hoc sum type (allowing distinct encoding for success and error) ; - includes a minimal HTTP-server based on Cohttp (includings CORS and media type negotiation). - adds a function `Directory.transparent_lookup` to lookup/call a service handler without serializing the various parameters (path, query, request body). As a first consequences in Tezos, this patch allows binary communication between the client and the node. This patch tries to be minimal inside the tezos source code and therefore it introduces a minimal compatibility layer in `RPC.ml`. This code should be removed as soon as possible.
58 lines
2.1 KiB
OCaml
58 lines
2.1 KiB
OCaml
(**************************************************************************)
|
|
(* ocplib-resto *)
|
|
(* Copyright (C) 2016, OCamlPro. *)
|
|
(* *)
|
|
(* All rights reserved. This file is distributed under the terms *)
|
|
(* of the GNU Lesser General Public License version 2.1, with the *)
|
|
(* special exception on linking described in the file LICENSE. *)
|
|
(* *)
|
|
(**************************************************************************)
|
|
|
|
(** Typed RPC services: server implementation. *)
|
|
|
|
type cors = {
|
|
allowed_headers : string list ;
|
|
allowed_origins : string list ;
|
|
}
|
|
|
|
module type LOGGING = sig
|
|
|
|
val debug: ('a, Format.formatter, unit, unit) format4 -> 'a
|
|
val log_info: ('a, Format.formatter, unit, unit) format4 -> 'a
|
|
val log_notice: ('a, Format.formatter, unit, unit) format4 -> 'a
|
|
val warn: ('a, Format.formatter, unit, unit) format4 -> 'a
|
|
val log_error: ('a, Format.formatter, unit, unit) format4 -> 'a
|
|
|
|
val lwt_debug: ('a, Format.formatter, unit, unit Lwt.t) format4 -> 'a
|
|
val lwt_log_info: ('a, Format.formatter, unit, unit Lwt.t) format4 -> 'a
|
|
val lwt_log_notice: ('a, Format.formatter, unit, unit Lwt.t) format4 -> 'a
|
|
val lwt_warn: ('a, Format.formatter, unit, unit Lwt.t) format4 -> 'a
|
|
val lwt_log_error: ('a, Format.formatter, unit, unit Lwt.t) format4 -> 'a
|
|
|
|
end
|
|
|
|
module Make (Encoding : Resto.ENCODING) (Log : LOGGING) : sig
|
|
|
|
type media_type = {
|
|
name: string ;
|
|
construct: 'a. 'a Encoding.t -> 'a -> string ;
|
|
destruct: 'a. 'a Encoding.t -> string -> ('a, string) result ;
|
|
}
|
|
|
|
(** A handle on the server worker. *)
|
|
type server
|
|
|
|
(** Promise a running RPC server.*)
|
|
val launch :
|
|
?host:string ->
|
|
?cors:cors ->
|
|
media_types:media_type list ->
|
|
Conduit_lwt_unix.server ->
|
|
unit RestoDirectory.MakeDirectory(Encoding).t ->
|
|
server Lwt.t
|
|
|
|
(** Kill an RPC server. *)
|
|
val shutdown : server -> unit Lwt.t
|
|
|
|
end
|