diff --git a/wsme/protocols/restxml.py b/wsme/protocols/restxml.py
index 5c58176..e9d8608 100644
--- a/wsme/protocols/restxml.py
+++ b/wsme/protocols/restxml.py
@@ -1,6 +1,7 @@
import datetime
from six import u
+import six
try:
import xml.etree.ElementTree as et
@@ -63,7 +64,7 @@ def toxml(datatype, key, value):
el.append(toxml(attrdef.datatype, attrdef.name,
getattr(value, attrdef.key)))
else:
- el.text = unicode(value)
+ el.text = six.text_type(value)
return el
diff --git a/wsme/root.py b/wsme/root.py
index 18f2bd2..4b98d98 100644
--- a/wsme/root.py
+++ b/wsme/root.py
@@ -4,6 +4,7 @@ import traceback
import weakref
from six import u, b
+import six
import webob
@@ -166,7 +167,20 @@ class WSRoot(object):
def _handle_request(self, request):
def default_prepare_response_body(request, results):
- return u('\n').join(results)
+ r = None
+ sep = None
+ for value in results:
+ if sep is None:
+ if isinstance(value, six.text_type):
+ sep = u('\n')
+ r = u('')
+ else:
+ sep = b('\n')
+ r = b('')
+ else:
+ r += sep
+ r += value
+ return r
res = webob.Response()
res_content_type = None
@@ -207,7 +221,11 @@ class WSRoot(object):
body = prepare_response_body(request, (
self._do_call(protocol, context)
for context in protocol.iter_calls(request)))
- res.unicode_body = body
+
+ if isinstance(body, six.text_type):
+ res.text = body
+ else:
+ res.body = body
if len(request.calls) == 1:
if hasattr(protocol, 'get_response_status'):
diff --git a/wsme/tests/test_restxml.py b/wsme/tests/test_restxml.py
index 796d28b..96364ae 100644
--- a/wsme/tests/test_restxml.py
+++ b/wsme/tests/test_restxml.py
@@ -2,7 +2,7 @@ import decimal
import datetime
import base64
-from six import u
+from six import u, b
import six
import wsme.tests.protocol
@@ -25,16 +25,17 @@ def dumpxml(key, obj, datatype=None):
for item in obj:
el.append(dumpxml('item', item, datatype[0]))
elif isinstance(datatype, dict):
+ key_type, value_type = list(datatype.items())[0]
for item in obj.items():
node = et.SubElement(el, 'item')
- node.append(dumpxml('key', item[0], datatype.keys()[0]))
- node.append(dumpxml('value', item[1], datatype.values()[0]))
+ node.append(dumpxml('key', item[0], key_type))
+ node.append(dumpxml('value', item[1], value_type))
elif datatype == wsme.types.binary:
el.text = base64.encodestring(obj)
elif isinstance(obj, six.string_types):
el.text = obj
elif type(obj) in (int, float, decimal.Decimal):
- el.text = str(obj)
+ el.text = six.text_type(obj)
elif type(obj) in (datetime.date, datetime.time, datetime.datetime):
el.text = obj.isoformat()
elif hasattr(datatype, '_wsme_attributes'):
@@ -154,7 +155,7 @@ class TestRestXML(wsme.tests.protocol.ProtocolTestCase):
[int], {int: str}, bool,
datetime.date, datetime.time, datetime.datetime):
x = et.tostring(toxml(dt, 'value', None))
- assert x == '', x
+ assert x == b(''), x
def test_parse_arg(self):
e = self.root.protocols[0].parse_arg('value', '5')