From e0d907252759b960766ec640d880d1d4be0397aa Mon Sep 17 00:00:00 2001 From: shunyi Date: Wed, 28 Jun 2017 21:55:54 +0800 Subject: [PATCH 1/2] A quick, trivial yet not beautiful patch for issue_command + Determine the Python version of current environment + Deal with the args according to py2 or py3 --- webkit_server.py | 51 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/webkit_server.py b/webkit_server.py index b8f5b8f..b409043 100644 --- a/webkit_server.py +++ b/webkit_server.py @@ -13,6 +13,13 @@ SERVER_EXEC = os.path.abspath(os.path.join(os.path.dirname(__file__), 'webkit_server')) +if sys.version_info[0] == 2: + PY2 = True + PY3 = False +elif sys.version_info[0] == 3: + PY2 = False + PY3 = True + class SelectionMixin(object): """ Implements a generic XPath selection for a class providing @@ -513,12 +520,47 @@ def issue_command(self, cmd, *args): self._writeline(cmd) self._writeline(str(len(args))) for arg in args: - arg = str(arg) - self._writeline(str(len(arg))) - self._sock.sendall(arg.encode("utf-8")) + self.send_arg(arg) return self._read_response() + def send_arg(self, arg): + """ Send each arg for args in issue_command """ + arg = self.prepare_for_socket_sendall(arg) + self._writeline(str(len(arg))) + self._sock.sendall(arg) + + def prepare_for_socket_sendall(self, arg): + """ Deal with the unicode and bytes problem in Python 2 and Python 3 for socket.sendall """ + + if PY2: + if type(arg) != unicode: + try: + arg = str(arg) + except: + pass + + # socket.sendall in Python 2 accepts str (bytes) + if type(arg) not in (str, unicode): + raise TypeError("type({}) should be str (bytes) or unicode, not {}".format(arg, type(arg))) + elif type(arg) == unicode: + arg = arg.encode("utf-8") + + if PY3: + if type(arg) != bytes: + try: + arg = str(arg) + except: + pass + + # socket.sendall in Python 3 accepts bytes + if type(arg) not in (str, bytes): + raise TypeError("type({}) should be str or bytes, not {}".format(arg, type(arg))) + elif type(arg) == str: + arg = arg.encode("utf-8") + + return arg + def _read_response(self): """ Reads a complete response packet from the server """ result = self.buf.read_line().decode("utf-8") @@ -538,4 +580,5 @@ def _read_message(self): def _writeline(self, line): """ Writes a line to the underlying socket. """ - self._sock.sendall(line.encode("utf-8") + b"\n") + line = self.prepare_for_socket_sendall(line) + self._sock.sendall(line + b"\n") From 62ad2e9b233e03ad45403bc717fa4233ca1a10df Mon Sep 17 00:00:00 2001 From: shunyi Date: Thu, 20 Jul 2017 12:50:19 +0800 Subject: [PATCH 2/2] Change the indentation from 4 to 2 for line 523 To fit the coding style of this project. ref: https://github.com/niklasb/webkit-server/pull/33#discussion_r128272055 --- webkit_server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webkit_server.py b/webkit_server.py index b409043..9957121 100644 --- a/webkit_server.py +++ b/webkit_server.py @@ -520,7 +520,7 @@ def issue_command(self, cmd, *args): self._writeline(cmd) self._writeline(str(len(args))) for arg in args: - self.send_arg(arg) + self.send_arg(arg) return self._read_response()