[Twisted-Python] twisted.internet.app.unlisten* Broken (patch)

W.J. miathan at goliath.darktech.org
Wed May 7 11:38:28 EDT 2003


Hi,

For my project, I needed to be able to bind and unbind listeners on the
fly - twisted API has this functionality, but it is inconsistent in its
implementation. My patch fixes this, so the following works:

[[ On a twisted server with only manhole running ]]
----
$ telnet localhost 8007
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

twisted.manhole.telnet.ShellFactory
Twisted 1.0.4
username: boss
password: *****
>>> from twisted.internet.app import Application
>>> from twisted.internet.protocol import Factory
>>> from twisted.protocols.wire import QOTD
>>> # add QOTD server
>>> f = Factory()
>>> f.protocol = QOTD
>>> app.listenTCP(8123, f)
>>> # system now listening on port 8123 (worked already)
>>> app.unlistenTCP(8123, f)
>>> # system no longer listening on port 8123 (used to be broken! patch
fixes this)

In addition to the TCP case, it also fixes UDP(tested) and SSL(untested).
It does this by changing the format of _listenerDict to tuples
(type, param1, param2, ...) where type is 'UDP', 'TCP', 'UNIX' or 'SSL'.

This should _not_ affect persistence, because _listenerDict is internal.

Wladimir

-------------- next part --------------
--- /usr/src/Twisted-1.0.4/twisted/internet/app.py	2003-04-14 19:39:21.000000000 +0200
+++ /file/zope/lib/python2.1/site-packages/twisted/internet/app.py	2003-05-07 17:10:36.000000000 +0200
@@ -538,7 +538,9 @@
         self.tcpPorts.append((port, factory, backlog, interface))
         if self.running:
             from twisted.internet import reactor
-            return reactor.listenTCP(port, factory, backlog, interface)
+            listener = reactor.listenTCP(port, factory, backlog, interface)
+            self._listenerDict[("TCP", port, interface)] = listener
+            return listener
 
     def unlistenTCP(self, port, interface=''):
         """
@@ -552,8 +554,8 @@
         if toRemove:
             for t in toRemove:
                 self.tcpPorts.remove(t)
-            if self._listenerDict.has_key((port, interface)):
-                self._listenerDict[(port, interface)].stopListening()
+            if self._listenerDict.has_key(("TCP", port, interface)):
+                self._listenerDict[("TCP", port, interface)].stopListening()
         else:
             raise error.NotListeningError, (interface, port)
 
@@ -564,7 +566,9 @@
         self.unixPorts.append((filename, factory, backlog, mode))
         if self.running:
             from twisted.internet import reactor
-            return reactor.listenUNIX(filename, factory, backlog, mode)
+            listener = reactor.listenUNIX(filename, factory, backlog, mode)
+            self._listenerDict["UNIX", filename] = listener
+            return listener
 
     def unlistenUNIX(self, filename):
         """
@@ -578,8 +582,8 @@
         if toRemove:
             for t in toRemove:
                 self.unixPorts.remove(t)
-            if self._listenerDict.has_key(filename):
-                self._listenerDict[filename].stopListening()
+            if self._listenerDict.has_key(("UNIX", filename)):
+                self._listenerDict["UNIX", filename].stopListening()
         else:
             raise error.NotListeningError, filename
 
@@ -590,7 +594,9 @@
         self.udpPorts.append((port, proto, interface, maxPacketSize))
         if self.running:
             from twisted.internet import reactor
-            return reactor.listenUDP(port, proto, interface, maxPacketSize)
+            listener = reactor.listenUDP(port, proto, interface, maxPacketSize)
+            self._listenerDict[("UDP", port, interface)] = listener
+            return listener
 
     def unlistenUDP(self, port, interface=''):
         """
@@ -605,6 +611,8 @@
         if toRemove:
             for t in toRemove:
                 self.udpPorts.remove(t)
+            if self._listenerDict.has_key(("UDP", port, interface)):
+                self._listenerDict[("UDP", port, interface)].stopListening()
         else:
             raise error.NotListeningError, (interface, port)
 
@@ -617,7 +625,9 @@
         self.sslPorts.append((port, factory, ctxFactory, backlog, interface))
         if self.running:
             from twisted.internet import reactor
-            return reactor.listenSSL(port, factory, ctxFactory, backlog, interface)
+            listener = reactor.listenSSL(port, factory, ctxFactory, backlog, interface)
+            self._listenerDict[("SSL", port, interface)] = listener
+            return listener
 
     def unlistenSSL(self, port, interface=''):
         """
@@ -631,6 +641,8 @@
         if toRemove:
             for t in toRemove:
                 self.sslPorts.remove(t)
+                if self._listenerDict.has_key(("SSL", port, interface)):
+                    self._listenerDict[("SSL", port, interface)].stopListening()
         else:
             raise error.NotListeningError, (interface, port)
 
@@ -804,25 +816,25 @@
 
             for filename, factory, backlog, mode in self.unixPorts:
                 try:
-                    self._listenerDict[filename] = reactor.listenUNIX(filename, factory, backlog, mode)
+                    self._listenerDict["UNIX", filename] = reactor.listenUNIX(filename, factory, backlog, mode)
                 except error.CannotListenError, msg:
                     log.msg('error on UNIX socket %s: %s' % (filename, msg))
                     return
             for port, factory, backlog, interface in self.tcpPorts:
                 try:
-                    self._listenerDict[port, interface] = reactor.listenTCP(port, factory, backlog, interface)
+                    self._listenerDict["TCP", port, interface] = reactor.listenTCP(port, factory, backlog, interface)
                 except error.CannotListenError, msg:
                     log.msg('error on TCP port %s: %s' % (port, msg))
                     return
             for port, factory, interface, maxPacketSize in self.udpPorts:
                 try:
-                    reactor.listenUDP(port, factory, interface, maxPacketSize)
+                    self._listenerDict["UDP", port, interface] = reactor.listenUDP(port, factory, interface, maxPacketSize)
                 except error.CannotListenError, msg:
                     log.msg('error on UDP port %s: %s' % (port, msg))
                     return
             for port, factory, ctxFactory, backlog, interface in self.sslPorts:
                 try:
-                    reactor.listenSSL(port, factory, ctxFactory, backlog, interface)
+                    self._listenerDict["SSL", port, interface] = reactor.listenSSL(port, factory, ctxFactory, backlog, interface)
                 except error.CannotListenError, msg:
                     log.msg('error on SSL port %s: %s' % (port, msg))
                     return


More information about the Twisted-Python mailing list