This fix was reverted because it depended on a small bit of code
in a patch that was reverted that changed some python/ovs testing
and build. The fix is still necessary.
The OVS C-based JSON parser operates on bytes, so the parser_feed
function returns the number of bytes that are processed. The pure
Python JSON parser currently operates on unicode, so it expects
that Parser.feed() returns a number of characters. This difference
leads to parsing errors when unicode characters are passed to the
C JSON parser from Python.
Acked-by: Lucas Alvares Gomes <lucasagomes@gmail.com>
Signed-off-by: Terry Wilson <twilson@redhat.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
import six
+PARSER_C = 'C'
+PARSER_PY = 'PYTHON'
try:
import ovs._json
+ PARSER = PARSER_C
except ImportError:
- pass
+ PARSER = PARSER_PY
__pychecker__ = 'no-stringiter'
MAX_HEIGHT = 1000
def __new__(cls, *args, **kwargs):
- try:
+ if PARSER == PARSER_C:
return ovs._json.Parser(*args, **kwargs)
- except NameError:
- return super(Parser, cls).__new__(cls)
+ return super(Parser, cls).__new__(cls)
def __init__(self, check_trailer=False):
self.check_trailer = check_trailer
# data, so we convert it here as soon as possible.
if data and not error:
try:
- data = decoder.decode(data)
+ if six.PY3 or ovs.json.PARSER == ovs.json.PARSER_PY:
+ data = decoder.decode(data)
except UnicodeError:
error = errno.EILSEQ
if error:
else:
if self.parser is None:
self.parser = ovs.json.Parser()
- self.input = self.input[self.parser.feed(self.input):]
+ if six.PY3 and ovs.json.PARSER == ovs.json.PARSER_C:
+ self.input = self.input.encode('utf-8')[
+ self.parser.feed(self.input):].decode()
+ else:
+ self.input = self.input[self.parser.feed(self.input):]
if self.parser.is_done():
msg = self.__process_msg()
if msg: