소스 검색

[core] Support files for Multipart-encoded posts in REST lib

Romain Rigaux 9 년 전
부모
커밋
f55e40d
2개의 변경된 파일8개의 추가작업 그리고 5개의 파일을 삭제
  1. 4 2
      desktop/core/src/desktop/lib/rest/http_client.py
  2. 4 3
      desktop/core/src/desktop/lib/rest/resource.py

+ 4 - 2
desktop/core/src/desktop/lib/rest/http_client.py

@@ -119,7 +119,7 @@ class HttpClient(object):
       self._session.headers.update(headers)
     return self._session.headers.copy()
 
-  def execute(self, http_method, path, params=None, data=None, headers=None, allow_redirects=False, urlencode=True):
+  def execute(self, http_method, path, params=None, data=None, headers=None, allow_redirects=False, urlencode=True, files=None):
     """
     Submit an HTTP request.
     @param http_method: GET, POST, PUT, DELETE
@@ -129,6 +129,7 @@ class HttpClient(object):
     @param headers: The headers to set for this request.
     @param allow_redirects: requests should automatically resolve redirects.
     @param urlencode: percent encode paths.
+    @param files: for posting Multipart-Encoded files
 
     @return: The result of urllib2.urlopen()
     """
@@ -146,7 +147,8 @@ class HttpClient(object):
       request_kwargs['headers'] = headers
     if data:
       request_kwargs['data'] = data
-
+    if files:
+      request_kwargs['files'] = files
     try:
       resp = getattr(self._session, http_method.lower())(url, **request_kwargs)
       if resp.status_code >= 300:

+ 4 - 3
desktop/core/src/desktop/lib/rest/resource.py

@@ -63,7 +63,7 @@ class Resource(object):
     else:
       return resp.content
 
-  def invoke(self, method, relpath=None, params=None, data=None, headers=None, allow_redirects=False):
+  def invoke(self, method, relpath=None, params=None, data=None, headers=None, files=None, allow_redirects=False):
     """
     Invoke an API method.
     @return: Raw body or JSON dictionary (if response content type is JSON).
@@ -74,6 +74,7 @@ class Resource(object):
                                 params=params,
                                 data=data,
                                 headers=headers,
+                                files=files,
                                 allow_redirects=allow_redirects,
                                 urlencode=self._urlencode)
 
@@ -109,7 +110,7 @@ class Resource(object):
     return self.invoke("DELETE", relpath, params, headers=headers)
 
 
-  def post(self, relpath=None, params=None, data=None, contenttype=None, headers=None):
+  def post(self, relpath=None, params=None, data=None, contenttype=None, headers=None, files=None):
     """
     Invoke the POST method on a resource.
     @param relpath: Optional. A relative path to this resource's path.
@@ -120,7 +121,7 @@ class Resource(object):
 
     @return: A dictionary of the JSON result.
     """
-    return self.invoke("POST", relpath, params, data, self._make_headers(contenttype, headers))
+    return self.invoke("POST", relpath, params, data, self._make_headers(contenttype, headers), files)
 
 
   def put(self, relpath=None, params=None, data=None, contenttype=None):