【发布时间】:2014-02-01 03:43:53
【问题描述】:
在我的 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>
我还尝试手动覆盖通道套接字的 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>
我找不到任何有关 channel.js 的官方文档,并且我不想实现在 Google 的下一次更新中很容易损坏的东西。
【问题讨论】:
-
这对我有用:
goog.appengine.Socket.BASE_URL = "https://www.foo.com/_ah/channel/";
标签: google-app-engine channel-api