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] implements {call, response}_of_string and

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH] [rpc-light] implements {call, response}_of_string and string_of_{call, response} for XMLRPC.
From: Thomas Gazagnaire <thomas.gazagnaire@xxxxxxxxxx>
Date: Fri, 11 Dec 2009 16:49:45 +0000
Delivery-date: Fri, 11 Dec 2009 08:49:46 -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] implements {call,response}_of_string and string_of_{call,response} 
for XMLRPC.

Now, need to do the same thing for JSON.

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

diff -r eb9d6526dec1 rpc-light/examples/all_types.ml
--- a/rpc-light/examples/all_types.ml   Thu Dec 10 12:45:59 2009 +0000
+++ b/rpc-light/examples/all_types.ml   Fri Dec 11 16:50:23 2009 +0000
@@ -55,5 +55,22 @@
        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:\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 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; 
+       Printf.printf "response2: %s\n" r2; 
+
+       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')
diff -r eb9d6526dec1 rpc-light/rpc.ml
--- a/rpc-light/rpc.ml  Thu Dec 10 12:45:59 2009 +0000
+++ b/rpc-light/rpc.ml  Fri Dec 11 16:50:23 2009 +0000
@@ -51,4 +51,4 @@
 
 type response =
        | Success of Val.t
-       | Fault of int * string
+       | Fault of int64 * string
diff -r eb9d6526dec1 rpc-light/xmlrpc.ml
--- a/rpc-light/xmlrpc.ml       Thu Dec 10 12:45:59 2009 +0000
+++ b/rpc-light/xmlrpc.ml       Fri Dec 11 16:50:23 2009 +0000
@@ -75,6 +75,40 @@
        let buf = Buffer.create 128 in
        add_value (Buffer.add_string buf) x;
        Buffer.contents buf
+
+let string_of_call call =
+       let module B = Buffer in
+       let buf = B.create 1024 in
+       let add = B.add_string buf in
+       add "<?xml version=\"1.0\"?>";
+       add "<methodCall><methodName>";
+       add (check call.Rpc.name);
+       add "</methodName><params>";
+       List.iter (fun p ->
+               add "<param>";
+               add (to_string p);
+               add "</param>"
+               ) call.Rpc.params;
+       add "</params></methodCall>";
+       B.contents buf
+
+let string_of_response response =
+       let module B = Buffer in
+       let buf = B.create 256 in
+       let add = B.add_string buf in
+       begin match response with
+       | Rpc.Success v   ->
+               add "<?xml version=\"1.0\"?><methodResponse><params><param>";
+               add (to_string v);
+               add "</param></params></methodResponse>";
+       | Rpc.Fault (i,s) ->
+               add "<?xml 
version=\"1.0\"?><methodResponse><fault><value><struct><member><name>faultCode</name><value><int>";
+               add (Int64.to_string i);
+               add 
"</int></value></member><member><name>faultString</name><value><string>";
+               add s;
+               add 
"</string></value></member></struct></value></fault></methodResponse>";
+       end;
+       B.contents buf
 
 exception Parse_error of string * Xmlm.signal * Xmlm.input
 
@@ -207,7 +241,11 @@
 
        (* General parser functions *)
        let rec of_xml ?callback accu input =
-               value (map_tags (basic_types ?callback accu)) input
+               try value (map_tags (basic_types ?callback accu)) input
+               with Xmlm.Error ((a,b), e) ->
+                       Printf.eprintf "Characters %i--%i: %s\n%!" a b 
(Xmlm.error_message e);
+                       exit (-1)
+                       | e -> Printf.eprintf "%s\n%!" (Printexc.to_string e); 
exit (-1)
 
        and basic_types ?callback accu input = function
                | "int" | "i4" -> make_int    ?callback accu (get_data input)
@@ -233,3 +271,42 @@
        | _      -> () end;
        Parser.of_xml ?callback [] input
        
+let call_of_string ?callback str : Rpc.call =
+       let input = Xmlm.make_input (`String (0, str)) in
+       begin match Xmlm.peek input with
+       | `Dtd _ -> ignore (Xmlm.input input)
+       | _      -> () end;
+       let name = ref "" in
+       let params = ref [] in
+       Parser.map_tag "methodCall" (fun input ->
+               name := Parser.map_tag "methodName" Parser.get_data input;
+               Parser.map_tag "params" (fun input ->
+                       while Xmlm.peek input <> `El_end do
+                               Parser.map_tag "param" (fun input -> params := 
(Parser.of_xml ?callback [] input) :: !params) input
+                       done;
+                       ) input
+               ) input;
+       { Rpc.name = !name; Rpc.params = !params }
+       
+let response_of_string ?callback str : Rpc.response =
+       let input = Xmlm.make_input (`String (0, str)) in
+       begin match Xmlm.peek input with
+       | `Dtd _ -> ignore (Xmlm.input input)
+       | _      -> () end;
+       Parser.map_tag "methodResponse" (fun input ->
+               match Xmlm.peek input with
+               | `El_start ((_,"fault"),_) ->
+                       Parser.map_tag "fault" (fun input ->
+                               let signal = Xmlm.peek input in
+                               match Parser.of_xml ?callback [] input with
+                                       | `Dict [ "faultCode", `Int i; 
"faultString", `String s ] -> Rpc.Fault (i, s)
+                                       | s -> parse_error (to_string s) signal 
input
+                               ) input
+               | `El_start ((_,"params"),_) ->
+                       Parser.map_tag "params" (fun input ->
+                               Parser.map_tag "param" (fun input -> 
Rpc.Success (Parser.of_xml ?callback [] input)) input
+                               ) input
+               | s -> parse_error "response" s input
+               ) input 
+
+       
diff -r eb9d6526dec1 rpc-light/xmlrpc.mli
--- a/rpc-light/xmlrpc.mli      Thu Dec 10 12:45:59 2009 +0000
+++ b/rpc-light/xmlrpc.mli      Fri Dec 11 16:50:23 2009 +0000
@@ -14,3 +14,9 @@
 
 val to_string : Rpc.Val.t -> string
 val of_string : ?callback:Rpc.callback -> string -> Rpc.Val.t
+
+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

Attachment: txtrELRt8Os7r.txt
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] implements {call, response}_of_string and string_of_{call, response} for XMLRPC., Thomas Gazagnaire <=