2014-01-13 66 views
6

在我的GAE應用程序(Python)中,我基於請求對象的host部分實現了多租戶和多站點支持。帶自定義域的Google App Engine通道API

例如,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價值爲我的目的。

作爲一種解決方法,我可以找出將主機信息包含到通道令牌中的方法,因此當我的處理程序接收到令牌時,它們可以使用該令牌。

但是,我想知道是否有更好的方法,我仍然可以獲得原始主機名(例如www.foo.com)請求/_ah/channel/connected//_ah/channel/disconnected/。有任何想法嗎?

這是我迄今(帶出任何成功的)嘗試:

添加自定義域名主機名的JS src屬性:

​​

我也試過手動覆蓋通道插口的基礎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將在下一次更新中輕鬆打破這個問題。

+0

這對我有用: 'goog.appengine.Socket.BASE_URL =「https://www.foo.com/_ah/channel/」;' – Subir

回答

1

缺少代理服務器,我沒有看到比包含帶內信息更好的方法。問題是庫/基礎結構(不能不確定而不深入)剝離HTTP層信息(Host頭),並且實際上你沒有任何HTTP層控制來傳遞自定義頭文件等。因此,您需要將信息放在較低層(TCP甚至不提供這樣做的方法,並且由於代碼的入口點是通過運行channel.js的瀏覽器而不是系統級進程在裸露的網絡接口上運行,這是果斷的),或者在更高層,即,在頻道內。

+1

您可以隨時在[雲平臺公開問題跟蹤器](https://code.google.com/p/google-cloud-platform/issues/list)。 – Nick

+0

謝謝你,尼克。我確實選擇將主機信息編碼到通道令牌中,因此連接/斷開連接處理程序可以找出原始主機。如果我回到一個新的Channel API相關功能,我可能會提交一個功能請求。感謝您的鏈接! – Ani

相關問題