summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream/xmlstream.py
diff options
context:
space:
mode:
Diffstat (limited to 'sleekxmpp/xmlstream/xmlstream.py')
-rw-r--r--sleekxmpp/xmlstream/xmlstream.py18
1 files changed, 11 insertions, 7 deletions
diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py
index 025a6cbf..842dfee2 100644
--- a/sleekxmpp/xmlstream/xmlstream.py
+++ b/sleekxmpp/xmlstream/xmlstream.py
@@ -58,8 +58,7 @@ class XMLStream(object):
global ssl_support
self.ssl_support = ssl_support
self.escape_quotes = escape_quotes
- self.state = statemachine.StateMachine(('disconnected','connecting',
- 'connected'))
+ self.state = statemachine.StateMachine(('disconnected','connected'))
self.should_reconnect = True
self.setSocket(socket)
@@ -92,9 +91,11 @@ class XMLStream(object):
def setSocket(self, socket):
"Set the socket"
self.socket = socket
- if socket is not None and self.state.transition('disconnected','connecting'):
- self.filesocket = socket.makefile('rb', 0) # ElementTree.iterparse requires a file. 0 buffer files have to be binary
- self.state.transition('connecting','connected')
+ if socket is not None:
+ with self.state.transition_ctx('disconnected','connected') as locked:
+ if not locked: raise Exception('Already connected')
+ # ElementTree.iterparse requires a file. 0 buffer files have to be binary
+ self.filesocket = socket.makefile('rb', 0)
def setFileSocket(self, filesocket):
self.filesocket = filesocket
@@ -235,6 +236,9 @@ class XMLStream(object):
logging.debug("System interrupt detected")
self.shutdown()
self.eventqueue.put(('quit', None, None))
+ except cElementTree.XMLParserError:
+ logging.warn('XML RCV parsing error!', exc_info=1)
+ # don't restart the stream on an XML parse error.
except:
logging.exception('Unexpected error in RCV thread')
if self.should_reconnect:
@@ -356,11 +360,11 @@ class XMLStream(object):
# TODO inefficient linear search; performance might be improved by hashtable lookup
for handler in self.__handlers:
if handler.match(stanza):
- logging.debug('matched stanza to handler %s', handler.name)
+# logging.debug('matched stanza to handler %s', handler.name)
handler.prerun(stanza)
self.eventqueue.put(('stanza', handler, stanza))
if handler.checkDelete():
- logging.debug('deleting callback %s', handler.name)
+# logging.debug('deleting callback %s', handler.name)
self.__handlers.pop(self.__handlers.index(handler))
unhandled = False
if unhandled: