4956: Add maximum request size checking to http_request patch in api.py.
[arvados.git] / sdk / python / arvados / api.py
index a227e436a322948b92ec5f6adabad41e00e773ae..949ead36443eae97f34fdb6be8badfb7b3ba8248 100644 (file)
@@ -21,6 +21,12 @@ class CredentialsFromToken(object):
     @staticmethod
     def http_request(self, uri, **kwargs):
         from httplib import BadStatusLine
+
+        if (self.max_request_size and
+            kwargs.get('body') and
+            self.max_request_size < len(kwargs['body'])):
+            raise apiclient_errors.MediaUploadSizeError("Request size %i bytes exceeds published limit of %i bytes" % (len(kwargs['body']), self.max_request_size))
+
         if 'headers' not in kwargs:
             kwargs['headers'] = {}
 
@@ -38,10 +44,12 @@ class CredentialsFromToken(object):
             # previous call did not succeed, so this is slightly
             # risky.
             return self.orig_http_request(uri, **kwargs)
+
     def authorize(self, http):
         http.arvados_api_token = self.api_token
         http.orig_http_request = http.request
         http.request = types.MethodType(self.http_request, http)
+        http.max_request_size = 0
         return http
 
 # Monkey patch discovery._cast() so objects and arrays get serialized
@@ -147,6 +155,7 @@ def api(version=None, cache=True, host=None, token=None, insecure=False, **kwarg
 
     svc = apiclient_discovery.build('arvados', version, **kwargs)
     svc.api_token = token
+    kwargs['http'].max_request_size = svc._rootDesc.get('maxRequestSize', 0)
     kwargs['http'].cache = None
     return svc