2014-01-13 2 views
6

내 GAE 앱 (Python)에 요청 객체의 host 부분을 기반으로 다중 점유 및 다중 사이트 지원을 구현했습니다.맞춤 도메인이있는 Google App Engine 채널 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 속성에 사용자 지정 도메인 호스트 이름을 추가 : 내가 수동을 무시하려

<script type="text/javascript" src="//www.foo.com/_ah/channel/jsapi"></script> 

은 지금까지 (와 아웃 어떤 성공) 시도 것입니다 채널 소켓의베이스 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 레이어 정보 (호스트 헤더) 제거)가 실제로 사용자 정의 헤더 등을 전달하기위한 HTTP 레이어를 제어하지 않는다는 것입니다. 따라서 하위 계층에서 정보를 가져야합니다 (TCP는이를 수행하는 수단을 제공하지도 않고 코드의 진입 점은 시스템 수준 프로세스가 아닌 channel.js를 실행하는 브라우저를 통과하기 때문에 노출 된 네트워크 인터페이스에서 실행, 이것은 그림에서 결정적으로 벗어남) 또는 상위 계층에서 실행됩니다. 채널 내에서.

+1

언제든지 [클라우드 공개]에서 기능 요청을 할 수 있습니다 문제 추적기] (https://code.google.com/p/google-cloud-platform/issues/list). – Nick

+0

고마워, 닉.호스트 정보를 채널 토큰으로 인코딩하도록 선택 했으므로 연결/연결 끊기 핸들러가 원래 호스트를 알아낼 수 있습니다. 새로운 Channel API 관련 기능으로 돌아온 경우 기능 요청을 제출할 것입니다. 링크 주셔서 감사합니다! – Ani