thirdparty/google_appengine/google/appengine/ext/remote_api/handler.py
changeset 2864 2e0b0af889be
parent 2273 e4cb9c53db3e
child 3031 7678f72140e6
equal deleted inserted replaced
2862:27971a13089f 2864:2e0b0af889be
    46 import yaml
    46 import yaml
    47 
    47 
    48 from google.appengine.api import api_base_pb
    48 from google.appengine.api import api_base_pb
    49 from google.appengine.api import apiproxy_stub
    49 from google.appengine.api import apiproxy_stub
    50 from google.appengine.api import apiproxy_stub_map
    50 from google.appengine.api import apiproxy_stub_map
       
    51 from google.appengine.api import datastore_errors
       
    52 from google.appengine.api import mail_service_pb
       
    53 from google.appengine.api import urlfetch_service_pb
    51 from google.appengine.api import users
    54 from google.appengine.api import users
       
    55 from google.appengine.api.capabilities import capability_service_pb
       
    56 from google.appengine.api.images import images_service_pb
       
    57 from google.appengine.api.memcache import memcache_service_pb
    52 from google.appengine.datastore import datastore_pb
    58 from google.appengine.datastore import datastore_pb
    53 from google.appengine.ext import webapp
    59 from google.appengine.ext import webapp
    54 from google.appengine.ext.remote_api import remote_api_pb
    60 from google.appengine.ext.remote_api import remote_api_pb
    55 from google.appengine.runtime import apiproxy_errors
    61 from google.appengine.runtime import apiproxy_errors
    56 
    62 
    74     of the Next request.
    80     of the Next request.
    75     """
    81     """
    76     runquery_response = datastore_pb.QueryResult()
    82     runquery_response = datastore_pb.QueryResult()
    77     apiproxy_stub_map.MakeSyncCall('datastore_v3', 'RunQuery',
    83     apiproxy_stub_map.MakeSyncCall('datastore_v3', 'RunQuery',
    78                                    request, runquery_response)
    84                                    request, runquery_response)
       
    85     if runquery_response.result_size() > 0:
       
    86       response.CopyFrom(runquery_response)
       
    87       return
       
    88 
    79     next_request = datastore_pb.NextRequest()
    89     next_request = datastore_pb.NextRequest()
    80     next_request.mutable_cursor().CopyFrom(runquery_response.cursor())
    90     next_request.mutable_cursor().CopyFrom(runquery_response.cursor())
    81     next_request.set_count(request.limit())
    91     next_request.set_count(request.limit())
    82     apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Next',
    92     apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Next',
    83                                    next_request, response)
    93                                    next_request, response)
   152     apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Rollback', tx,
   162     apiproxy_stub_map.MakeSyncCall('datastore_v3', 'Rollback', tx,
   153                                    api_base_pb.VoidProto())
   163                                    api_base_pb.VoidProto())
   154 
   164 
   155 
   165 
   156 SERVICE_PB_MAP = {
   166 SERVICE_PB_MAP = {
       
   167     'capability_service': {
       
   168         'IsEnabled': (capability_service_pb.IsEnabledRequest,
       
   169                       capability_service_pb.IsEnabledResponse),
       
   170     },
   157     'datastore_v3': {
   171     'datastore_v3': {
   158         'Get': (datastore_pb.GetRequest, datastore_pb.GetResponse),
   172         'Get':        (datastore_pb.GetRequest, datastore_pb.GetResponse),
   159         'Put': (datastore_pb.PutRequest, datastore_pb.PutResponse),
   173         'Put':        (datastore_pb.PutRequest, datastore_pb.PutResponse),
   160         'Delete': (datastore_pb.DeleteRequest, datastore_pb.DeleteResponse),
   174         'Delete':     (datastore_pb.DeleteRequest, datastore_pb.DeleteResponse),
   161         'Count': (datastore_pb.Query, api_base_pb.Integer64Proto),
   175         'Count':      (datastore_pb.Query, api_base_pb.Integer64Proto),
   162         'GetIndices': (api_base_pb.StringProto, datastore_pb.CompositeIndices),
   176         'GetIndices': (api_base_pb.StringProto, datastore_pb.CompositeIndices),
   163     },
   177     },
       
   178     'images': {
       
   179         'Transform': (images_service_pb.ImagesTransformRequest,
       
   180                       images_service_pb.ImagesTransformResponse),
       
   181         'Composite': (images_service_pb.ImagesCompositeRequest,
       
   182                       images_service_pb.ImagesCompositeResponse),
       
   183         'Histogram': (images_service_pb.ImagesHistogramRequest,
       
   184                       images_service_pb.ImagesHistogramResponse),
       
   185     },
       
   186     'mail': {
       
   187         'Send':         (mail_service_pb.MailMessage, api_base_pb.VoidProto),
       
   188         'SendToAdmins': (mail_service_pb.MailMessage, api_base_pb.VoidProto),
       
   189     },
       
   190     'memcache': {
       
   191         'Get':       (memcache_service_pb.MemcacheGetRequest,
       
   192                       memcache_service_pb.MemcacheGetResponse),
       
   193         'Set':       (memcache_service_pb.MemcacheSetRequest,
       
   194                       memcache_service_pb.MemcacheSetResponse),
       
   195         'Delete':    (memcache_service_pb.MemcacheDeleteRequest,
       
   196                       memcache_service_pb.MemcacheDeleteResponse),
       
   197         'Increment': (memcache_service_pb.MemcacheIncrementRequest,
       
   198                       memcache_service_pb.MemcacheIncrementResponse),
       
   199         'FlushAll':  (memcache_service_pb.MemcacheFlushRequest,
       
   200                       memcache_service_pb.MemcacheFlushResponse),
       
   201         'Stats':     (memcache_service_pb.MemcacheStatsRequest,
       
   202                       memcache_service_pb.MemcacheStatsResponse),
       
   203     },
   164     'remote_datastore': {
   204     'remote_datastore': {
   165         'RunQuery': (datastore_pb.Query, datastore_pb.QueryResult),
   205         'RunQuery':    (datastore_pb.Query, datastore_pb.QueryResult),
   166         'Transaction': (remote_api_pb.TransactionRequest,
   206         'Transaction': (remote_api_pb.TransactionRequest,
   167                              datastore_pb.PutResponse),
   207                         datastore_pb.PutResponse),
   168         'GetIDs': (remote_api_pb.PutRequest, datastore_pb.PutResponse),
   208         'GetIDs':      (remote_api_pb.PutRequest, datastore_pb.PutResponse),
       
   209     },
       
   210     'urlfetch': {
       
   211         'Fetch': (urlfetch_service_pb.URLFetchRequest,
       
   212                   urlfetch_service_pb.URLFetchResponse),
   169     },
   213     },
   170 }
   214 }
   171 
   215 
   172 
   216 
   173 class ApiCallHandler(webapp.RequestHandler):
   217 class ApiCallHandler(webapp.RequestHandler):
   185       self.response.headers['Content-Type'] = 'text/plain'
   229       self.response.headers['Content-Type'] = 'text/plain'
   186       return False
   230       return False
   187     elif 'X-appcfg-api-version' not in self.request.headers:
   231     elif 'X-appcfg-api-version' not in self.request.headers:
   188       self.response.set_status(403)
   232       self.response.set_status(403)
   189       self.response.out.write("This request did not contain a necessary header")
   233       self.response.out.write("This request did not contain a necessary header")
       
   234       self.response.headers['Content-Type'] = 'text/plain'
   190       return False
   235       return False
   191     return True
   236     return True
   192 
   237 
   193 
   238 
   194   def get(self):
   239   def get(self):
   200     app_info = {
   245     app_info = {
   201         'app_id': os.environ['APPLICATION_ID'],
   246         'app_id': os.environ['APPLICATION_ID'],
   202         'rtok': rtok
   247         'rtok': rtok
   203         }
   248         }
   204 
   249 
       
   250     self.response.headers['Content-Type'] = 'text/plain'
   205     self.response.out.write(yaml.dump(app_info))
   251     self.response.out.write(yaml.dump(app_info))
   206 
   252 
   207   def post(self):
   253   def post(self):
   208     """Handle POST requests by executing the API call."""
   254     """Handle POST requests by executing the API call."""
   209     if not self.CheckIsAdmin():
   255     if not self.CheckIsAdmin():
   219       self.response.set_status(200)
   265       self.response.set_status(200)
   220     except Exception, e:
   266     except Exception, e:
   221       logging.exception('Exception while handling %s', request)
   267       logging.exception('Exception while handling %s', request)
   222       self.response.set_status(200)
   268       self.response.set_status(200)
   223       response.mutable_exception().set_contents(pickle.dumps(e))
   269       response.mutable_exception().set_contents(pickle.dumps(e))
       
   270       if isinstance(e, datastore_errors.Error):
       
   271         application_error = response.mutable_application_error()
       
   272         application_error.setCode(e.application_error)
       
   273         application_error.setDetail(e.error_detail)
   224     self.response.out.write(response.Encode())
   274     self.response.out.write(response.Encode())
   225 
   275 
   226   def ExecuteRequest(self, request):
   276   def ExecuteRequest(self, request):
   227     """Executes an API invocation and returns the response object."""
   277     """Executes an API invocation and returns the response object."""
   228     service = request.service_name()
   278     service = request.service_name()