changeset d971d36bbdd3 in /home/hg/repos/python-nbxmpp
details:http://hg.gajim.org/python-nbxmpp?cmd=changeset;node=d971d36bbdd3 description: don't crash when we sent a partial stanza that cut utf-8 chars in the middle
diffstat:
nbxmpp/transports_nb.py | 18 +++++++++++++++++- 1 files changed, 17 insertions(+), 1 deletions(-)
diffs (35 lines):
diff -r 38f275539555 -r d971d36bbdd3 nbxmpp/transports_nb.py --- a/nbxmpp/transports_nb.py Sat Jan 05 17:19:37 2013 +0100 +++ b/nbxmpp/transports_nb.py Sat Jan 05 17:24:18 2013 +0100 @@ -306,6 +306,7 @@
# bytes remained from the last send message self.sendbuff = '' + self.sent_bytes_buff = b''
# bytes remained from the last received message self.received_bytes_buff = b'' @@ -547,7 +548,22 @@ sent_data = self.sendbuff[:send_count] self.sendbuff = self.sendbuff[send_count:] self._plug_idle(writable=(self.sendqueue != []), readable=True) - self.raise_event(DATA_SENT, sent_data.decode('utf-8')) + + if self.sent_bytes_buff: + sent_data = self.sent_bytes_buff + sent_data + self.sent_bytes_buff = b'' + # try to decode sent data + try: + sent_data = sent_data.decode('utf-8') + except UnicodeDecodeError: + for i in range(-1, -4, -1): + char = sent_data[i] + if char & 0xc0 == 0xc0: + self.sent_bytes_buff = sent_data[i:] + sent_data = sent_data[:i] + break + sent_data = sent_data.decode('utf-8') + self.raise_event(DATA_SENT, sent_data)
except Exception: log.error('_do_send:', exc_info=True)