diff options
author | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:16:14 +0300 |
---|---|---|
committer | shmel1k <shmel1k@ydb.tech> | 2023-11-26 18:43:30 +0300 |
commit | b8cf9e88f4c5c64d9406af533d8948deb050d695 (patch) | |
tree | 218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py3/twisted/protocols/portforward.py | |
parent | 523f645a83a0ec97a0332dbc3863bb354c92a328 (diff) | |
download | ydb-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.py | 90 |
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 |