WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-api

[Xen-API] [PATCH] [rpc-light] add {call, response}_of_string and string_

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH] [rpc-light] add {call, response}_of_string and string_of_{call, response} for JSON as well.
From: Thomas Gazagnaire <thomas.gazagnaire@xxxxxxxxxx>
Date: Fri, 11 Dec 2009 17:42:12 +0000
Delivery-date: Fri, 11 Dec 2009 09:42:12 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-post: <mailto:xen-api@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-api-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Thomas Gazagnaire <thomas.gazagnaire@xxxxxxxxxx>
[rpc-light] add {call,response}_of_string and string_of_{call,response} for 
JSON as well.

Signed-off-by: Thomas Gazagnaire <thomas.gazagnaire@xxxxxxxxxx>

diff -r d85f31ed63ae rpc-light/examples/all_types.ml
--- a/rpc-light/examples/all_types.ml   Fri Dec 11 16:51:24 2009 +0000
+++ b/rpc-light/examples/all_types.ml   Fri Dec 11 17:42:43 2009 +0000
@@ -55,22 +55,36 @@
        let x2 = x_of_rpc (Xmlrpc.of_string ~callback xml) in
        let x3 = x_of_rpc (Jsonrpc.of_string json) in
 
-       Printf.printf "\nSanity check:\nx1=x2: %b\nx2=x3: %b\nx1=x3: %b\n\n" 
(x1 = x2) (x2 = x3) (x1 = x3);
+       Printf.printf "\nSanity check 1:\nx1=x2: %b\nx2=x3: %b\nx1=x3: %b\n\n" 
(x1 = x2) (x2 = x3) (x1 = x3);
        
        let call = { Rpc.name = "foo"; Rpc.params = [ rpc ] } in
        let response1 = Rpc.Success rpc in
        let response2 = Rpc.Fault (1L, "Foo") in
+       let response3 = Rpc.Fault rpc in
 
        let c1 = Xmlrpc.string_of_call call in
        let r1 = Xmlrpc.string_of_response response1 in
        let r2 = Xmlrpc.string_of_response response2 in
 
-       Printf.printf "call: %s\n" c1;
-       Printf.printf "response1: %s\n" r1; 
+       let cj1 = Jsonrpc.string_of_call call in
+       let rj1 = Jsonrpc.string_of_response 0L response1 in
+       let rj3 = Jsonrpc.string_of_response 0L response3 in
+
+       Printf.printf "call: %s\n%s\n" c1 cj1;
+       Printf.printf "response1: %s\n%s\n" r1 rj1; 
        Printf.printf "response2: %s\n" r2; 
+       Printf.printf "response3: %s\n" rj3; 
 
        let c1' = Xmlrpc.call_of_string c1 in
        let r1' = Xmlrpc.response_of_string r1 in
        let r2' = Xmlrpc.response_of_string r2 in
-       Printf.printf "\nSanity check:\ncall=c1': %b\nresponse1=r1': 
%b\nresponse2=r2': %b\n"
-               (call = c1') (response1 = r1') (response2 = r2')
+
+       Printf.printf "\nSanity check 2:\ncall=c1': %b\nresponse1=r1': 
%b\nresponse2=r2': %b\n"
+               (call = c1') (response1 = r1') (response2 = r2');
+
+       let _, cj1' = Jsonrpc.call_of_string cj1 in
+       let _, rj1' = Jsonrpc.response_of_string rj1 in
+       let _, rj3' = Jsonrpc.response_of_string rj3 in
+
+       Printf.printf "\nSanity check 3:\ncall=cj1': %b\nresponse1=rj1': 
%b\nresponse3=rj3': %b\n"
+               (call = cj1') (response1 = rj1') (response3 = rj3');
diff -r d85f31ed63ae rpc-light/jsonrpc.ml
--- a/rpc-light/jsonrpc.ml      Fri Dec 11 16:51:24 2009 +0000
+++ b/rpc-light/jsonrpc.ml      Fri Dec 11 17:42:43 2009 +0000
@@ -11,6 +11,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Lesser General Public License for more details.
  *)
+
+open Rpc
 
 let rec list_iter_between f o = function
        | []   -> ()
@@ -64,7 +66,33 @@
        to_buffer t buf;
        Buffer.contents buf
 
+let new_id =
+       let count = ref 0L in
+       (fun () -> count := Int64.add 1L !count; !count)
 
+let string_of_call call =
+       let json = `Dict [
+               "method", `String call.name;
+               "params", `List call.params;
+               "id", `Int (new_id ());
+       ] in
+       to_string json
+
+let string_of_response id response =
+       let json = match response with
+               | Success v ->
+                       `Dict [
+                               "result", v;
+                               "error", `None;
+                               "id", `Int id
+                       ]
+               | Fault f ->
+                       `Dict [
+                               "result", `None;
+                               "error", f;
+                               "id", `Int id
+                       ] in
+       to_string json
 
 type error =
        | Unexpected_char of int * char * (* json type *) string
@@ -94,13 +122,13 @@
                | Expect_object_elem_colon
                | Expect_comma_or_end
                | Expect_object_key
-               | Done of Rpc.Val.t
+               | Done of Val.t
 
        type int_value =
-               | IObject of (string * Rpc.Val.t) list
-               | IObject_needs_key of (string * Rpc.Val.t) list
-               | IObject_needs_value of (string * Rpc.Val.t) list * string
-               | IArray of Rpc.Val.t list
+               | IObject of (string * Val.t) list
+               | IObject_needs_key of (string * Val.t) list
+               | IObject_needs_value of (string * Val.t) list * string
+               | IArray of Val.t list
 
        type parse_state = {
                mutable cursor: cursor;
@@ -404,7 +432,7 @@
                | Done _ -> raise_internal_error s "parse called when 
parse_state is 'Done'"
 
        type parse_result =
-               | Json_value of Rpc.Val.t * (* number of consumed bytes *) int
+               | Json_value of Val.t * (* number of consumed bytes *) int
                | Json_parse_incomplete of parse_state
 
        let parse_substring state str ofs len =
@@ -454,3 +482,40 @@
 end
 
 let of_string = Parser.of_string
+
+exception Malformed_method_request of string
+exception Malformed_method_response of string
+
+let get name dict =
+       if List.mem_assoc name dict then
+               List.assoc name dict
+       else begin
+               Printf.eprintf "%s was not found in the dictionnary\n" name;
+               let str = List.map (fun (n,_) -> Printf.sprintf "%s=..." n) 
dict in
+               let str = Printf.sprintf "{%s}" (String.concat "," str) in
+               raise (Malformed_method_request str)
+       end
+
+let call_of_string str =
+       match of_string str with
+       | `Dict d ->
+               let name = match get "method" d with `String s -> s | _ -> 
raise (Malformed_method_request str) in
+               let params = match get "params" d with `List l -> l | _ -> 
raise (Malformed_method_request str) in
+               let id = match get "id" d with `Int i -> i | _ -> raise 
(Malformed_method_request str) in
+               id, { name = name; params = params }
+       | _ -> raise (Malformed_method_request str)
+
+let response_of_string str =
+       match of_string str with
+       | `Dict d ->
+                 let result = get "result" d in
+                 let error = get "error" d in
+                 let id = match get "id" d with `Int i -> i | _ -> raise 
(Malformed_method_response str) in
+                 begin match result, error with
+                         | `None, `None -> raise (Malformed_method_response 
str)
+                         | `None, v     -> id, Fault v
+                         | v, `None     -> id, Success v
+                         | _            -> raise (Malformed_method_response 
str)
+                 end
+       | _ -> raise (Malformed_method_response str)
+
diff -r d85f31ed63ae rpc-light/jsonrpc.mli
--- a/rpc-light/jsonrpc.mli     Fri Dec 11 16:51:24 2009 +0000
+++ b/rpc-light/jsonrpc.mli     Fri Dec 11 17:42:43 2009 +0000
@@ -14,3 +14,12 @@
 
 val to_string : Rpc.Val.t -> string
 val of_string : string -> Rpc.Val.t
+
+val string_of_call: Rpc.call -> string
+val call_of_string: string -> int64 * Rpc.call
+
+val string_of_response: int64 -> Rpc.Val.t Rpc.response -> string
+val response_of_string: string -> int64 * Rpc.Val.t Rpc.response
+
+
+
diff -r d85f31ed63ae rpc-light/rpc.ml
--- a/rpc-light/rpc.ml  Fri Dec 11 16:51:24 2009 +0000
+++ b/rpc-light/rpc.ml  Fri Dec 11 17:42:43 2009 +0000
@@ -49,6 +49,6 @@
        params: Val.t list
 }
 
-type response =
+type 'a response =
        | Success of Val.t
-       | Fault of int64 * string
+       | Fault of 'a
diff -r d85f31ed63ae rpc-light/xmlrpc.ml
--- a/rpc-light/xmlrpc.ml       Fri Dec 11 16:51:24 2009 +0000
+++ b/rpc-light/xmlrpc.ml       Fri Dec 11 17:42:43 2009 +0000
@@ -264,14 +264,14 @@
                List.rev !r
 end
 
-let of_string ?callback str : Rpc.Val.t =
+let of_string ?callback str =
        let input = Xmlm.make_input (`String (0, str)) in
        begin match Xmlm.peek input with
        | `Dtd _ -> ignore (Xmlm.input input)
        | _      -> () end;
        Parser.of_xml ?callback [] input
        
-let call_of_string ?callback str : Rpc.call =
+let call_of_string ?callback str =
        let input = Xmlm.make_input (`String (0, str)) in
        begin match Xmlm.peek input with
        | `Dtd _ -> ignore (Xmlm.input input)
@@ -288,7 +288,7 @@
                ) input;
        { Rpc.name = !name; Rpc.params = !params }
        
-let response_of_string ?callback str : Rpc.response =
+let response_of_string ?callback str =
        let input = Xmlm.make_input (`String (0, str)) in
        begin match Xmlm.peek input with
        | `Dtd _ -> ignore (Xmlm.input input)
diff -r d85f31ed63ae rpc-light/xmlrpc.mli
--- a/rpc-light/xmlrpc.mli      Fri Dec 11 16:51:24 2009 +0000
+++ b/rpc-light/xmlrpc.mli      Fri Dec 11 17:42:43 2009 +0000
@@ -18,5 +18,5 @@
 val string_of_call: Rpc.call -> string
 val call_of_string: ?callback:Rpc.callback -> string -> Rpc.call
 
-val string_of_response: Rpc.response -> string
-val response_of_string: ?callback:Rpc.callback -> string -> Rpc.response
+val string_of_response: (int64 * string) Rpc.response -> string
+val response_of_string: ?callback:Rpc.callback -> string -> (int64 * string) 
Rpc.response

Attachment: xapi-libs-rpc-light-call-and-response-for-JSON
Description: Text document

_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-API] [PATCH] [rpc-light] add {call, response}_of_string and string_of_{call, response} for JSON as well., Thomas Gazagnaire <=