aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py3/twisted/protocols/portforward.py
diff options
context:
space:
mode:
authorshmel1k <shmel1k@ydb.tech>2023-11-26 18:16:14 +0300
committershmel1k <shmel1k@ydb.tech>2023-11-26 18:43:30 +0300
commitb8cf9e88f4c5c64d9406af533d8948deb050d695 (patch)
tree218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py3/twisted/protocols/portforward.py
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py3/twisted/protocols/portforward.py')
-rw-r--r--contrib/python/Twisted/py3/twisted/protocols/portforward.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py3/twisted/protocols/portforward.py b/contrib/python/Twisted/py3/twisted/protocols/portforward.py
new file mode 100644
index 00000000000..bf3a894dfaa
--- /dev/null
+++ b/contrib/python/Twisted/py3/twisted/protocols/portforward.py
@@ -0,0 +1,90 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+A simple port forwarder.
+"""
+
+# Twisted imports
+from twisted.internet import protocol
+from twisted.python import log
+
+
+class Proxy(protocol.Protocol):
+ noisy = True
+
+ peer = None
+
+ def setPeer(self, peer):
+ self.peer = peer
+
+ def connectionLost(self, reason):
+ if self.peer is not None:
+ self.peer.transport.loseConnection()
+ self.peer = None
+ elif self.noisy:
+ log.msg(f"Unable to connect to peer: {reason}")
+
+ def dataReceived(self, data):
+ self.peer.transport.write(data)
+
+
+class ProxyClient(Proxy):
+ def connectionMade(self):
+ self.peer.setPeer(self)
+
+ # Wire this and the peer transport together to enable
+ # flow control (this stops connections from filling
+ # this proxy memory when one side produces data at a
+ # higher rate than the other can consume).
+ self.transport.registerProducer(self.peer.transport, True)
+ self.peer.transport.registerProducer(self.transport, True)
+
+ # We're connected, everybody can read to their hearts content.
+ self.peer.transport.resumeProducing()
+
+
+class ProxyClientFactory(protocol.ClientFactory):
+ protocol = ProxyClient
+
+ def setServer(self, server):
+ self.server = server
+
+ def buildProtocol(self, *args, **kw):
+ prot = protocol.ClientFactory.buildProtocol(self, *args, **kw)
+ prot.setPeer(self.server)
+ return prot
+
+ def clientConnectionFailed(self, connector, reason):
+ self.server.transport.loseConnection()
+
+
+class ProxyServer(Proxy):
+ clientProtocolFactory = ProxyClientFactory
+ reactor = None
+
+ def connectionMade(self):
+ # Don't read anything from the connecting client until we have
+ # somewhere to send it to.
+ self.transport.pauseProducing()
+
+ client = self.clientProtocolFactory()
+ client.setServer(self)
+
+ if self.reactor is None:
+ from twisted.internet import reactor
+
+ self.reactor = reactor
+ self.reactor.connectTCP(self.factory.host, self.factory.port, client)
+
+
+class ProxyFactory(protocol.Factory):
+ """
+ Factory for port forwarder.
+ """
+
+ protocol = ProxyServer
+
+ def __init__(self, host, port):
+ self.host = host
+ self.port = port