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