diff -r 26491ee91e33 -r e4cb9c53db3e thirdparty/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py --- a/thirdparty/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py Tue Apr 21 16:28:13 2009 +0000 +++ b/thirdparty/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py Fri Apr 24 14:16:00 2009 +0000 @@ -61,12 +61,16 @@ +import google import os import pickle +import random import sha import sys import thread import threading +import yaml + from google.appengine.api import apiproxy_stub_map from google.appengine.datastore import datastore_pb from google.appengine.ext.remote_api import remote_api_pb @@ -74,6 +78,14 @@ from google.appengine.tools import appengine_rpc +class Error(Exception): + """Base class for exceptions in this module.""" + + +class ConfigurationError(Error): + """Exception for configuration errors.""" + + def GetUserAgent(): """Determines the value of the 'User-agent' header to use for HTTP requests. @@ -378,9 +390,15 @@ path, auth_func, servername=None, - rpc_server_factory=appengine_rpc.HttpRpcServer): + rpc_server_factory=appengine_rpc.HttpRpcServer, + rtok=None, + secure=False): """Does necessary setup to allow easy remote access to an AppEngine datastore. + Either servername must be provided or app_id must not be None. If app_id + is None and a servername is provided, this function will send a request + to the server to retrieve the app_id. + Args: app_id: The app_id of your app, as declared in app.yaml. path: The path to the remote_api handler for your app @@ -392,12 +410,38 @@ servername: The hostname your app is deployed on. Defaults to .appspot.com. rpc_server_factory: A factory to construct the rpc server for the datastore. + rtok: The validation token to sent with app_id lookups. If None, a random + token is used. + secure: Use SSL when communicating with the server. + + Raises: + urllib2.HTTPError: if app_id is not provided and there is an error while + retrieving it. + ConfigurationError: if there is a error configuring the DatstoreFileStub. """ + if not servername and not app_id: + raise ConfigurationError('app_id or servername required') if not servername: servername = '%s.appspot.com' % (app_id,) + server = rpc_server_factory(servername, auth_func, GetUserAgent(), + GetSourceName(), debug_data=False, secure=secure) + if not app_id: + if not rtok: + random.seed() + rtok = str(random.randint) + urlargs = {'rtok': rtok} + response = server.Send(path, payload=None, **urlargs) + if not response.startswith('{'): + raise ConfigurationError( + 'Invalid response recieved from server: %s' % response) + app_info = yaml.load(response) + if not app_info or 'rtok' not in app_info or 'app_id' not in app_info: + raise ConfigurationError('Error parsing app_id lookup response') + if app_info['rtok'] != rtok: + raise ConfigurationError('Token validation failed during app_id lookup.') + app_id = app_info['app_id'] + os.environ['APPLICATION_ID'] = app_id apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap() - server = rpc_server_factory(servername, auth_func, GetUserAgent(), - GetSourceName()) stub = RemoteDatastoreStub(server, path) apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub)