demexp-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Demexp-dev] [hack] basic structure for an XML RPC <-> ONC RPC proxy for


From: David MENTRE
Subject: [Demexp-dev] [hack] basic structure for an XML RPC <-> ONC RPC proxy for demexp in Python
Date: Fri, 01 Sep 2006 17:57:58 +0200
User-agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.4 (gnu/linux)

Hi,

I've played a bit with XML-RPC server API in Python[1] as well as with
Thomas's RPC binding for demexp[2] and I succeeded in hacking the start
of a basic XML RPC <-> ONC RPC proxy for demexp (see the joined Python
code).

Example of use (in Python):
>>> from xmlrpclib import *
>>> server = ServerProxy("http://localhost:50001";)
>>> server.login("demo","demo")
27948569
>>> server.max_question_id(27948569)
270
>>> print server.question_info(27948569, 0, 3)
[{'q_id': 2, 'q_info_num_votes': 4, 'q_info_limit_date': 0, 'q_desc': u"Le but 
de toute association politique est la conservation des droits naturels et 
imprescriptibles de l'Homme. Ces droits sont la libert\xe9, la propri\xe9t\xe9, 
la s\xfbret\xe9, et la r\xe9sistance \xe0 l'oppression.", 
'q_info_elected_responses': [1], 'q_timestamp': 20648718, 'q_info_status': 2, 
'q_info_responses': [{'r_info_desc': 'Question rejected', 'r_info_link': ''}, 
{'r_info_desc': u"D'accord pour reconna\xeetre ce droit.", 'r_info_link': 
'http://www.conseil-constitutionnel.fr/textes/d1789.htm'}]}, {'q_id': 1, 
'q_info_num_votes': 9, 'q_info_limit_date': 0, 'q_desc': u"Les hommes naissent 
et demeurent libres et \xe9gaux en droits. Les distinctions sociales ne peuvent 
\xeatre fond\xe9es que sur l'utilit\xe9 commune.", 'q_info_elected_responses': 
[2], 'q_timestamp': 16804478, 'q_info_status': 2, 'q_info_responses': 
[{'r_info_desc': 'Question rejected', 'r_info_link': ''}, {'r_info_desc': 
u"D'accord pour reconna\xeetre ce droit", 'r_info_link': 
'http://www.conseil-constitutionnel.fr/textes/d1789.htm'}, {'r_info_desc': u"Je 
pr\xe9f\xe8re la r\xe9daction \xab Les humains naissent et demeurent libres et 
\xe9gaux en droits. Les distinctions sociales ne peuvent \xeatre fond\xe9es que 
sur l'utilit\xe9 commune. \xbb", 'r_info_link': ''}]}, {'q_id': 0, 
'q_info_num_votes': 21, 'q_info_limit_date': 0, 'q_desc': 'Est-ce que vous 
trouvez demexp utilisable ?', 'q_info_elected_responses': [2], 'q_timestamp': 
24115814, 'q_info_status': 2, 'q_info_responses': [{'r_info_desc': 'Question 
rejected', 'r_info_link': ''}, {'r_info_desc': u'Ind\xe9cis', 'r_info_link': 
''}, {'r_info_desc': 'Oui', 'r_info_link': ''}, {'r_info_desc': 'Non', 
'r_info_link': ''}, {'r_info_desc': u'm\xeame le dimanche?', 'r_info_link': 
''}, {'r_info_desc': 'oui', 'r_info_link': ''}, {'r_info_desc': u'Uniquement 
avec un \xe9cran large', 'r_info_link': ''}, {'r_info_desc': 'A qd la langue 
francaise ?', 'r_info_link': ''}, {'r_info_desc': 'NON', 'r_info_link': ''}, 
{'r_info_desc': 'Difficile pour un non informaticien', 'r_info_link': ''}]}]

I join the network XML encoding for the last call,
question_info(27948569, 0, 3), that shows how things are done at the
network level. Apparently, the original XDR structure is kept with
minimal effort and correctly translated into XML. In the joined file
(xmlrpc-question_info-call.txt), the UTF-8 encoding of strings is
screwed up but this is only Ethereal that does a bad job at printing its
result. 

This code is not for real use and is really, really, *really* a
hack. :-) But it shows that binding XML RPC and ONC RPC for demexp is
not so difficult. I'll try in the following weeks to make some usable
code.

Augustin, right now the return result is undocumented but for complex
answers like question_info(), returned valued is an XML-RPC mix of
<array>s and <struct>s. That should translate to PHP array of
arrays. I'll try to document all that. In the meantime, you can look at
chapter 3 (p. 14) of demexp book[3] to get an idea of demexp
protocol. Do not hesitate to ask questions.

For those who would like to produce some Python code, I don't know how
to correctly report an error on the XML RPC side, e.g. in case the ONC
RPC call fails (except raising an exception). Any help is welcome.

Best wishes,
d.

Footnotes: 
[1]  http://www.python.org/doc/current/lib/module-SimpleXMLRPCServer.html

[2]  http://thomas.enix.org/pub/pydemexp/

[3]  
http://www.linux-france.org/~dmentre/demexp/latest-src/demexp-book-0.6.3.pdf

#!/usr/bin/python

import sys
import socket
import DemexpRpc
from SimpleXMLRPCServer import *

# global parameters
server_name = "demo.demexp.org"
server_port = 50000

# Connect to the server
try:
    onc = DemexpRpc.client.Demexp.V1(server_name, server_port)
except socket.error:
    print "Connexion failed to %s:%d" % (server_name, server_port)
    sys.exit (1)


# methods avaible on the XML-RPC side
def login(login, passwd):
    login_ret = onc.login(DemexpRpc.const.PROTOCOL_VERSION, login, passwd)
    # Check the protocol version returned by the server to see if it's the
    # same as the one we implement
    if login_ret.server_protocol_version != DemexpRpc.const.PROTOCOL_VERSION:
        print "demexp server has a different protocol version"
        sys.exit (1)

    # Check that login was successful
    if login_ret.login_return_code != DemexpRpc.const.rt_ok:
        print "Error: " + \
              DemexpRpc.const.return_code_t[login_ret.login_return_code] \
              + " (" + str(login_ret.login_return_code) + ")"
        sys.exit (1)

    return login_ret.login_cookie

def max_question_id(cookie):
    ret = onc.max_question_id(cookie)
    
    if ret.max_question_id_rc != DemexpRpc.const.rt_ok:
        print "Error: " + \
              DemexpRpc.const.return_code_t[ret.max_question_id_rc] \
              + " (" + str(ret.max_question_id_rc) + ")"
        sys.exit (1)

    return ret.max_question_id

def question_info(cookie, min, max):
    ret = onc.question_info (cookie, min, max)
    if ret.question_info_rc != DemexpRpc.const.rt_ok:
        print "Error: " + DemexpRpc.const.return_code_t[ret.question_info_rc] \
                        + " (" + str(ret.question_info_rc) + ")"
        sys.exit (1)
    return ret.question_info

# setup the XML RPC server
xmlrpc = SimpleXMLRPCServer(("localhost", 50001))
xmlrpc.register_function(login)
xmlrpc.register_function(max_question_id)
xmlrpc.register_function(question_info)
xmlrpc.register_introspection_functions()

# start XML server
xmlrpc.serve_forever()
POST /RPC2 HTTP/1.0
Host: localhost:50001
User-Agent: xmlrpclib.py/1.0.1 (by www.pythonware.com)
Content-Type: text/xml
Content-Length: 249


<?xml version='1.0'?>
<methodCall>
<methodName>question_info</methodName>
<params>
<param>
<value><int>27948569</int></value>
</param>
<param>
<value><int>0</int></value>
</param>
<param>
<value><int>3</int></value>
</param>
</params>
</methodCall>

HTTP/1.0 200 OK

Server: BaseHTTP/0.3 Python/2.3.5
Date: Fri, 01 Sep 2006 15:26:04 GMT
Content-type: text/xml
Content-length: 5987

<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value><array><data>
<value><struct>
<member>
<name>q_id</name>
<value><int>2</int></value>
</member>
<member>
<name>q_info_num_votes</name>
<value><int>4</int></value>
</member>
<member>
<name>q_info_limit_date</name>
<value><int>0</int></value>
</member>
<member>
<name>q_desc</name>
<value><string>Le but de toute association politique est la conservation des 
droits naturels et imprescriptibles de l'Homme. Ces droits sont la libert.., la 
propri..t.., la s..ret.., et la r..sistance .. l'oppression.</string></value>
</member>
<member>
<name>q_info_elected_responses</name>
<value><array><data>
<value><int>1</int></value>
</data></array></value>
</member>
<member>
<name>q_timestamp</name>
<value><int>20648718</int></value>
</member>
<member>
<name>q_info_status</name>
<value><int>2</int></value>
</member>
<member>
<name>q_info_responses</n
ame>
<value><array><data>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Question rejected</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>D'accord pour reconna..tre ce droit.</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string>http://www.conseil-constitutionnel.fr/textes/d1789.htm</string></value>
</member>
</struct></value>
</data></array></value>
</member>
</struct></value>
<value><struct>
<member>
<name>q_id</name>
<value><int>1</int></value>
</member>
<member>
<name>q_info_num_votes</name>
<value><int>9</int></value>
</member>
<member>
<name>q_info_limit_date</name>
<value><int>0</int></value>
</member>
<member>
<name>q_desc</name>
<value><string>Les hommes naissent et demeurent libres et ..gaux en droits. Les 
distinctions sociales ne peuvent ..tre fond..es que sur l'utilit.. 
commune.</string></value>
</member>
<member>
<name>
q_info_elected_responses</name>
<value><array><data>
<value><int>2</int></value>
</data></array></value>
</member>
<member>
<name>q_timestamp</name>
<value><int>16804478</int></value>
</member>
<member>
<name>q_info_status</name>
<value><int>2</int></value>
</member>
<member>
<name>q_info_responses</name>
<value><array><data>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Question rejected</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>D'accord pour reconna..tre ce droit</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string>http://www.conseil-constitutionnel.fr/textes/d1789.htm</string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Je pr..f..re la r..daction .. Les humains naissent et demeurent 
libres et ..gaux en droits. Les distinctions sociales ne peuvent ..tre fond..es 
que s
ur l'utilit.. commune. ..</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
</data></array></value>
</member>
</struct></value>
<value><struct>
<member>
<name>q_id</name>
<value><int>0</int></value>
</member>
<member>
<name>q_info_num_votes</name>
<value><int>21</int></value>
</member>
<member>
<name>q_info_limit_date</name>
<value><int>0</int></value>
</member>
<member>
<name>q_desc</name>
<value><string>Est-ce que vous trouvez demexp utilisable ?</string></value>
</member>
<member>
<name>q_info_elected_responses</name>
<value><array><data>
<value><int>2</int></value>
</data></array></value>
</member>
<member>
<name>q_timestamp</name>
<value><int>24115814</int></value>
</member>
<member>
<name>q_info_status</name>
<value><int>2</int></value>
</member>
<member>
<name>q_info_responses</name>
<value><array><data>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Question rejected</string></value>
</member>
<member>
<name>r_in
fo_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Ind..cis</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Oui</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Non</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>m..me le dimanche?</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>oui</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
<
/member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Uniquement avec un ..cran large</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>A qd la langue francaise ?</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>NON</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
<value><struct>
<member>
<name>r_info_desc</name>
<value><string>Difficile pour un non informaticien</string></value>
</member>
<member>
<name>r_info_link</name>
<value><string></string></value>
</member>
</struct></value>
</data></array></value>
</member>
</struct></value>
</data></array></value>
</param>
</params>
</methodResponse>

-- 
GPG/PGP key: A3AD7A2A David MENTRE <address@hidden>
 5996 CC46 4612 9CA4 3562  D7AC 6C67 9E96 A3AD 7A2A

reply via email to

[Prev in Thread] Current Thread [Next in Thread]