]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
vici: Catch Python GeneratorExit to properly cancel streamed event iteration
authorMartin Willi <martin@revosec.ch>
Mon, 9 Mar 2015 11:06:38 +0000 (12:06 +0100)
committerMartin Willi <martin@revosec.ch>
Wed, 18 Mar 2015 12:59:14 +0000 (13:59 +0100)
src/libcharon/plugins/vici/README.md
src/libcharon/plugins/vici/python/vici/session.py

index 655f74911d310a8c1234a51286ad87d71bf202c6..0ce4271b04c2c40c8d7ed5fa20fec04f12ede520 100644 (file)
@@ -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
index 65b89b5ba80dfe383ba0110ae45d74f359ca9590..da79ecd6469ce24891f96d8d69bd64f5d54a55b1 100644 (file)
@@ -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