Issue #26885: xmlrpc now supports unmarshalling additional data types used

by Apache XML-RPC implementation for numerics and None.
This commit is contained in:
Serhiy Storchaka 2016-09-11 11:23:38 +03:00
parent 9fab79bcb5
commit 352601ca00
5 changed files with 101 additions and 8 deletions

View file

@ -132,6 +132,7 @@ import base64
import sys
import time
from datetime import datetime
from decimal import Decimal
import http.client
import urllib.parse
from xml.parsers import expat
@ -667,6 +668,8 @@ class Unmarshaller:
def start(self, tag, attrs):
# prepare to handle this element
if ':' in tag:
tag = tag.split(':')[-1]
if tag == "array" or tag == "struct":
self._marks.append(len(self._stack))
self._data = []
@ -682,9 +685,13 @@ class Unmarshaller:
try:
f = self.dispatch[tag]
except KeyError:
pass # unknown tag ?
else:
return f(self, "".join(self._data))
if ':' not in tag:
return # unknown tag ?
try:
f = self.dispatch[tag.split(':')[-1]]
except KeyError:
return # unknown tag ?
return f(self, "".join(self._data))
#
# accelerator support
@ -694,9 +701,13 @@ class Unmarshaller:
try:
f = self.dispatch[tag]
except KeyError:
pass # unknown tag ?
else:
return f(self, data)
if ':' not in tag:
return # unknown tag ?
try:
f = self.dispatch[tag.split(':')[-1]]
except KeyError:
return # unknown tag ?
return f(self, data)
#
# element decoders
@ -721,14 +732,23 @@ class Unmarshaller:
def end_int(self, data):
self.append(int(data))
self._value = 0
dispatch["i1"] = end_int
dispatch["i2"] = end_int
dispatch["i4"] = end_int
dispatch["i8"] = end_int
dispatch["int"] = end_int
dispatch["biginteger"] = end_int
def end_double(self, data):
self.append(float(data))
self._value = 0
dispatch["double"] = end_double
dispatch["float"] = end_double
def end_bigdecimal(self, data):
self.append(Decimal(data))
self._value = 0
dispatch["bigdecimal"] = end_bigdecimal
def end_string(self, data):
if self._encoding: