mirror of
https://github.com/openvswitch/ovs
synced 2025-09-03 07:45:30 +00:00
Un-revert Work around Python/C JSON unicode differences
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>
This commit is contained in:
@@ -21,10 +21,13 @@ import sys
|
|||||||
|
|
||||||
import six
|
import six
|
||||||
|
|
||||||
|
PARSER_C = 'C'
|
||||||
|
PARSER_PY = 'PYTHON'
|
||||||
try:
|
try:
|
||||||
import ovs._json
|
import ovs._json
|
||||||
|
PARSER = PARSER_C
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
PARSER = PARSER_PY
|
||||||
|
|
||||||
__pychecker__ = 'no-stringiter'
|
__pychecker__ = 'no-stringiter'
|
||||||
|
|
||||||
@@ -91,10 +94,9 @@ class Parser(object):
|
|||||||
MAX_HEIGHT = 1000
|
MAX_HEIGHT = 1000
|
||||||
|
|
||||||
def __new__(cls, *args, **kwargs):
|
def __new__(cls, *args, **kwargs):
|
||||||
try:
|
if PARSER == PARSER_C:
|
||||||
return ovs._json.Parser(*args, **kwargs)
|
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):
|
def __init__(self, check_trailer=False):
|
||||||
self.check_trailer = check_trailer
|
self.check_trailer = check_trailer
|
||||||
|
@@ -272,7 +272,8 @@ class Connection(object):
|
|||||||
# data, so we convert it here as soon as possible.
|
# data, so we convert it here as soon as possible.
|
||||||
if data and not error:
|
if data and not error:
|
||||||
try:
|
try:
|
||||||
data = decoder.decode(data)
|
if six.PY3 or ovs.json.PARSER == ovs.json.PARSER_PY:
|
||||||
|
data = decoder.decode(data)
|
||||||
except UnicodeError:
|
except UnicodeError:
|
||||||
error = errno.EILSEQ
|
error = errno.EILSEQ
|
||||||
if error:
|
if error:
|
||||||
@@ -298,7 +299,11 @@ class Connection(object):
|
|||||||
else:
|
else:
|
||||||
if self.parser is None:
|
if self.parser is None:
|
||||||
self.parser = ovs.json.Parser()
|
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():
|
if self.parser.is_done():
|
||||||
msg = self.__process_msg()
|
msg = self.__process_msg()
|
||||||
if msg:
|
if msg:
|
||||||
|
Reference in New Issue
Block a user