2014-01-13 20 views
6

私のGAEアプリケーション(Python)では、リクエストオブジェクトのhost部分に基づいてマルチテナントとマルチサイトのサポートを実装しました。カスタムドメインを持つGoogle App Engine Channel API

たとえば、www.foo.com/index.htmlwww.bar.com/index.htmlは、どちらも同じアプリで処理されます(例:myapp.appspot.com)。アプリケーションはホスト値を読み取り、使用する名前空間とサイト構成を決定します。これは、アプリケーションがユーザーエージェントから直接要求を受け取る限り有効です。

チャンネル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属性にカスタムドメインのホスト名を追加:

​​

私も手動で上書きしてみましたチャンネルソケットのベース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