mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #26885: xmlrpc now supports unmarshalling additional data types used
by Apache XML-RPC implementation for numerics and None.
This commit is contained in:
parent
9fab79bcb5
commit
352601ca00
5 changed files with 101 additions and 8 deletions
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue