Commit 28ee8132eb7ecd383ae79bc8e895d7ba51498be3
1 parent
671ea380
[+] add xml_rpc nil extension
[!] fix the parsing of empty struct and array
Showing
3 changed files
with
35 additions
and
8 deletions
Show diff stats
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 | + |