[Top][All Lists]
[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
- [Demexp-dev] [hack] basic structure for an XML RPC <-> ONC RPC proxy for demexp in Python,
David MENTRE <=