基于 Twisted 条件的端口转发
Posted
技术标签:
【中文标题】基于 Twisted 条件的端口转发【英文标题】:Port Forward based on condition in Twisted 【发布时间】:2015-03-16 02:16:30 【问题描述】:我正在尝试在 Twisted 中编写一个端口转发器,如果 IP 地址已经在缓存中,它将转发到端口 8000 并转发到另一个端口 - 如果没有,则说 4000。我已经编写了缓存,但是在使用 Twisted 向端口转发添加逻辑的位置时遇到了问题。
举个简单的例子:
class LoggingProxyServer(portforward.ProxyServer):
def dataReceived(self, data):
portforward.ProxyServer.dataReceived(self, data)
class LoggingProxyFactory(portforward.ProxyFactory):
protocol = LoggingProxyServer
我应该重写什么扭曲的方法来添加缓存检查?
【问题讨论】:
@Jean-PaulCalderone 抱歉,我编辑了这个问题。用户只是 get 请求中的 ip 地址,至少最初是这样。 【参考方案1】:ProxyServer.connectionMade
负责设置从代理进程传出的 TCP 连接。它使用其工厂的host
和port
属性来决定它将使用什么作为连接尝试的目标。
如果您想改变代理的行为,这就是您需要覆盖的代码。
您可以轻松找到连接到ProxyServer
的客户端的IP 地址。 ProxyServer
实例有一个 transport
属性,该属性引用 ITransport
提供程序(如果您的代理正在侦听传入的 TCP 连接,则可能是一个 ITCPTransport
提供程序)。
Transports 有方法告诉你它们的两个端点的地址。 getHost
告诉你本地地址,getPeer
告诉你远程地址。
因此,例如,您可以编写一个条件,该条件对所有 IP 地址以 1
开头的 TCP 客户端具有一种行为,而对所有具有其他 IP 地址的 TCP 客户端具有其他行为:
if self.transport.getPeer().host.startswith("1"):
...
else:
...
【讨论】:
以上是关于基于 Twisted 条件的端口转发的主要内容,如果未能解决你的问题,请参考以下文章