OVH Cloud OVH Cloud

xmlrpclib et carriage return (r)

3 réponses
Avatar
Jonathan B.
Salut,

j'ai un serveur xmlrpc qui reçoit des appels en provenance de clients Windows.
Parmi ce que ces clients envoient, je reçois des chaînes de caractères multi-ligne, avec des "\n\r" dedans.

Le problème, c'est que quand je fais un appel à xmlrpclib.loads pour récupérer
la méthode et les paramètres de cet appel, xmlrpclib.loads me bouffe les \r :/
Comme je dois renvoyer ces infos après à d'autres clients Windows, c'est un peu génant (les clients m'affichent un beau caractère carré au lieu du saut de ligne ... )

Démonstration du problème :
$ python
Python 2.3.5 (#2, Sep 4 2005, 22:01:42)
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import xmlrpclib
>>> data = """<?xml version="1.0" encoding="utf-8"?>\n<methodCall>\n <methodName>testmethod</methodName>\n <params>\n <param>\n <value>\n <string>bla\n\rbla\n\r bla</string>\n </value>\n </param>\n </params>\n</methodCall>"""
>>> xmlrpclib.loads(data)
(('bla\n\nbla\n\n\tbla',), u'testmethod')
^^^^^
>>>

Qu'est-ce que je peux faire pour éviter la disparition de ces caractères ? (à part faire un output.replace("\n", "\n\r") :D )

Merci,
Jonathan

3 réponses

Avatar
Eric Deveaud
Jonathan B. wrote:
Salut,

j'ai un serveur xmlrpc qui reçoit des appels en provenance de clients Windows.
Parmi ce que ces clients envoient, je reçois des chaînes de caractères multi-ligne, avec des "nr" dedans.

Le problème, c'est que quand je fais un appel à xmlrpclib.loads pour récupérer
la méthode et les paramètres de cet appel, xmlrpclib.loads me bouffe les r :/
Comme je dois renvoyer ces infos après à d'autres clients Windows, c'est un peu génant (les clients m'affichent un beau caractère carré au lieu du saut de ligne ... )

Démonstration du problème :
$ python
Python 2.3.5 (#2, Sep 4 2005, 22:01:42)
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import xmlrpclib
data = """<?xml version="1.0" encoding="utf-8"?>n<methodCall>n <methodName>testmethod</methodName>n <params>n <param>n <value>n <string>blanrblanr bla</string>n </value>n </param>n </params>n</methodCall>"""
xmlrpclib.loads(data)
(('blannblanntbla',), u'testmethod')





sans aucune garantie est-ce qu'un replace('n', 'nr') sur la chaine
ne conviendrait pas ??

y'a surement un truc plus mieux bien, mais je connais pas windows ;-)
et n'ai pas eu a me pencher sur ce type de pb ;-))

Eric
--
un tentative de penetration (pas de sous entendus) d'un systeme peut
etr compare a un viol. Le portscan reviendrait a promener ses doigts
pour voir s'il y a une ceinture de chastete ...
-+- M in GNU - Petit traité de sexualité informatique appliquée -+-




Avatar
Jonathan B.
Eric Deveaud wrote:
Jonathan B. wrote:
Salut,

j'ai un serveur xmlrpc qui reçoit des appels en provenance de clients Windows.
Parmi ce que ces clients envoient, je reçois des chaînes de caractères multi-ligne, avec des "nr" dedans.

Le problème, c'est que quand je fais un appel à xmlrpclib.loads pour récupérer
la méthode et les paramètres de cet appel, xmlrpclib.loads me bouffe les r :/
Comme je dois renvoyer ces infos après à d'autres clients Windows, c'est un peu génant (les clients m'affichent un beau caractère carré au lieu du saut de ligne ... )

Démonstration du problème :
$ python
Python 2.3.5 (#2, Sep 4 2005, 22:01:42)
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import xmlrpclib
data = """<?xml version="1.0" encoding="utf-8"?>n<methodCall>n <methodName>testmethod</methodName>n <params>n <param>n <value>n <string>blanrblanr bla</string>n </value>n </param>n </params>n</methodCall>"""
xmlrpclib.loads(data)
(('blannblanntbla',), u'testmethod')





sans aucune garantie est-ce qu'un replace('n', 'nr') sur la chaine
ne conviendrait pas ??

y'a surement un truc plus mieux bien, mais je connais pas windows ;-)
et n'ai pas eu a me pencher sur ce type de pb ;-))

Eric


Hum, c'est ce que je vais être amené à faire finalement je pense, mais j'espérais une solution plus mieux propre :)
Le seul truc qui me pose problème à faire ça, c'est est-ce que dans tout les cas je vais avoir besoin de remplacer mes n par des nr ??




Je crois qu'on va dire oui, ça simplifiera les choses :D

Jonathan





Avatar
jeff
La spéc. xmlrpc (http://www.xmlrpc.com/spec) dit :

"""
What characters are allowed in strings? Non-printable characters?
Null characters? Can a "string" be used to hold an arbitrary chunk
of binary data?

Any characters are allowed in a string except < and &, which are
encoded as &lt; and &amp;. A string can be used to encode binary
data.
"""

Donc les r et n devraient être préservés.
N'y a-t-il pas un bug dans xmlrpclib ? (voir
http://www.pythonware.com).

En attendant, les clients ne pourraient-ils pas être adaptés pour
remplacer "r" ? Le serveur faisant la manip. inverse.

jeff