我正在cherrypy服务器上运行一个捕获门户,我已经设置了iptables规则,可以REDIRECT从未注册的MAC地址到该门户的所有http流量。在用户通过门户启动页面向我注册后,我添加了一个iptables异常,让他们的流量通过
现在我想做的是在用户被发送到门户网站之前,将其重定向到他们最初要访问的页面。我知道iptables为所有TCP数据包设置了一个包含原始目的地信息的字段,我知道有一个名为getsockopt的C函数可以读取该字段。但是,我不知道如何访问cherrypy中与请求相关联的套接字。
有人能帮我吗?:)
我不是底层网络专家,也不知道常见的开放式Wi-Fi授权实现如何标记其客户端。但在我看来,在OSI模型中,下层对上层一无所知。换句话说,IP不知道HTTP术语和页面URL。
通过这种方式,手头有一个套接字引用,我相信可以通过定制CherryPy来检索,它最多会给你原始的IP地址,而不是URL。此外,混合网络(IP)和应用程序(HTTP)层,通常在多个地方管理一个应用程序实体,可能会导致各种问题。例如,处理HTTP代理,例如正向和反向代理,它们不会保留较低层的细微差别。
更新
好吧,既然你说你也有请求URL,下面是你如何检索原始套接字的。正如您所看到的,它是深入的,本质上是最终用户不应该依赖的实现细节。它不是合同的一部分,可以在任何下一个版本中进行更改。这样你就有机会射中自己的脚。
#!/usr/bin/env python
import cherrypy
config = {
'global' : {
'server.socket_host' : '127.0.0.1',
'server.socket_port' : 8080,
'server.thread_pool' : 8
},
}
class App:
@cherrypy.expose
def index(self):
'''For caveats and details on the slippery slope, take a look at ws4py
https://github.com/Lawouach/WebSocket-for-Python/blob/master/ws4py/server/cherrypyserver.py
'''
print(cherrypy.serving.request.rfile.rfile._sock)
return 'Make sure you know what you are doing.'
if __name__ == '__main__':
cherrypy.quickstart(App(), '/', config)