xmlrpc / long int exceeds XML-RPC limits

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

hallo,

ich übergebe ein dict an einen xmlrpc server und in dem dict ist womöglich eine etwas zu lange zahl, kürzen geht aber nicht :)

Auf jedenfall krieg ich folgende Fehlermeldung
Traceback (most recent call last):
File "guiC.py", line 96, in uploadKey
wx.LogMessage(self.server.sendKey(newDict))
File "/usr/lib/python2.4/xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.4/xmlrpclib.py", line 1377, in __request
allow_none=self.__allow_none)
File "/usr/lib/python2.4/xmlrpclib.py", line 1029, in dumps
data = m.dumps(params)
File "/usr/lib/python2.4/xmlrpclib.py", line 603, in dumps
dump(v, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 615, in __dump
f(self, value, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 696, in dump_struct
dump(v, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 615, in __dump
f(self, value, write)
File "/usr/lib/python2.4/xmlrpclib.py", line 641, in dump_long
raise OverflowError, "long int exceeds XML-RPC limits"
OverflowError: long int exceeds XML-RPC limits

Jetzt hab ich versucht, das ganze mittels xmlrpclib.Binary zu übertragen, doch da hab ich jetzt irgendwie keine möglichkeit mittels

dict["n"] auf die indizierung drauf zuzugreifen. Dort bekomme ich
Traceback (most recent call last):
File "guiC.py", line 96, in uploadKey
wx.LogMessage(self.server.sendKey(binDict))
File "/usr/lib/python2.4/xmlrpclib.py", line 1096, in __call__
return self.__send(self.__name, args)
File "/usr/lib/python2.4/xmlrpclib.py", line 1383, in __request
verbose=self.__verbose
File "/usr/lib/python2.4/xmlrpclib.py", line 1147, in request
return self._parse_response(h.getfile(), sock)
File "/usr/lib/python2.4/xmlrpclib.py", line 1286, in _parse_response
return u.close()
File "/usr/lib/python2.4/xmlrpclib.py", line 744, in close
raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: "exceptions.AttributeError:Binary instance has no attribute '__getitem__'">

Jemand eine Idee, wie man dies lösen kann?!

Gruß
Christian
BlackJack

Ohne zu sehen was Du da genau machst, kann man nichts genaues sagen. Was schickst Du denn jetzt? Ein Dictionary scheint es ja nicht mehr zu sein. Und wie kodierst Du die zu grosse Zahl?
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

hm okay. Ich schreibs ma einfach ohne hin und her vom server. Hab da eben was programmiert, da krieg ich auch den Fehler

unserialize funktion (nur zur info, steht in anderer datei)

Code: Alles auswählen

def unserialize(my_file):
f = file(my_file, 'r')
serial = Unpickler(f)
unserial = serial.load()
f.close()
return unserial

Code: Alles auswählen

import xmlrpclib

adict = unserialize("./public/silvio")[0]
print adict["N"]
bdict = xmlrpclib.Binary(adict)
print bdict["N"]
Fehlermeldung:
Traceback (most recent call last):
File "test.py", line 9, in ?
print bdict["N"]
AttributeError: Binary instance has no attribute '__getitem__'

Mir ist klar, dass ich von dem binary nicht auf die indizierung zuzugreifen,
aber wie schaff ich es wieder zu "decoden" ?! die Methode gibt es ja bei xmlrpc.Binary.decode() ?!
nur mit
edict = xmlrpclib.Binary.decode(bdict) gibt:
edict = xmlrpclib.Binary.decode(bdict)
TypeError: decode() takes exactly 2 arguments (1 given

Inhalt von der datei(dict) silvio:
(lp0
(dp1
S'e'
p2
L65537L
sS'Name'
p3
Vsilvio
p4
sS'Algorithm'
p5
S'RSA'
p6
sS'N'
p7
L60260201460653960515702932700615241773576198967774478812712064737800990995991L



Vielleicht jetzt etwas verständlicher? Die große Zahl ist n long

mfg
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dankegut hat geschrieben:ich übergebe ein dict an einen xmlrpc server und in dem dict ist womöglich eine etwas zu lange zahl, kürzen geht aber nicht :)
Hallo Christian!

Wandle vorher die Zahl in einen String um. Übertrage das Ding vom Server zum Client und wandle es dann am Client wieder von einem String in eine Zahl zurück. Vergiss "Binary" für so etwas. Man kann seitenlange Texte übertragen, dann geht eine umgewandelte Zahl auch.

Aber das Handling von Binary ist auch nicht schwer:

Code: Alles auswählen

>>> import xmlrpclib
>>> b = xmlrpclib.Binary(99999999999999999999999999999999999999999999999999999999999)
>>> b.data
99999999999999999999999999999999999999999999999999999999999L
>>> 
Der Client bekommt das Binary-Objekt übermittelt. Du brauchst dann nur über das Attribut ``data`` darauf zugreifen.

Aber damit bist du nicht mehr unabhängig von der Programmiersprache des Clients. Besser, du übergibst die lange Zahl als String.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

hm.. alles klar. Das Problem liegt aber daran, dass ich ein dict übergeben MUSS. Ich komm da leider nicht drumherum, da ich sonst 2 an sich gleiche Methoden schreiben muss, für jeweils RSA und ElGamal (werden einmal 4 und einmal 5 Werte übergeben) Dadurch würde sich, wenn ich es einzeln übertragen würde, die Methode anders aussehen.
Gibt es da was, das binary vom dict das an den Server geschickt wird wieder zu decoden und mit dem server auf die Attribute des dict zuzugreifen?! Das ist gerade mein Hauptproblem. :cry:

gruss christian
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dankegut hat geschrieben:Das Problem liegt aber daran, dass ich ein dict übergeben MUSS.
Hi Christian!

Was ich eigentlich meinte: Wandle deine Zahl bereits im Dictionary in einen String um. Einfach ein

Code: Alles auswählen

xydict["diezahl"] = str(xydict["diezahl"])
Der Empfänger muss den String einfach wieder in eine Zahl umwandeln.

Code: Alles auswählen

xydict["diezahl"] = long(xydict["diezahl"])
Wenn du das auch nicht darfst, dann verstehe ich die Welt nicht mehr.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
dankegut
User
Beiträge: 29
Registriert: Montag 16. Oktober 2006, 18:56
Kontaktdaten:

Wenn du das auch nicht darfst, dann verstehe ich die Welt nicht mehr.
aber ich verstehe dich :) Damit umgehe ich den long int exceeds xml-rpc limits error. Und ich denke ich darf die Zahl auch hin und her casten.

Hatte es erst irgendwie nich so ganz verstanden. Danke für deine Hilfe.

Gruß
Christian
Antworten