i tried make xmlrpc query on pkg.stats, but my xmlrpc lib was not able to parse the response (below). according to xmlrpc spec:
The body of the response is a single XML structure, a <methodResponse>, which can contain a single <params> which contains a single <param> which contains a single <value>.
according to the spec <value> is scalar value or <struct> or <array>. in sip proxy response below, there a several <struct>s in the <value>, which according to my understanding is violation of the spec.
instead, the response should be like this:
<?xml version="1.0"?> <methodResponse> <params> <param> <value> <array> <data> <value> <struct>...</struct> </value> <value> <struct>...</struct> </value> ... </data> </array> </param> </methodResponse>
comments?
-- juha
--------------------------------------------------------------------------
Received the following response:
HTTP/1.0 200 OK Via: SIP/2.0/TCP 127.0.0.1:36643 Server: OpenXg SIP Proxy (4.1.1-2 (i386/linux)) Content-Length: 6311
<?xml version="1.0"?> <methodResponse> <params> <param> <value><struct><member><name>entry</name><value><int>0</int></value></member><member><name>pid</name><value><int>5846</int></value></member><member><name>rank</name><value><int>0</int></value></member><member><name>used</name><value><int>4553004</int></value></member><member><name>free</name><value><int>559936</int></value></member><member><name>real_used</name><value><int>5731520</int></value></member></struct> <struct><member><name>entry</name><value><int>1</int></value></member><member><name>pid</name><value><int>5848</int></value></member><member><name>rank</name><value><int>1</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>2</int></value></member><member><name>pid</name><value><int>5849</int></value></member><member><name>rank</name><value><int>2</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>3</int></value></member><member><name>pid</name><value><int>5850</int></value></member><member><name>rank</name><value><int>3</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>4</int></value></member><member><name>pid</name><value><int>5851</int></value></member><member><name>rank</name><value><int>4</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>5</int></value></member><member><name>pid</name><value><int>5852</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556356</int></value></member><member><name>free</name><value><int>556296</int></value></member><member><name>real_used</name><value><int>5735160</int></value></member></struct> <struct><member><name>entry</name><value><int>6</int></value></member><member><name>pid</name><value><int>5853</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556356</int></value></member><member><name>free</name><value><int>556296</int></value></member><member><name>real_used</name><value><int>5735160</int></value></member></struct> <struct><member><name>entry</name><value><int>7</int></value></member><member><name>pid</name><value><int>5854</int></value></member><member><name>rank</name><value><int>4294967294</int></value></member><member><name>used</name><value><int>4563012</int></value></member><member><name>free</name><value><int>549112</int></value></member><member><name>real_used</name><value><int>5742344</int></value></member></struct> <struct><member><name>entry</name><value><int>8</int></value></member><member><name>pid</name><value><int>5857</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556368</int></value></member><member><name>free</name><value><int>556236</int></value></member><member><name>real_used</name><value><int>5735220</int></value></member></struct> <struct><member><name>entry</name><value><int>9</int></value></member><member><name>pid</name><value><int>5863</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556368</int></value></member><member><name>free</name><value><int>556236</int></value></member><member><name>real_used</name><value><int>5735220</int></value></member></struct> <struct><member><name>entry</name><value><int>10</int></value></member><member><name>pid</name><value><int>5873</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4557616</int></value></member><member><name>free</name><value><int>554844</int></value></member><member><name>real_used</name><value><int>5736612</int></value></member></struct> <struct><member><name>entry</name><value><int>11</int></value></member><member><name>pid</name><value><int>5876</int></value></member><member><name>rank</name><value><int>5</int></value></member><member><name>used</name><value><int>4642360</int></value></member><member><name>free</name><value><int>467988</int></value></member><member><name>real_used</name><value><int>5823468</int></value></member></struct> <struct><member><name>entry</name><value><int>12</int></value></member><member><name>pid</name><value><int>5877</int></value></member><member><name>rank</name><value><int>6</int></value></member><member><name>used</name><value><int>4618200</int></value></member><member><name>free</name><value><int>493396</int></value></member><member><name>real_used</name><value><int>5798060</int></value></member></struct> <struct><member><name>entry</name><value><int>13</int></value></member><member><name>pid</name><value><int>5878</int></value></member><member><name>rank</name><value><int>7</int></value></member><member><name>used</name><value><int>4618200</int></value></member><member><name>free</name><value><int>493396</int></value></member><member><name>real_used</name><value><int>5798060</int></value></member></struct> <struct><member><name>entry</name><value><int>14</int></value></member><member><name>pid</name><value><int>5884</int></value></member><member><name>rank</name><value><int>4294967292</int></value></member><member><name>used</name><value><int>4035956</int></value></member><member><name>free</name><value><int>497228</int></value></member><member><name>real_used</name><value><int>5307880</int></value></member></struct> </value> </param> </params> </methodResponse>
Perhaps the responses for xmlrpc have to be reviewed. I am not sure it can be fixed all in xmlrpc module or commands have to be reviewed as well.
What comes in my mind now, for a solution in xmlrpc module, is to wrap always the data in the response in an array.
Anyhow, everyone is welcome to contribute on properly formatting the response based on xmlrpc specs. The extension came via SER, so I am not sure who developed it initially.
Cheers, Daniel
On 04/03/14 21:52, Juha Heinanen wrote:
i tried make xmlrpc query on pkg.stats, but my xmlrpc lib was not able to parse the response (below). according to xmlrpc spec:
The body of the response is a single XML structure, a <methodResponse>, which can contain a single <params> which contains a single <param> which contains a single <value>.
according to the spec <value> is scalar value or <struct> or <array>. in sip proxy response below, there a several <struct>s in the <value>, which according to my understanding is violation of the spec.
instead, the response should be like this:
<?xml version="1.0"?>
<methodResponse> <params> <param> <value> <array> <data> <value> <struct>...</struct> </value> <value> <struct>...</struct> </value> ... </data> </array> </param> </methodResponse>
comments?
-- juha
Received the following response:
HTTP/1.0 200 OK Via: SIP/2.0/TCP 127.0.0.1:36643 Server: OpenXg SIP Proxy (4.1.1-2 (i386/linux)) Content-Length: 6311
<?xml version="1.0"?>
<methodResponse> <params> <param> <value><struct><member><name>entry</name><value><int>0</int></value></member><member><name>pid</name><value><int>5846</int></value></member><member><name>rank</name><value><int>0</int></value></member><member><name>used</name><value><int>4553004</int></value></member><member><name>free</name><value><int>559936</int></value></member><member><name>real_used</name><value><int>5731520</int></value></member></struct> <struct><member><name>entry</name><value><int>1</int></value></member><member><name>pid</name><value><int>5848</int></value></member><member><name>rank</name><value><int>1</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>2</int></value></member><member><name>pid</name><value><int>5849</int></value></member><member><name>rank</name><value><int>2</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>3</int></value></member><member><name>pid</name><value><int>5850</int></value></member><member><name>rank</name><value><int>3</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>4</int></value></member><member><name>pid</name><value><int>5851</int></value></member><member><name>rank</name><value><int>4</int></value></member><member><name>used</name><value><int>4557328</int></value></member><member><name>free</name><value><int>554652</int></value></member><member><name>real_used</name><value><int>5736804</int></value></member></struct> <struct><member><name>entry</name><value><int>5</int></value></member><member><name>pid</name><value><int>5852</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556356</int></value></member><member><name>free</name><value><int>556296</int></value></member><member><name>real_used</name><value><int>5735160</int></value></member></struct> <struct><member><name>entry</name><value><int>6</int></value></member><member><name>pid</name><value><int>5853</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556356</int></value></member><member><name>free</name><value><int>556296</int></value></member><member><name>real_used</name><value><int>5735160</int></value></member></struct> <struct><member><name>entry</name><value><int>7</int></value></member><member><name>pid</name><value><int>5854</int></value></member><member><name>rank</name><value><int>4294967294</int></value></member><member><name>used</name><value><int>4563012</int></value></member><member><name>free</name><value><int>549112</int></value></member><member><name>real_used</name><value><int>5742344</int></value></member></struct> <struct><member><name>entry</name><value><int>8</int></value></member><member><name>pid</name><value><int>5857</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556368</int></value></member><member><name>free</name><value><int>556236</int></value></member><member><name>real_used</name><value><int>5735220</int></value></member></struct> <struct><member><name>entry</name><value><int>9</int></value></member><member><name>pid</name><value><int>5863</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4556368</int></value></member><member><name>free</name><value><int>556236</int></value></member><member><name>real_used</name><value><int>5735220</int></value></member></struct> <struct><member><name>entry</name><value><int>10</int></value></member><member><name>pid</name><value><int>5873</int></value></member><member><name>rank</name><value><int>4294967295</int></value></member><member><name>used</name><value><int>4557616</int></value></member><member><name>free</name><value><int>554844</int></value></member><member><name>real_used</name><value><int>5736612</int></value></member></struct> <struct><member><name>entry</name><value><int>11</int></value></member><member><name>pid</name><value><int>5876</int></value></member><member><name>rank</name><value><int>5</int></value></member><member><name>used</name><value><int>4642360</int></value></member><member><name>free</name><value><int>467988</int></value></member><member><name>real_used</name><value><int>5823468</int></value></member></struct> <struct><member><name>entry</name><value><int>12</int></value></member><member><name>pid</name><value><int>5877</int></value></member><member><name>rank</name><value><int>6</int></value></member><member><name>used</name><value><int>4618200</int></value></member><member><name>free</name><value><int>493396</int></value></member><member><name>real_used</name><value><int>5798060</int></value></member></struct> <struct><member><name>entry</name><value><int>13</int></value></member><member><name>pid</name><value><int>5878</int></value></member><member><name>rank</name><value><int>7</int></value></member><member><name>used</name><value><int>4618200</int></value></member><member><name>free</name><value><int>493396</int></value></member><member><name>real_used</name><value><int>5798060</int></value></member></struct> <struct><member><name>entry</name><value><int>14</int></value></member><member><name>pid</name><value><int>5884</int></value></member><member><name>rank</name><value><int>4294967292</int></value></member><member><name>used</name><value><int>4035956</int></value></member><member><name>free</name><value><int>497228</int></value></member><member><name>real_used</name><value><int>5307880</int></value></member></struct> </value> </param> </params> </methodResponse>
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
Daniel-Constantin Mierla writes:
Perhaps the responses for xmlrpc have to be reviewed. I am not sure it can be fixed all in xmlrpc module or commands have to be reviewed as well.
What comes in my mind now, for a solution in xmlrpc module, is to wrap always the data in the response in an array.
Anyhow, everyone is welcome to contribute on properly formatting the response based on xmlrpc specs. The extension came via SER, so I am not sure who developed it initially.
i'm reading well written xmlrpc/README and it has this:
If an RPC function adds more than one data items to the result set then the module will return an array containing all the data items:
HTTP/1.0 200 OK Via: SIP/2.0/TCP 127.0.0.1:2932 Server: Sip EXpress router (0.10.99-janakj_experimental (i386/linux)) Content-Length: 276
<?xml version="1.0" encoding="UTF-8"?> <methodResponse> <params> <param><value><array><data> <value><string>./ser</string></value> <value><string>-f</string></value> <value><string>ser.cfg</string></value> </data></array></value></param> </params> </methodResponse>
which is exactly how it should done. however, in the case of pkg.stats that does not happen, i.e., value is not an array. i don't know where the bug is.
-- juha
i found the reason why pkg.stats result is not returned as an array: RET_ARRAY flag was missing from the export. pkg.stats export needs to be defined like this:
rpc_export_t kex_pkg_rpc[] = { {"pkg.stats", rpc_pkg_stats, rpc_pkg_stats_doc, RET_ARRAY}, {0, 0, 0, 0} };
i'll make the commit shortly. looks like there are other rpc functions too where the flag should be there, but is missing.
-- juha