Python 3 has separate types for strings and bytes. Python 2 used the
same type for both. We need to convert strings to bytes before writing
them out to a socket. We also need to convert data read from the socket
to a string.
Signed-off-by: Russell Bryant <russell@ovn.org>
Acked-by: Ben Pfaff <blp@ovn.org>
while True:
if not self.input:
error, data = self.stream.recv(4096)
+ # Python 3 has separate types for strings and bytes. We
+ # received bytes from a socket. We expect it to be string
+ # data, so we convert it here as soon as possible.
+ if (data and not error
+ and not isinstance(data, six.string_types)):
+ try:
+ data = data.decode('utf-8')
+ except UnicodeError:
+ error = errno.EILSEQ
if error:
if error == errno.EAGAIN:
return error, None
import socket
import sys
+import six
from six.moves import range
import ovs.fatal_signal
bytes_written = 0
if len(buf) == 0:
return 0, 0
+ if sys.version_info[0] >= 3 and not isinstance(buf, six.binary_type):
+ buf = six.binary_type(buf, 'utf-8')
while True:
try:
retval = os.write(fd, buf)
import errno
import os
import socket
+import sys
import six
return 0
try:
+ # Python 3 has separate types for strings and bytes. We must have
+ # bytes here.
+ if (sys.version_info[0] >= 3
+ and not isinstance(buf, six.binary_type)):
+ buf = six.binary_type(buf, 'utf-8')
return self.socket.send(buf)
except socket.error as e:
return -ovs.socket_util.get_exception_errno(e)