Index: third_party/twisted_8_1/twisted/names/srvconnect.py |
diff --git a/third_party/twisted_8_1/twisted/names/srvconnect.py b/third_party/twisted_8_1/twisted/names/srvconnect.py |
deleted file mode 100644 |
index 8120d958795e0181b5061ab9a7ff26888c9159ec..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/names/srvconnect.py |
+++ /dev/null |
@@ -1,185 +0,0 @@ |
-# -*- test-case-name: twisted.names.test.test_srvconnect -*- |
-# Copyright (c) 2001-2007 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
-import random |
- |
-from zope.interface import implements |
- |
-from twisted.internet import error, interfaces |
- |
-from twisted.names import client, dns |
-from twisted.names.error import DNSNameError |
- |
-class _SRVConnector_ClientFactoryWrapper: |
- def __init__(self, connector, wrappedFactory): |
- self.__connector = connector |
- self.__wrappedFactory = wrappedFactory |
- |
- def startedConnecting(self, connector): |
- self.__wrappedFactory.startedConnecting(self.__connector) |
- |
- def clientConnectionFailed(self, connector, reason): |
- self.__connector.connectionFailed(reason) |
- |
- def clientConnectionLost(self, connector, reason): |
- self.__connector.connectionLost(reason) |
- |
- def __getattr__(self, key): |
- return getattr(self.__wrappedFactory, key) |
- |
-class SRVConnector: |
- """A connector that looks up DNS SRV records. See RFC2782.""" |
- |
- implements(interfaces.IConnector) |
- |
- stopAfterDNS=0 |
- |
- def __init__(self, reactor, service, domain, factory, |
- protocol='tcp', connectFuncName='connectTCP', |
- connectFuncArgs=(), |
- connectFuncKwArgs={}, |
- ): |
- self.reactor = reactor |
- self.service = service |
- self.domain = domain |
- self.factory = factory |
- |
- self.protocol = protocol |
- self.connectFuncName = connectFuncName |
- self.connectFuncArgs = connectFuncArgs |
- self.connectFuncKwArgs = connectFuncKwArgs |
- |
- self.connector = None |
- self.servers = None |
- self.orderedServers = None # list of servers already used in this round |
- |
- def connect(self): |
- """Start connection to remote server.""" |
- self.factory.doStart() |
- self.factory.startedConnecting(self) |
- |
- if not self.servers: |
- if self.domain is None: |
- self.connectionFailed(error.DNSLookupError("Domain is not defined.")) |
- return |
- d = client.lookupService('_%s._%s.%s' % (self.service, |
- self.protocol, |
- self.domain)) |
- d.addCallbacks(self._cbGotServers, self._ebGotServers) |
- d.addCallback(lambda x, self=self: self._reallyConnect()) |
- d.addErrback(self.connectionFailed) |
- elif self.connector is None: |
- self._reallyConnect() |
- else: |
- self.connector.connect() |
- |
- def _ebGotServers(self, failure): |
- failure.trap(DNSNameError) |
- |
- # Some DNS servers reply with NXDOMAIN when in fact there are |
- # just no SRV records for that domain. Act as if we just got an |
- # empty response and use fallback. |
- |
- self.servers = [] |
- self.orderedServers = [] |
- |
- def _cbGotServers(self, (answers, auth, add)): |
- if len(answers) == 1 and answers[0].type == dns.SRV \ |
- and answers[0].payload \ |
- and answers[0].payload.target == dns.Name('.'): |
- # decidedly not available |
- raise error.DNSLookupError("Service %s not available for domain %s." |
- % (repr(self.service), repr(self.domain))) |
- |
- self.servers = [] |
- self.orderedServers = [] |
- for a in answers: |
- if a.type != dns.SRV or not a.payload: |
- continue |
- |
- self.orderedServers.append((a.payload.priority, a.payload.weight, |
- str(a.payload.target), a.payload.port)) |
- |
- def _serverCmp(self, a, b): |
- if a[0]!=b[0]: |
- return cmp(a[0], b[0]) |
- else: |
- return cmp(a[1], b[1]) |
- |
- def pickServer(self): |
- assert self.servers is not None |
- assert self.orderedServers is not None |
- |
- if not self.servers and not self.orderedServers: |
- # no SRV record, fall back.. |
- return self.domain, self.service |
- |
- if not self.servers and self.orderedServers: |
- # start new round |
- self.servers = self.orderedServers |
- self.orderedServers = [] |
- |
- assert self.servers |
- |
- self.servers.sort(self._serverCmp) |
- minPriority=self.servers[0][0] |
- |
- weightIndex = zip(xrange(len(self.servers)), [x[1] for x in self.servers |
- if x[0]==minPriority]) |
- weightSum = reduce(lambda x, y: (None, x[1]+y[1]), weightIndex, (None, 0))[1] |
- rand = random.randint(0, weightSum) |
- |
- for index, weight in weightIndex: |
- weightSum -= weight |
- if weightSum <= 0: |
- chosen = self.servers[index] |
- del self.servers[index] |
- self.orderedServers.append(chosen) |
- |
- p, w, host, port = chosen |
- return host, port |
- |
- raise RuntimeError, 'Impossible %s pickServer result.' % self.__class__.__name__ |
- |
- def _reallyConnect(self): |
- if self.stopAfterDNS: |
- self.stopAfterDNS=0 |
- return |
- |
- self.host, self.port = self.pickServer() |
- assert self.host is not None, 'Must have a host to connect to.' |
- assert self.port is not None, 'Must have a port to connect to.' |
- |
- connectFunc = getattr(self.reactor, self.connectFuncName) |
- self.connector=connectFunc( |
- self.host, self.port, |
- _SRVConnector_ClientFactoryWrapper(self, self.factory), |
- *self.connectFuncArgs, **self.connectFuncKwArgs) |
- |
- def stopConnecting(self): |
- """Stop attempting to connect.""" |
- if self.connector: |
- self.connector.stopConnecting() |
- else: |
- self.stopAfterDNS=1 |
- |
- def disconnect(self): |
- """Disconnect whatever our are state is.""" |
- if self.connector is not None: |
- self.connector.disconnect() |
- else: |
- self.stopConnecting() |
- |
- def getDestination(self): |
- assert self.connector |
- return self.connector.getDestination() |
- |
- def connectionFailed(self, reason): |
- self.factory.clientConnectionFailed(self, reason) |
- self.factory.doStop() |
- |
- def connectionLost(self, reason): |
- self.factory.clientConnectionLost(self, reason) |
- self.factory.doStop() |
- |