changeset a41ef78ebb4c in /home/hg/repos/python-nbxmpp
details:http://hg.gajim.org/python-nbxmpp?cmd=changeset;node=a41ef78ebb4c description: don't crash when we get a partial stanza that cut utf-8 chars in the middle
diffstat:
nbxmpp/client_nb.py | 7 +++---- nbxmpp/dispatcher_nb.py | 4 ++-- nbxmpp/transports_nb.py | 22 +++++++++++++++++++++- 3 files changed, 26 insertions(+), 7 deletions(-)
diffs (79 lines):
diff -r 928fa60a9d79 -r a41ef78ebb4c nbxmpp/client_nb.py --- a/nbxmpp/client_nb.py Sat Jan 05 10:17:56 2013 +0100 +++ b/nbxmpp/client_nb.py Sat Jan 05 17:05:24 2013 +0100 @@ -334,10 +334,9 @@ self.Dispatcher.ProcessNonBlocking(data) self.ip_addresses = [] if not hasattr(self, 'Dispatcher') or \ - self.Dispatcher.Stream._document_attrs is None: - self._xmpp_connect_machine( - mode='FAILURE', - data='Error on stream open') + self.Dispatcher.Stream._document_attrs is None: + self._xmpp_connect_machine(mode='FAILURE', + data='Error on stream open') return
# if terminating stanza was received after init request then client gets diff -r 928fa60a9d79 -r a41ef78ebb4c nbxmpp/dispatcher_nb.py --- a/nbxmpp/dispatcher_nb.py Sat Jan 05 10:17:56 2013 +0100 +++ b/nbxmpp/dispatcher_nb.py Sat Jan 05 17:05:24 2013 +0100 @@ -112,7 +112,7 @@ r += '|' + c r += '|' + chr(ord(c) + 1)
- self.invalid_chars_re = re.compile(r.encode('utf-8')) + self.invalid_chars_re = re.compile(r)
def getAnID(self): global outgoingID @@ -200,7 +200,7 @@ % (tag, ns))
def replace_non_character(self, data): - return re.sub(self.invalid_chars_re, '\ufffd'.encode('utf-8'), data) + return re.sub(self.invalid_chars_re, '\ufffd', data)
def ProcessNonBlocking(self, data): """ diff -r 928fa60a9d79 -r a41ef78ebb4c nbxmpp/transports_nb.py --- a/nbxmpp/transports_nb.py Sat Jan 05 10:17:56 2013 +0100 +++ b/nbxmpp/transports_nb.py Sat Jan 05 17:05:24 2013 +0100 @@ -307,6 +307,9 @@ # bytes remained from the last send message self.sendbuff = ''
+ # bytes remained from the last received message + self.receivedbuff = b'' + self.proxy_dict = proxy_dict self.on_remote_disconnect = self.disconnect
@@ -599,9 +602,26 @@ self.remove_timeout() self.renew_send_timeout() self.renew_send_timeout2() + + if self.receivedbuff: + received = self.receivedbuff + received + self.receivedbuff = b'' + + # try to decode data + try: + received = received.decode('utf-8') + except UnicodeDecodeError: + for i in range(-1, -4, -1): + char = received[i] + if char & 0xc0 == 0xc0: + self.receivedbuff = received[i:] + received = received[:i] + break + received = received.decode('utf-8') + # pass received data to owner if self.on_receive: - self.raise_event(DATA_RECEIVED, received.decode('utf-8')) + self.raise_event(DATA_RECEIVED, received) self._on_receive(received) else: # This should never happen, so we need the debug.