thirdparty/google_appengine/google/appengine/api/apiproxy_stub.py
changeset 686 df109be0567c
child 828 f5fd65cc3bf3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/thirdparty/google_appengine/google/appengine/api/apiproxy_stub.py	Sat Dec 06 16:52:21 2008 +0000
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+#
+# Copyright 2007 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""Base class for implementing API proxy stubs."""
+
+
+
+
+
+
+from google.appengine.runtime import apiproxy_errors
+
+
+MAX_REQUEST_SIZE = 1 << 20
+
+
+class APIProxyStub(object):
+  """Base class for implementing API proxy stub classes.
+
+  To implement an API proxy stub:
+    - Extend this class.
+    - Override __init__ to pass in appropriate default service name.
+    - Implement service methods as _Dynamic_<method>(request, response).
+  """
+
+  def __init__(self, service_name, max_request_size=MAX_REQUEST_SIZE):
+    """Constructor.
+
+    Args:
+      service_name: Service name expected for all calls.
+      max_request_size: int, maximum allowable size of the incoming request.  A
+        apiproxy_errors.RequestTooLargeError will be raised if the inbound
+        request exceeds this size.  Default is 1 MB.
+    """
+    self.__service_name = service_name
+    self.__max_request_size = max_request_size
+
+  def MakeSyncCall(self, service, call, request, response):
+    """The main RPC entry point.
+
+    Args:
+      service: Must be name as provided to service_name of constructor.
+      call: A string representing the rpc to make.  Must be part of
+        the underlying services methods and impemented by _Dynamic_<call>.
+      request: A protocol buffer of the type corresponding to 'call'.
+      response: A protocol buffer of the type corresponding to 'call'.
+    """
+    assert service == self.__service_name, ('Expected "%s" service name, '
+                                            'was "%s"' % (self.__service_name,
+                                                          service))
+    if request.ByteSize() > self.__max_request_size:
+      raise apiproxy_errors.RequestTooLargeError(
+          'The request to API call %s.%s() was too large.' % (service, call))
+    messages = []
+    assert request.IsInitialized(messages), messages
+
+    method = getattr(self, '_Dynamic_' + call)
+    method(request, response)