From 28ee8132eb7ecd383ae79bc8e895d7ba51498be3 Mon Sep 17 00:00:00 2001 From: totoro Date: Sun, 17 Jan 2016 03:38:38 +0100 Subject: [PATCH] [+] add xml_rpc nil extension [!] fix the parsing of empty struct and array --- web/CXM_xml_rpc.anubis | 9 ++++++--- web/CXM_xml_rpc_parser.anubis | 18 ++++++++++++++---- web/CXM_xml_rpc_types.anubis | 16 +++++++++++++++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/web/CXM_xml_rpc.anubis b/web/CXM_xml_rpc.anubis index 340fb2d..7caf589 100644 --- a/web/CXM_xml_rpc.anubis +++ b/web/CXM_xml_rpc.anubis @@ -76,6 +76,8 @@ define String format_string_value ( String value) = ""+value+"< define String format_double_value ( Float value) = ""+float_to_string(value, 10)+"" + crlf. define String format_datetime_value ( String value) = ""+value+"" + crlf. define String format_base64_value ( String value) = ""+value+"" + crlf. +define String format_nil = "" + crlf. + define String format_value @@ -92,7 +94,8 @@ define String datetime(value) then format_datetime_value(value), base64(value) then format_base64_value(value), struct(value) then format_struct(value, position + 1), - array(value) then format_array(value, position + 1) + array(value) then format_array(value, position + 1), + nil then format_nil }, tab(position) + return. @@ -242,14 +245,14 @@ public define Maybe(XML_RPC_client) if a is ok(server_addr) then //connect to server with right protocol if use_ssl then - println("SSL "+server_port+ " "+server_name); + //println("SSL "+server_port+ " "+server_name); if open_SSL_connection(server_name, server_addr, server_port, accept_policy) is { error(msg) then failure, ok(conn) then success(xml_rpc_client(ssl(conn), auth, server_name, user_agent, host)) } else - println("TCP "+server_port+ " "+server_name); + //println("TCP "+server_port+ " "+server_name); if (Result(NetworkConnectError,RWStream))connect(server_addr, server_port) is { error(e) then failure, diff --git a/web/CXM_xml_rpc_parser.anubis b/web/CXM_xml_rpc_parser.anubis index 7f99bcb..3ccdb22 100644 --- a/web/CXM_xml_rpc_parser.anubis +++ b/web/CXM_xml_rpc_parser.anubis @@ -176,7 +176,10 @@ define Maybe(List(XML_RPC_value)) failure } } - else + // mean empty array + else if token = "/data" then + success([]) + else failure } else @@ -236,7 +239,7 @@ define Maybe(List(XML_RPC_struct_member)) if tok = "member" then //there is another member in structure, we read it read_members(stream, [member(member_name, value) . so_far]) else if tok = "/struct" then //End of structrue found - println("End struct"); + //println("End struct"); success(reverse([member(member_name, value) . so_far])) //return all members in right order else failure //unexpected token @@ -259,12 +262,17 @@ define Maybe(XML_RPC_value) { none then failure, token(token) then + //there is member hence read it if token = "member" then + if read_members(stream, []) is { failure then failure success(members_list) then success(struct(members(members_list))) } + //the immediate following token is . Hence this is an empty struct + else if token = "/struct" then + success(struct(members([]))) else failure }. @@ -281,7 +289,7 @@ define Maybe(XML_RPC_value) with value = if token = "string" then if xml_tag_content(stream, "string") is { - failure then failure, + failure then failure, success(v) then success(string(v)) } else if token = "int" then @@ -332,7 +340,9 @@ define Maybe(XML_RPC_value) } else if token = "struct" then read_struct(stream) else if token = "array" then read_array(stream) - else + else if token = "nil/" then success(nil) + else + println("Unknown token ["+token+"]"); failure, if next_xml_token(stream) is { diff --git a/web/CXM_xml_rpc_types.anubis b/web/CXM_xml_rpc_types.anubis index b135e66..6f2dd06 100644 --- a/web/CXM_xml_rpc_types.anubis +++ b/web/CXM_xml_rpc_types.anubis @@ -5,6 +5,8 @@ * Time: 15:27 */ +transmit tools/basis.anubis + public type XML_RPC_struct:... public type XML_RPC_array:... @@ -16,7 +18,8 @@ public type XML_RPC_value: datetime(String), base64(String), struct(XML_RPC_struct), - array(XML_RPC_array). + array(XML_RPC_array), + nil. public type XML_RPC_array: array(List(XML_RPC_value)). @@ -97,3 +100,14 @@ public define Maybe(XML_RPC_value) get_member(t, member_name) }. +public define XML_RPC_struct + struct_add_member + ( + XML_RPC_struct rpc_struc, + String name, + XML_RPC_value value + )= + since rpc_struc is members(members_list), + members([member(name, value) . members_list]) + . + -- libgit2 0.21.4