Ani*_*Ani 6 google-app-engine channel-api
在我的GAE应用程序(Python)中,我基于host
请求对象的一部分实现了多租户和多站点支持.
例如,www.foo.com/index.html
并且www.bar.com/index.html
都由相同的应用程序处理(例如myapp.appspot.com
).应用程序读取主机值,然后决定使用哪个命名空间和站点配置.只要应用程序直接从用户代理接收请求,这就很有用.
但是,我想使用Channel API,但是存在一个问题,因为请求来自原始用户代理/_ah/channel/connected/
并且/_ah/channel/disconnected/
不是来自原始用户代理.相反,请求具有Host: myapp.appspot.com
参数to=myapp.appspot.com
.(该from
参数是我期望的令牌.也www.foo.com/_ah/channel/jsapi
被重定向到一个没有记录的talkgadget服务器,但似乎是预期的.)
我假设,问题是由channel.js
不使用原始主机调用我的应用程序的代码引起的,例如www.foo.com/_ah/channel/connected
.相反,它使用一个talkgadget.google.com
主机(据我所知)将调用我的应用程序,但使用myapp.appspot.com
,忽略原始主机,所以我不能使用请求的host
值为我的目的.
作为一种解决方法,我可以想出一种将主机信息包含在通道令牌中的方法,因此当我connected
和disconnected
处理程序收到令牌时,他们可以使用令牌代替.
但是,我想知道是否有更好的方法,我仍然可以获得原始主机名(例如www.foo.com
)请求/_ah/channel/connected/
和/_ah/channel/disconnected/
.有任何想法吗?
这是我到目前为止所尝试过的(没有任何成功):
将自定义域主机名添加到JS src属性:
<script type="text/javascript" src="//www.foo.com/_ah/channel/jsapi"></script>
Run Code Online (Sandbox Code Playgroud)
我还尝试手动覆盖通道套接字的base-url,建议如下:https://stackoverflow.com/questions/16558776/google-app-engine-channel-api-same-origin-policy
<script type="text/javascript">
onOpened = function() {
// TODO
};
onMessage = function() {
// TODO
};
onError = function() {
// TODO
};
onClose = function() {
// TODO
};
goog.appengine.Socket.BASE_URL = "https://www.foo.com/_ah/channel/";
channel = new goog.appengine.Channel('{{channelToken}}');
socket = channel.open();
socket.onopen = onOpened;
socket.onmessage = onMessage;
socket.onerror = onError;
socket.onclose = onClose;
</script>
Run Code Online (Sandbox Code Playgroud)
我找不到关于channel.js的任何官方文档,我也不想在Google的下一次更新中实现一些容易破解的东西.
如果缺少代理,我认为没有比将信息包含在带内更好的方法了。问题是库/基础设施(如果不深入查看就无法确定)正在剥离 HTTP 层信息(主机标头),并且实际上您无法控制 HTTP 层来传递自定义标头等因此,您要么需要在较低层获取信息(TCP 甚至没有提供执行此操作的方法,并且由于代码的入口点是通过运行 Channel.js 的浏览器,而不是系统级进程在裸网络接口上运行,这绝对是不可能的),或者在更高层上运行,即。通道内。
归档时间: |
|
查看次数: |
399 次 |
最近记录: |