diff options
author | Lance Stout <lancestout@gmail.com> | 2012-01-17 22:14:24 -0800 |
---|---|---|
committer | Lance Stout <lancestout@gmail.com> | 2012-01-17 22:14:24 -0800 |
commit | 4274f49ada77d709b931f65e34d3a64e75b81638 (patch) | |
tree | 6997d64ba92e1b6786032330e3fd36adceff5a08 | |
parent | a4b27ff031d6aba7fd0985c5106319098e39caf6 (diff) | |
download | slixmpp-4274f49ada77d709b931f65e34d3a64e75b81638.tar.gz slixmpp-4274f49ada77d709b931f65e34d3a64e75b81638.tar.bz2 slixmpp-4274f49ada77d709b931f65e34d3a64e75b81638.tar.xz slixmpp-4274f49ada77d709b931f65e34d3a64e75b81638.zip |
Remove stream feature handlers on session_start.
Based on profiling, using around 35 stream handlers quarters the number
of basic message stanzas that can be processed in a second, in
comparison to only using the bare minimum of four handlers.
To help, we can drop handlers for stream features once the session
has started. So that we can re-enable these handlers when a stream
must restart, the 'stream_start' event has been added which fires
whenever a stream header is received.
The 'stream_start' event is a more generic replacement for the
existing start_stream_handler() method.
-rw-r--r-- | sleekxmpp/clientxmpp.py | 15 | ||||
-rw-r--r-- | sleekxmpp/features/feature_mechanisms/mechanisms.py | 19 | ||||
-rw-r--r-- | sleekxmpp/features/feature_starttls/starttls.py | 20 | ||||
-rw-r--r-- | sleekxmpp/test/sleektest.py | 1 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/xmlstream.py | 1 |
5 files changed, 43 insertions, 13 deletions
diff --git a/sleekxmpp/clientxmpp.py b/sleekxmpp/clientxmpp.py index 69e7db6c..3313328a 100644 --- a/sleekxmpp/clientxmpp.py +++ b/sleekxmpp/clientxmpp.py @@ -98,14 +98,12 @@ class ClientXMPP(BaseXMPP): self.add_event_handler('connected', self._handle_connected) self.add_event_handler('session_bind', self._handle_session_bind) + self.add_event_handler('stream_start', self._handle_stream_start) + self.add_event_handler('session_start', self._handle_session_start) self.register_stanza(StreamFeatures) self.register_handler( - Callback('Stream Features', - MatchXPath('{%s}features' % self.stream_ns), - self._handle_stream_features)) - self.register_handler( Callback('Roster Update', MatchXPath('{%s}iq/{%s}query' % ( self.default_ns, @@ -119,6 +117,15 @@ class ClientXMPP(BaseXMPP): self.register_plugin('feature_mechanisms', pconfig={'use_mech': sasl_mech} if sasl_mech else None) + def _handle_stream_start(self, root): + self.register_handler( + Callback('Stream Features', + MatchXPath('{%s}features' % self.stream_ns), + self._handle_stream_features)) + + def _handle_session_start(self, e): + self.remove_handler('Stream Features') + def connect(self, address=tuple(), reattempt=True, use_tls=True, use_ssl=False): """Connect to the XMPP server. diff --git a/sleekxmpp/features/feature_mechanisms/mechanisms.py b/sleekxmpp/features/feature_mechanisms/mechanisms.py index deff5d30..86dbb361 100644 --- a/sleekxmpp/features/feature_mechanisms/mechanisms.py +++ b/sleekxmpp/features/feature_mechanisms/mechanisms.py @@ -63,6 +63,17 @@ class feature_mechanisms(base_plugin): self.xmpp.register_stanza(stanza.Challenge) self.xmpp.register_stanza(stanza.Response) + self.xmpp.add_event_handler('stream_start', + self._handle_stream_start) + self.xmpp.add_event_handler('session_start', + self._handle_session_start) + + self.xmpp.register_feature('mechanisms', + self._handle_sasl_auth, + restart=True, + order=self.config.get('order', 100)) + + def _handle_stream_start(self, root): self.xmpp.register_handler( Callback('SASL Success', MatchXPath(stanza.Success.tag_name()), @@ -80,10 +91,10 @@ class feature_mechanisms(base_plugin): MatchXPath(stanza.Challenge.tag_name()), self._handle_challenge)) - self.xmpp.register_feature('mechanisms', - self._handle_sasl_auth, - restart=True, - order=self.config.get('order', 100)) + def _handle_session_start(self, e): + self.xmpp.remove_handler('SASL Success') + self.xmpp.remove_handler('SASL Failure') + self.xmpp.remove_handler('SASL Challenge') def _handle_sasl_auth(self, features): """ diff --git a/sleekxmpp/features/feature_starttls/starttls.py b/sleekxmpp/features/feature_starttls/starttls.py index 4e2b6621..a7f048b1 100644 --- a/sleekxmpp/features/feature_starttls/starttls.py +++ b/sleekxmpp/features/feature_starttls/starttls.py @@ -27,20 +27,30 @@ class feature_starttls(base_plugin): self.description = "STARTTLS Stream Feature" self.stanza = stanza - self.xmpp.register_handler( - Callback('STARTTLS Proceed', - MatchXPath(stanza.Proceed.tag_name()), - self._handle_starttls_proceed, - instream=True)) self.xmpp.register_feature('starttls', self._handle_starttls, restart=True, order=self.config.get('order', 0)) + self.xmpp.add_event_handler('stream_start', + self._handle_stream_start) + self.xmpp.add_event_handler('session_start', + self._handle_session_start) + self.xmpp.register_stanza(stanza.Proceed) self.xmpp.register_stanza(stanza.Failure) register_stanza_plugin(StreamFeatures, stanza.STARTTLS) + def _handle_stream_start(self, root): + self.xmpp.register_handler( + Callback('STARTTLS Proceed', + MatchXPath(stanza.Proceed.tag_name()), + self._handle_starttls_proceed, + instream=True)) + + def _handle_session_start(self, e): + self.xmpp.remove_handler('STARTTLS Proceed') + def _handle_starttls(self, features): """ Handle notification that the server supports TLS. diff --git a/sleekxmpp/test/sleektest.py b/sleekxmpp/test/sleektest.py index dd3df29a..3694c642 100644 --- a/sleekxmpp/test/sleektest.py +++ b/sleekxmpp/test/sleektest.py @@ -367,6 +367,7 @@ class SleekTest(unittest.TestCase): if skip: if socket != 'live': # Mark send queue as usable + self.xmpp.event('session_start') self.xmpp.session_started_event.set() # Clear startup stanzas self.xmpp.socket.next_sent(timeout=1) diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py index 4c8696b3..701ff240 100644 --- a/sleekxmpp/xmlstream/xmlstream.py +++ b/sleekxmpp/xmlstream/xmlstream.py @@ -1223,6 +1223,7 @@ class XMLStream(object): # as handshakes. self.stream_end_event.clear() self.start_stream_handler(root) + self.event('stream_start', root, direct=True) depth += 1 if event == b'end': depth -= 1 |