From: Martin Willi Date: Mon, 9 Mar 2015 11:06:38 +0000 (+0100) Subject: vici: Catch Python GeneratorExit to properly cancel streamed event iteration X-Git-Tag: 5.3.0rc1~28^2~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=90c5b48c96d7d34fbc446660449892f3bd3b9040;p=thirdparty%2Fstrongswan.git vici: Catch Python GeneratorExit to properly cancel streamed event iteration --- diff --git a/src/libcharon/plugins/vici/README.md b/src/libcharon/plugins/vici/README.md index 655f74911d..0ce4271b04 100644 --- a/src/libcharon/plugins/vici/README.md +++ b/src/libcharon/plugins/vici/README.md @@ -909,6 +909,11 @@ event: for key in conn: print key +Please note that if the returned generator is not iterated completely, it must +be closed using _close()_. This is implicitly done when breaking from a loop, +but an explicit call may be required when directly iterating the generator with +_next()_. + ## Sorting in dictionaries ## In VICI, in some message trees the order of objects in dictionary matters. In diff --git a/src/libcharon/plugins/vici/python/vici/session.py b/src/libcharon/plugins/vici/python/vici/session.py index 65b89b5ba8..da79ecd646 100644 --- a/src/libcharon/plugins/vici/python/vici/session.py +++ b/src/libcharon/plugins/vici/python/vici/session.py @@ -281,10 +281,16 @@ class SessionHandler(object): # issue command, and read any event messages packet = Packet.request(command, message) self.transport.send(packet) + exited = False while True: response = Packet.parse(self.transport.receive()) if response.response_type == Packet.EVENT: - yield Message.deserialize(response.payload) + if not exited: + try: + yield Message.deserialize(response.payload) + except GeneratorExit: + exited = True + pass else: break