我使用的是Autobahn0.9.2和python3.4和asyncio。在
问题:使用WAMP,是否可以从RPC端点内部访问作为调用方IP和HTTP连接头的对等方?当建立连接时,这些信息是否保持不变?如果没有,我如何开始扩展一些工厂来支持这一点?在
我的目标很简单:我希望有一个RPC端点来对连接的对等方(调用者)的IP进行地理定位,并将扩充的数据中继到Redis。我已经读过资料来源,知道信息是从哪里传来的(高速公路.websocket.protocol.WebSocketServerProtocol->onConnect(request)),但无法从onJoin回调中定义的ApplicationSession的RPC终结点深入到它。我试图遍历传输/路由器/路由器会话链,但没有成功到达那里。我对对等方的IP和来自初始连接请求的HTTP头都感兴趣。在
这是蒸馏成分:
class IncomingComponent(ApplicationSession):
def __init__(self, **params):
super().__init__()
self.redis = StrictRedis(host=config["redis"]["host"], port=config["redis"]["port"], db=config["redis"]["databases"]["ailytics"])
def onConnect(self):
self.join("abc")
@asyncio.coroutine
def onJoin(self, details):
def geolocalize_and_store_event(event, detail):
# Geolocalize here! Have access to caller ID through detail
self.redis.rpush("abc:events", json.dumps(event))
yield from self.register(
geolocalize_and_store_event,
"abc.geolocalize_and_store_event",
options=RegisterOptions(details_arg='detail', discloseCaller = True)
)
以及服务器的初始化:
^{pr2}$
您可以通过中的
wamp.session.get
元API访问额外的会话/传输信息横杆io至少:功能还没有如@oberstet所说,但是由于使用了工厂模式的高速公路/WAMP工具,我能够在不更改库代码的情况下提出解决方案。在
子类有3个组件:
首先,我们向wamp.RouterSession公司的子类
然后我们做wamp.RouterSessionFactory公司子类使用IncomingServerSession
^{pr2}$最后,我们将子类websocket.WampWebSocketServer协议并设置ipAddress实例变量。因为我们在onOpen回调中,所以我们可以访问peer和HTTP头。我的服务器是反向代理的,所以我要在对等服务器上寻找一个自定义的HTTP报头。在
下面是我们如何在RPC调用中访问对等方的IP:
最后,我们需要更新初始化代码以使用我们的子类:
在官方支持之前你就是这样做的!
相关问题 更多 >
编程相关推荐