Commit 28ee8132eb7ecd383ae79bc8e895d7ba51498be3

Authored by totoro
1 parent 671ea380

[+] add xml_rpc nil extension

[!] fix the parsing of empty struct and array
web/CXM_xml_rpc.anubis
... ... @@ -76,6 +76,8 @@ define String format_string_value ( String value) = "<value><string>"+value+"<
76 76 define String format_double_value ( Float value) = "<value><double>"+float_to_string(value, 10)+"</double></value>" + crlf.
77 77 define String format_datetime_value ( String value) = "<value><dateTime.iso8601>"+value+"</dateTime.iso8601></value>" + crlf.
78 78 define String format_base64_value ( String value) = "<value><base64>"+value+"</base64></value>" + crlf.
  79 +define String format_nil = "<value><nil/></value>" + crlf.
  80 +
79 81  
80 82 define String
81 83 format_value
... ... @@ -92,7 +94,8 @@ define String
92 94 datetime(value) then format_datetime_value(value),
93 95 base64(value) then format_base64_value(value),
94 96 struct(value) then format_struct(value, position + 1),
95   - array(value) then format_array(value, position + 1)
  97 + array(value) then format_array(value, position + 1),
  98 + nil then format_nil
96 99 },
97 100 tab(position) + return.
98 101  
... ... @@ -242,14 +245,14 @@ public define Maybe(XML_RPC_client)
242 245 if a is ok(server_addr) then
243 246 //connect to server with right protocol
244 247 if use_ssl then
245   - println("SSL "+server_port+ " "+server_name);
  248 + //println("SSL "+server_port+ " "+server_name);
246 249 if open_SSL_connection(server_name, server_addr, server_port, accept_policy) is
247 250 {
248 251 error(msg) then failure,
249 252 ok(conn) then success(xml_rpc_client(ssl(conn), auth, server_name, user_agent, host))
250 253 }
251 254 else
252   - println("TCP "+server_port+ " "+server_name);
  255 + //println("TCP "+server_port+ " "+server_name);
253 256 if (Result(NetworkConnectError,RWStream))connect(server_addr, server_port) is
254 257 {
255 258 error(e) then failure,
... ...
web/CXM_xml_rpc_parser.anubis
... ... @@ -176,7 +176,10 @@ define Maybe(List(XML_RPC_value))
176 176 failure
177 177 }
178 178 }
179   - else
  179 + // <data></data> mean empty array
  180 + else if token = "/data" then
  181 + success([])
  182 + else
180 183 failure
181 184 }
182 185 else
... ... @@ -236,7 +239,7 @@ define Maybe(List(XML_RPC_struct_member))
236 239 if tok = "member" then //there is another member in structure, we read it
237 240 read_members(stream, [member(member_name, value) . so_far])
238 241 else if tok = "/struct" then //End of structrue found
239   - println("End struct");
  242 + //println("End struct");
240 243 success(reverse([member(member_name, value) . so_far])) //return all members in right order
241 244 else
242 245 failure //unexpected token
... ... @@ -259,12 +262,17 @@ define Maybe(XML_RPC_value)
259 262 {
260 263 none then failure,
261 264 token(token) then
  265 + //there is member hence read it
262 266 if token = "member" then
  267 +
263 268 if read_members(stream, []) is
264 269 {
265 270 failure then failure
266 271 success(members_list) then success(struct(members(members_list)))
267 272 }
  273 + //the immediate following token is </struct>. Hence this is an empty struct
  274 + else if token = "/struct" then
  275 + success(struct(members([])))
268 276 else
269 277 failure
270 278 }.
... ... @@ -281,7 +289,7 @@ define Maybe(XML_RPC_value)
281 289 with value = if token = "string" then
282 290 if xml_tag_content(stream, "string") is
283 291 {
284   - failure then failure,
  292 + failure then failure,
285 293 success(v) then success(string(v))
286 294 }
287 295 else if token = "int" then
... ... @@ -332,7 +340,9 @@ define Maybe(XML_RPC_value)
332 340 }
333 341 else if token = "struct" then read_struct(stream)
334 342 else if token = "array" then read_array(stream)
335   - else
  343 + else if token = "nil/" then success(nil)
  344 + else
  345 + println("Unknown <value> token ["+token+"]");
336 346 failure,
337 347 if next_xml_token(stream) is
338 348 {
... ...
web/CXM_xml_rpc_types.anubis
... ... @@ -5,6 +5,8 @@
5 5 * Time: 15:27
6 6 */
7 7  
  8 +transmit tools/basis.anubis
  9 +
8 10 public type XML_RPC_struct:...
9 11 public type XML_RPC_array:...
10 12  
... ... @@ -16,7 +18,8 @@ public type XML_RPC_value:
16 18 datetime(String),
17 19 base64(String),
18 20 struct(XML_RPC_struct),
19   - array(XML_RPC_array).
  21 + array(XML_RPC_array),
  22 + nil.
20 23  
21 24 public type XML_RPC_array:
22 25 array(List(XML_RPC_value)).
... ... @@ -97,3 +100,14 @@ public define Maybe(XML_RPC_value)
97 100 get_member(t, member_name)
98 101 }.
99 102  
  103 +public define XML_RPC_struct
  104 + struct_add_member
  105 + (
  106 + XML_RPC_struct rpc_struc,
  107 + String name,
  108 + XML_RPC_value value
  109 + )=
  110 + since rpc_struc is members(members_list),
  111 + members([member(name, value) . members_list])
  112 + .
  113 +
... ...