Hello,

On 11/13/12 8:29 AM, Kristofer Signer wrote:
Thank you all for you questions.

On Tue, Nov 13, 2012 at 1:51 PM, Carlos Ruiz Díaz
<[email protected]> wrote:
If you write your own parser you will be writing your own implementation of
the xmlrpc decoder which I believe could be very complicated not even
mentioning that it's close to reinventing the wheel.

I think Carsten's solution is the best right now. I'll try his approach
myself.

Another solution is to use the 'mi' method together with the 'ul_dump'
mi-command
<?xml version='1.0'?>
<methodCall>
<methodName>mi</methodName>
<params>
<param>
<value><string>ul_dump</string></value>
</param>
</params>
</methodCall>

This call will return an array which is xmlrpc-correct

isn't it more like the text printed by mi command enclosed in the xmlrpc reply? Does it result in a valid xmlrpc array?

Anyhow, we should add support for xmrpc arrays if that's the right approach, should not be that complex, just we thought we don't need. I know that all the records were returned in the xmlreply, but I understand that some parsers overwrite if they get same structure many tines.

Cheers,
Daniel

  Then I can use
any xmlrpc parser to get the data and when the xmlrpc library is done
I'll have an string array where every string is a key-value pair which
I can take care of.

It is similar to Carstens solution but you don't need to serialize it
to CVS format.

./Kristofer






Best Regards.

--
Carlos
http://caruizdiaz.com
+595981146623

On Tue, Nov 13, 2012 at 8:24 AM, Kristofer Signer
<[email protected]> wrote:
Hello,


On Tue, Nov 13, 2012 at 5:03 AM, Carlos Ruiz Díaz
<[email protected]> wrote:
Hello,

I've been through this problem a few weeks ago with my module that
exports
nested structures through xmlrpc. Apparently, there's a limitation in
the
technology itself that makes the nested structures to be overwritten
everytime the response XML is parsed, if you look closely, you will
notice
that this makes sense since the structures are indexed by the name of
the
field, which is the same for every record. That's the reason of only one
row
being displayed even though the whole recordset was sent out.
Yes, I have noticed this. And the problem is that a struct is just a
key-value-pair datatype which in normal situation does not support
multiple key with the same name.

A more correct implementation would be to represent the AoRs in an array.

I think I will also write a work around for this. just parsing the return
xml.




I tried with three different php libraries, even with xmlrpc_decode()
that
is the official function for decoding xmlrpc responses in php.

I didn't find a solution but I ended up using a workaround sending the
values using CSV format which was later parsed by the PHP in charge of
displaying the data.

Regards.

Carlos.

On Mon, Nov 12, 2012 at 11:43 PM, Daniel-Constantin Mierla
<[email protected]> wrote:
Hello,

I am not a python parameter, but seems a limitation of the
xmlrpc_test2.py
tool, the tcp dump shows that the records are sent back in the xmlrpc
response.

You will have to look inside/troubleshoot the xmlrpc_test2.py and see
why
it fails.

Cheers,
Daniel


On 11/12/12 9:58 AM, Kristofer Signer wrote:

Hello,

running kamailio 3.3.2.

On Mon, Nov 12, 2012 at 1:48 PM, Daniel-Constantin Mierla
<[email protected]> wrote:
Hello,


On 11/12/12 10:02 AM, Kristofer Signer wrote:
Hello,

I'm trying to dig in to the kamailio XMLRPC interfaces and the
limitations I read in

http://www.kamailio.org/docs/modules/stable/modules/xmlrpc.html#xmlrpc.implementation.limitations

is really a no go for us.
which one is a 'no go'? Nested structures are supported in the last
version, iirc, the readme does not seem to be updated for this case.
the 'no go' is the structure {AoR, HashID, Contact, AoR, HashID,
Contacts,
...}


For example, when to retrieve user locations and list of dialogs we
get
a xml document which is not so well formatted and we can not
successfully
parse it in an xmlrpc-parser.

Is there other options for xmlrpc module?

If the body is not successfully parsed, it is a bug. The limitation is
about not supporting all the data types, but when a reply is xmlrpc
sent, it
should be valid. Can you test it with 1-2 location records that fail
and
post the xmrpc here as well as the log error messages from the xml
parser?

Actually, I don't get any errors. I'm using the python example provided
in
kamailio src and that example will only parse out one record.


[krsi@vera examples]$ python xmlrpc_test2.py ul.dump foo
{'Domain': 'location', 'Stats': {'Records': 2, 'Max-Slots': 1}, 'AoRs':
{'HashID': 1731621673, 'AoR': 'jkp-01', 'Contacts': {'Contact':
{'Ruid':
'uloc-50a0ea3c-124bf-1', 'Received': '[not set]', 'Path': '[not set]',
'Reg-Id': 0, 'Expires': 99, 'Flags': 0, 'User-Agent': 'Jitsi1.0-Linux',
'Q':
0.0, 'Instance': '[not set]', 'State': 'CS_SYNC', 'CSeq': 11,
'Methods':
18446744073709551615L, 'CFlags': 0, 'Address':

'sip:[email protected]:25060;transport=udp;registering_acc=foo_bar_com',
'Call-ID': '61ac73a44826f3887a5db2371b044275@0:0:0:0:0:0:0:0',
'Socket':
'udp:192.168.0.82:5060'}}}, 'Size': 512}

As you can see,. there should be two records but only one is parsed.


Here is the response body from tcpdump

<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value><struct>


<member><name>Domain</name><value><string>location</string></value></member>
   <member><name>Size</name><value><int>512</int></value></member>
   <member>
     <name>AoRs</name>
     <value><struct>

<member><name>AoR</name><value><string>jkp-02</string></value></member>


<member><name>HashID</name><value><int>1731621670</int></value></member>
       <member>
         <name>Contacts</name>
         <value><struct>
           <member>
             <name>Contact</name>
             <value><struct>


<member><name>Address</name><value><string>sip:[email protected]:35060</string></value></member>

<member><name>Expires</name><value><int>768</int></value></member>

<member><name>Q</name><value><double>0.000000</double></value></member>


<member><name>Call-ID</name><value><string>[email protected]</string></value></member>

<member><name>CSeq</name><value><int>383</int></value></member>


<member><name>User-Agent</name><value><string>Twinkle/1.4.2</string></value></member>
               <member><name>Received</name><value><string>[not
set]</string></value></member>
               <member><name>Path</name><value><string>[not
set]</string></value></member>


<member><name>State</name><value><string>CS_SYNC</string></value></member>

<member><name>Flags</name><value><int>0</int></value></member>

<member><name>CFlags</name><value><int>0</int></value></member>


<member><name>Socket</name><value><string>udp:192.168.0.82:5060</string></value></member>

<member><name>Methods</name><value><int>6111</int></value></member>


<member><name>Ruid</name><value><string>uloc-50a0ea3c-124c0-1</string></value></member>
               <member><name>Instance</name><value><string>[not
set]</string></value></member>

<member><name>Reg-Id</name><value><int>0</int></value></member>
             </struct></value>
           </member>
         </struct></value>
       </member>
       <member>
         <name>AoR</name><value><string>jkp-01</string></value></member>


<member><name>HashID</name><value><int>1731621673</int></value></member>
         <member>
           <name>Contacts</name>
           <value><struct>
             <member>
               <name>Contact</name>
               <value><struct>


<member><name>Address</name><value><string>sip:[email protected]:25060</string></value></member>

<member><name>Expires</name><value><int>185</int></value></member>

<member><name>Q</name><value><double>0.000000</double></value></member>


<member><name>Call-ID</name><value><string>61ac73a44826f3887a5db2371b044275@0:0:0:0:0:0:0:0</string></value></member>

<member><name>CSeq</name><value><int>12</int></value></member>


<member><name>User-Agent</name><value><string>Jitsi1.0-Linux</string></value></member>
                 <member><name>Received</name><value><string>[not
set]</string></value></member>
                 <member><name>Path</name><value><string>[not
set]</string></value></member>


<member><name>State</name><value><string>CS_SYNC</string></value></member>

<member><name>Flags</name><value><int>0</int></value></member>

<member><name>CFlags</name><value><int>0</int></value></member>


<member><name>Socket</name><value><string>udp:192.168.0.82:5060</string></value></member>


<member><name>Methods</name><value><int>18446744073709551615</int></value></member>


<member><name>Ruid</name><value><string>uloc-50a0ea3c-124bf-1</string></value></member>
                 <member><name>Instance</name><value><string>[not
set]</string></value></member>

<member><name>Reg-Id</name><value><int>0</int></value></member>
               </struct></value>
             </member>
           </struct></value>
         </member>
       </struct></value>
     </member>
     <member>
       <name>Stats</name>
       <value><struct>

<member><name>Records</name><value><int>2</int></value></member>

<member><name>Max-Slots</name><value><int>1</int></value></member>
       </struct></value>
     </member>
   </struct></value>
</param>
</params>
</methodResponse>



and for reference, the same command from kamctl:

  [krsi@sipproxy1 ~]$  kamctl mi ul_dump
Domain:: location table=512 records=2 max_slot=1
         AOR:: jkp-02
                 Contact:: sip:[email protected]:35060 Q=
                         Expires:: 1961
                         Callid:: [email protected]
                         Cseq:: 383
                         User-agent:: Twinkle/1.4.2
                         State:: CS_SYNC
                         Flags:: 0
                         Cflag:: 0
                         Socket:: udp:192.168.0.82:5060
                         Methods:: 6111
                         Ruid:: uloc-50a0ea3c-124c0-1
                         Reg-Id:: 0
         AOR:: jkp-01
                 Contact:: sip:[email protected]:25060 Q=
                         Expires:: 298
                         Callid::
61ac73a44826f3887a5db2371b044275@0:0:0:0:0:0:0:0
                         Cseq:: 10
                         User-agent:: Jitsi1.0-Linux
                         State:: CS_SYNC
                         Flags:: 0
                         Cflag:: 0
                         Socket:: udp:192.168.0.82:5060
                         Methods:: 4294967295
                         Ruid:: uloc-50a0ea3c-124bf-1
                         Reg-Id:: 0


Thanks
./Kristofer

For example, siremis uses the xmlrpc interface and all is ok with
handling the replies. It uses a library from php pear.

Cheers,
Daniel

--
Daniel-Constantin Mierla - http://www.asipto.com
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda


--
Daniel-Constantin Mierla - http://www.asipto.com
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda


_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users




--
Carlos
http://caruizdiaz.com
+595981146623


--
Daniel-Constantin Mierla - http://www.asipto.com
http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda


_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users

Reply via email to