catch XML parse errors & don't attempt to reconnect. Also removed 'connecting' state from setStream method

This commit is contained in:
Tom Nichols 2010-07-01 16:46:37 -04:00
parent dd9f33b7d9
commit cd2017b8b0

View File

@ -58,8 +58,7 @@ class XMLStream(object):
global ssl_support global ssl_support
self.ssl_support = ssl_support self.ssl_support = ssl_support
self.escape_quotes = escape_quotes self.escape_quotes = escape_quotes
self.state = statemachine.StateMachine(('disconnected','connecting', self.state = statemachine.StateMachine(('disconnected','connected'))
'connected'))
self.should_reconnect = True self.should_reconnect = True
self.setSocket(socket) self.setSocket(socket)
@ -92,9 +91,11 @@ class XMLStream(object):
def setSocket(self, socket): def setSocket(self, socket):
"Set the socket" "Set the socket"
self.socket = socket self.socket = socket
if socket is not None and self.state.transition('disconnected','connecting'): if socket is not None:
self.filesocket = socket.makefile('rb', 0) # ElementTree.iterparse requires a file. 0 buffer files have to be binary with self.state.transition_ctx('disconnected','connected') as locked:
self.state.transition('connecting','connected') 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): def setFileSocket(self, filesocket):
self.filesocket = filesocket self.filesocket = filesocket
@ -235,6 +236,9 @@ class XMLStream(object):
logging.debug("System interrupt detected") logging.debug("System interrupt detected")
self.shutdown() self.shutdown()
self.eventqueue.put(('quit', None, None)) 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: except:
logging.exception('Unexpected error in RCV thread') logging.exception('Unexpected error in RCV thread')
if self.should_reconnect: if self.should_reconnect: