【问题标题】:Google App Engine Channel API with custom domains具有自定义域的 Google App Engine Channel API
【发布时间】:2014-02-01 03:43:53
【问题描述】:

在我的 GAE 应用程序 (Python) 中,我基于请求对象的 host 部分实现了多租户和多站点支持。

例如,www.foo.com/index.htmlwww.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 值用于我的目的。

作为一种解决方法,我可以找到一种将主机信息包含到通道令牌中的方法,因此当我的 connecteddisconnected 处理程序接收到令牌时,他们可以改用该令牌。

但是,我想知道是否有更好的方法,我仍然可以将原始主机名(例如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


【解决方案1】:

没有代理,我认为没有比在带内包含信息更好的方法了。问题是库/基础设施(如果不深入研究就无法确定)正在剥离 HTTP 层信息(Host 标头),实际上您无法控制 HTTP 层来传递自定义标头等. 因此,您要么需要在较低层获取信息(TCP 甚至不提供执行此操作的方法,而且由于您的代码的入口点是通过运行 channel.js 的浏览器,而不是系统级进程在裸露的网络接口上运行,这绝对是不可能的),或者在更高的层,即。频道内。

【讨论】:

  • 您可以随时在cloud platform public issue tracker 中提出功能请求。
  • 谢谢你,尼克。我确实选择将主机信息编码到通道令牌中,因此连接/断开处理程序可以找出原始主机。如果我再次使用新的 Channel API 相关功能,我可能会提交功能请求。感谢您的链接!
猜你喜欢
  • 2012-06-10
  • 2017-04-08
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多