基于 Twisted 条件的端口转发

Port Forward based on condition in Twisted

我正在尝试在 Twisted 中编写一个端口转发器,如果​​ IP 地址已经在缓存中,它将转发到端口 8000,如果没有,则转发到另一个端口 - 例如 4000。我已经编写了缓存,但在使用 Twisted 将逻辑添加到端口转发的位置时遇到了问题。

举个简单的例子:

class LoggingProxyServer(portforward.ProxyServer):
    def dataReceived(self, data):
        portforward.ProxyServer.dataReceived(self, data)

class LoggingProxyFactory(portforward.ProxyFactory):
    protocol = LoggingProxyServer

我要重写什么扭曲的方法来添加缓存检查?

ProxyServer.connectionMade 负责建立从代理进程传出的 TCP 连接。它使用其工厂的 hostport 属性来决定它将用作该连接尝试的目标。

如果您想改变代理的行为,您需要覆盖该代码。

您可以很容易地找到连接到ProxyServer的客户端的IP地址。 ProxyServer 实例有一个 transport 属性,它引用 ITransport 提供者(如果您的代理正在侦听传入的 TCP 连接,则可能是 ITCPTransport 提供者)。

传输有方法告诉您它们两个端点的地址。 getHost 告诉你本地地址,getPeer 告诉你远程地址。

因此,例如,您可以编写一个条件,对所有 IP 地址以 1 开头的 TCP 客户端具有一种行为,对具有其他 IP 地址的所有 TCP 客户端具有另一种行为:

if self.transport.getPeer().host.startswith("1"):
    ...
else:
    ...