|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-API] [PATCH 14 of 17] [rpc-light] Protect the XML strings as xml-light2
# HG changeset patch
# User Thomas Gazagnaire <thomas.gazagnaire@xxxxxxxxxx>
# Date 1262958466 0
# Node ID a571cd80dcb8a38c72b58bbc05b49cf14409c883
# Parent 908be71d7e00c6ebedb89a674276686cd62ec433
[rpc-light] Protect the XML strings as xml-light2.
xmlrpc converts '>' to '>', '<' to '<', '"' to '"' and do not erase
weird characters (need to use a proper unicode validation functions at one
point)
Signed-off-by: Thomas Gazagnaire <thomas.gazagnaire@xxxxxxxxxx>
diff -r 908be71d7e00 -r a571cd80dcb8 rpc-light/xmlrpc.ml
--- a/rpc-light/xmlrpc.ml Fri Jan 08 13:47:46 2010 +0000
+++ b/rpc-light/xmlrpc.ml Fri Jan 08 13:47:46 2010 +0000
@@ -22,14 +22,38 @@
(* marshalling/unmarshalling code *)
(* The XML-RPC is not very clear about what characters can be in a string
value ... *)
-let check s =
- let aux c =
- let code = int_of_char c in
- if code <= 31 then
- failwith (sprintf "%s is not a valid string (it
contains char '\\%i')" s code)
- in
- for i = 0 to String.length s - 1 do aux s.[i] done;
- s
+let encode s =
+ let n = String.length s in
+ let aux = function
+ | '>' -> Some ">"
+ | '<' -> Some "<"
+ | '&' -> Some "&"
+ | '"' -> Some """
+ | c when (c >= '\x20' && c <= '\xff') || c = '\x09' || c =
'\x0a' || c = '\x0d'
+ -> None
+ | _ -> Some "" in
+ let need_encoding =
+ let b = ref false in
+ let i = ref 0 in
+ while not !b && !i < n-1 do
+ b := aux s.[ !i ] <> None;
+ incr i;
+ done;
+ !b in
+ if need_encoding then begin
+ let buf = Buffer.create 0 in
+ let m = ref 0 in
+ for i = 0 to n-1 do
+ match aux s.[i] with
+ | None -> ()
+ | Some n ->
+ Buffer.add_substring buf s !m (i - !m);
+ Buffer.add_string buf n;
+ m := i + 1
+ done;
+ Buffer.contents buf
+ end else
+ s
let rec add_value f = function
| Null ->
@@ -52,7 +76,7 @@
| String s ->
f "<value>";
- f (check s);
+ f (encode s);
f "</value>"
| Enum l ->
@@ -88,7 +112,7 @@
let add = B.add_string buf in
add "<?xml version=\"1.0\"?>";
add "<methodCall><methodName>";
- add (check call.name);
+ add (encode call.name);
add "</methodName><params>";
List.iter (fun p ->
add "<param>";
1 file changed, 34 insertions(+), 10 deletions(-)
rpc-light/xmlrpc.ml | 44 ++++++++++++++++++++++++++++++++++----------
Attachment:
xen-api-libs.hg-17.patch _______________________________________________ xen-api mailing list xen-api@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/mailman/listinfo/xen-api
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |