[Twisted-Python] Newest Resolver Patch

It seems to work, but I'd like people to play with this a bit more. Note that mktap's default is the native resolver, but the transparent upgrade is to DummyResolver, which cannot resolve at all. Index: bin/mktap =================================================================== RCS file: /cvs/Twisted/bin/mktap,v retrieving revision 1.9 diff -u -r1.9 mktap --- bin/mktap 2001/08/25 07:16:13 1.9 +++ bin/mktap 2001/09/24 05:36:05 @@ -40,6 +40,7 @@ from twisted.protocols import telnet from twisted.internet import main,tcp +from twisted.names import native from twisted.python import usage import sys, traceback, os, cPickle @@ -90,6 +91,7 @@ if not options.append: a = main.Application(options.args[0], int(options.uid), int(options.gid)) + a.resolver = native.Resolver() else: a = cPickle.load(open(options.append)) for num, proto in mod.getPorts(a, config): Index: twisted/internet/abstract.py =================================================================== RCS file: /cvs/Twisted/twisted/internet/abstract.py,v retrieving revision 1.5 diff -u -r1.5 abstract.py --- twisted/internet/abstract.py 2001/08/20 04:15:35 1.5 +++ twisted/internet/abstract.py 2001/09/24 05:36:05 @@ -17,7 +17,7 @@ # System Imports -import types +import types, string # Twisted Imports from twisted.python import threadable, log @@ -237,6 +237,19 @@ raise NotImplementedError(str(self.__class__)+' has no fileno method') + +def isIPAddress(addr): + parts = string.split(addr, '.') + if len(parts) == 4: + try: + for part in map(int, parts): + if not (0<=part<256): + break + else: + return 1 + except ValueError: + pass + return 0 # Sibling Imports import main Index: twisted/internet/main.py =================================================================== RCS file: /cvs/Twisted/twisted/internet/main.py,v retrieving revision 1.27 diff -u -r1.27 main.py --- twisted/internet/main.py 2001/09/19 12:18:09 1.27 +++ twisted/internet/main.py 2001/09/24 05:46:21 @@ -50,9 +50,13 @@ if os.name == "posix": self.uid = uid or os.getuid() self.gid = gid or os.getgid() + self.resolver = DummyResolver() - persistentVersion = 1 + persistentVersion = 2 + def upgradeToVersion2(self): + self.resolver = DummyResolver() + def upgradeToVersion1(self): """Version 1 Persistence Upgrade """ @@ -161,6 +165,7 @@ def run(self, save=1): """Run this application, running the main loop if necessary. """ + global resolver if not self.running: threadable.dispatcher.own(self) delayeds.extend(self.delayeds) @@ -174,6 +179,7 @@ return for service in self.services.values(): service.startService() + resolver = self.resolver self.running = 1 threadable.dispatcher.disown(self) if not running: @@ -192,6 +198,11 @@ """ theTimeouts.later(method, seconds) +class DummyResolver: + + def resolve(self, address, success, fail): + fail() + reads = {} writes = {} running = None @@ -199,6 +210,7 @@ if threadable.threaded: delayeds.append(threadtask.theScheduler) shutdowns = [theTimeouts.runEverything] +resolver = DummyResolver() def shutDown(a=None, b=None): """Run all shutdown callbacks (save all running Applications) and exit. @@ -523,6 +535,7 @@ # currentPlugins = os.path.abspath("TwistedPlugins") allPlugins = [systemPlugins, userPlugins, confPlugins] #, currentPlugins] sys.path.extend(allPlugins) + # Sibling Import import process Index: twisted/internet/tcp.py =================================================================== RCS file: /cvs/Twisted/twisted/internet/tcp.py,v retrieving revision 1.22 diff -u -r1.22 tcp.py --- twisted/internet/tcp.py 2001/09/11 04:08:28 1.22 +++ twisted/internet/tcp.py 2001/09/24 05:46:21 @@ -28,6 +28,7 @@ import socket import sys import traceback +import string if os.name == 'nt': EWOULDBLOCK = 10035 @@ -49,7 +50,7 @@ # Sibling Imports import abstract -from main import CONNECTION_LOST, CONNECTION_DONE +import main class Connection(abstract.FileDescriptor, protocol.Transport, @@ -79,9 +80,9 @@ if se.args[0] == EWOULDBLOCK: return else: - return CONNECTION_LOST + return main.CONNECTION_LOST if not data: - return CONNECTION_LOST + return main.CONNECTION_LOST return self.protocol.dataReceived(data) def writeSomeData(self, data): @@ -95,7 +96,7 @@ except socket.error, se: if se.args[0] == EWOULDBLOCK: return 0 - return CONNECTION_LOST + return main.CONNECTION_LOST def connectionLost(self): """See abstract.FileDescriptor.connectionLost(). @@ -145,7 +146,7 @@ self.port = port Connection.__init__(self, skt, protocol) self.doWrite = self.doConnect - self.doConnect() + self.resolveAddress() self.logstr = self.protocol.__class__.__name__+",client" if timeout is not None: main.addTimeout(self.failIfNotConnected, timeout) @@ -161,13 +162,24 @@ # factored out so as to minimise the code necessary for SecureClient return socket.socket(socket.AF_INET,socket.SOCK_STREAM) + def resolveAddress(self): + if abstract.isIPAddress(self.addr[0]): + self.setRealdAddress(self.addr[0]) + else: + main.resolver.resolve(self.addr[0], self.setRealAddress, + self.failIfNotConnected) + + def setRealAddress(self, address): + self.realAddress = address + self.doConnect() + def doConnect(self): """I connect the socket. Then, call the protocol's makeConnection, and start waiting for data. """ try: - self.socket.connect(self.addr) + self.socket.connect((self.realAddress, self.addr[1])) except socket.error, se: if se.args[0] == EMYSTERY: self.startWriting() Index: twisted/internet/udp.py =================================================================== RCS file: /cvs/Twisted/twisted/internet/udp.py,v retrieving revision 1.4 diff -u -r1.4 udp.py --- twisted/internet/udp.py 2001/09/23 01:44:48 1.4 +++ twisted/internet/udp.py 2001/09/24 05:46:23 @@ -35,8 +35,7 @@ from twisted.python import log # Sibling Imports -import abstract -from main import CONNECTION_LOST, CONNECTION_DONE +import abstract, main class Connection(abstract.FileDescriptor, @@ -61,12 +60,26 @@ self.local = local self.sessionno = sessionno self.connected = 1 - self.logstr = "%s,%s,%s (UDP)" % (self.protocol.__class__.__name__, sessionno, self.remote[0]) + self.logstr = "%s,%s,%s (UDP)" % (self.protocol.__class__.__name__, + sessionno, self.remote[0]) + if abstract.isIPAddress(self.remote[0]): + self.realAddress = self.remote[0] + else: + self.realAddress = None + main.resolver.resolve(self.remote[0], self.setRealAddress, + self.connectionLost) + + + def setRealAddress(self, address): + self.realAddress = address + self.startWriting() def write(self,data): res = abstract.FileDescriptor.write(self,data) if not self.keepConnection: self.loseConnection() + if self.realAddress is None: + self.stopWriting() return res def writeSomeData(self, data): @@ -81,7 +94,7 @@ except socket.error, se: if se.args[0] == EWOULDBLOCK: return 0 - return CONNECTION_LOST + return main.CONNECTION_LOST else: return 0 @@ -171,14 +184,11 @@ def createConnection(self, addr): """Creates a virtual connection over UDP""" - try: - protocol = self.factory.buildProtocol(addr) - s = self.sessionno - self.sessionno = s+1 - transport = Connection(self.socket.dup(), protocol, addr, self, s) - protocol.makeConnection(transport, self) - except: - traceback.print_exc(file=log.logfile) + protocol = self.factory.buildProtocol(addr) + s = self.sessionno + self.sessionno = s+1 + transport = Connection(self.socket.dup(), protocol, addr, self, s) + protocol.makeConnection(transport, self) return transport def doRead(self): -- The Official Moshe Zadka FAQ: http://moshez.geek The Official Moshe Zadka FAQ For Dummies: http://moshez.org Read the FAQ
participants (1)
-
Moshe Zadka