Check for XML parsing errors and disconnect in that case.
This commit is contained in:
parent
df4012e66d
commit
6034df0a78
@ -19,7 +19,7 @@ import ssl
|
|||||||
import weakref
|
import weakref
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
import xml.etree.ElementTree
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
from slixmpp.xmlstream.asyncio import asyncio
|
from slixmpp.xmlstream.asyncio import asyncio
|
||||||
from slixmpp.xmlstream import tostring, highlight
|
from slixmpp.xmlstream import tostring, highlight
|
||||||
@ -339,7 +339,7 @@ class XMLStream(asyncio.BaseProtocol):
|
|||||||
"""
|
"""
|
||||||
self.xml_depth = 0
|
self.xml_depth = 0
|
||||||
self.xml_root = None
|
self.xml_root = None
|
||||||
self.parser = xml.etree.ElementTree.XMLPullParser(("start", "end"))
|
self.parser = ET.XMLPullParser(("start", "end"))
|
||||||
|
|
||||||
def connection_made(self, transport):
|
def connection_made(self, transport):
|
||||||
"""Called when the TCP connection has been established with the server
|
"""Called when the TCP connection has been established with the server
|
||||||
@ -359,6 +359,7 @@ class XMLStream(asyncio.BaseProtocol):
|
|||||||
the stream is opened, etc).
|
the stream is opened, etc).
|
||||||
"""
|
"""
|
||||||
self.parser.feed(data)
|
self.parser.feed(data)
|
||||||
|
try:
|
||||||
for event, xml in self.parser.read_events():
|
for event, xml in self.parser.read_events():
|
||||||
if event == 'start':
|
if event == 'start':
|
||||||
if self.xml_depth == 0:
|
if self.xml_depth == 0:
|
||||||
@ -387,6 +388,17 @@ class XMLStream(asyncio.BaseProtocol):
|
|||||||
# Keep the root element empty of children to
|
# Keep the root element empty of children to
|
||||||
# save on memory use.
|
# save on memory use.
|
||||||
self.xml_root.clear()
|
self.xml_root.clear()
|
||||||
|
except ET.ParseError:
|
||||||
|
log.error('Parse error: %r', data)
|
||||||
|
|
||||||
|
# Due to cyclic dependencies, this can’t be imported at the module
|
||||||
|
# level.
|
||||||
|
from slixmpp.stanza.stream_error import StreamError
|
||||||
|
error = StreamError()
|
||||||
|
error['condition'] = 'not-well-formed'
|
||||||
|
error['text'] = 'Server sent: %r' % data
|
||||||
|
self.send(error)
|
||||||
|
self.disconnect()
|
||||||
|
|
||||||
def is_connected(self):
|
def is_connected(self):
|
||||||
return self.transport is not None
|
return self.transport is not None
|
||||||
|
Loading…
Reference in New Issue
Block a user