Pārlūkot izejas kodu

HUE-4930 [core] Fix clearing cookie option in HttpClient

Romain Rigaux 9 gadi atpakaļ
vecāks
revīzija
13fec9e

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

@@ -158,11 +158,12 @@ class HttpClient(object):
     if files:
       request_kwargs['files'] = files
 
+    if self._cookies and not clear_cookies:
+      request_kwargs['cookies'] = self._cookies
+
     if clear_cookies:
       self._session.cookies.clear()
 
-    if self._cookies:
-      request_kwargs['cookies'] = self._cookies
     try:
       resp = getattr(self._session, http_method.lower())(url, **request_kwargs)
       if resp.status_code >= 300:

+ 31 - 4
desktop/core/src/desktop/lib/rest/http_client_test.py

@@ -14,12 +14,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from requests.exceptions import HTTPError
 from requests import Response
+from requests.exceptions import HTTPError
 
-from nose.tools import assert_equal
+from nose.tools import assert_equal, assert_false, assert_true
 
-from desktop.lib.rest.http_client import RestException
+from desktop.lib.rest.http_client import RestException, HttpClient
 
 
 def build_response(reason=None, status_code=200, headers={}):
@@ -31,7 +31,34 @@ def build_response(reason=None, status_code=200, headers={}):
 
 
 def test_http_error_rest_exception():
-  headers ={'my header': 'one value'}
+  headers = {'my header': 'one value'}
   response = build_response('Not found', 404, headers)
   exception = RestException(HTTPError(response=response))
   assert_equal(headers, exception._headers)
+
+
+class MockedSession():
+
+  def __init__(self, cookies=None):
+    self.cookies = cookies or {}
+
+  def put(self, relpath=None, params=None, data=None, contenttype=None, allow_redirects=False, clear_cookies=False):
+    return MockedResponse()
+
+
+class MockedResponse():
+  def __init__(self, status_code=200, cookies=None):
+    self.status_code = status_code
+    self.cookies = cookies
+
+
+def test_clear_cookies():
+
+  client = HttpClient('gethue')
+  client._session = MockedSession({'hue': 'rocks'})
+
+  client.execute('put', '/path')
+  assert_true(client._session.cookies)
+
+  client.execute('put', '/path', clear_cookies=True)
+  assert_false(client._session.cookies)

+ 1 - 2
desktop/core/src/desktop/lib/rest/resource.py

@@ -63,8 +63,7 @@ class Resource(object):
     else:
       return resp.content
 
-  def invoke(self, method, relpath=None, params=None, data=None, headers=None, files=None, allow_redirects=False,
-             clear_cookies=False):
+  def invoke(self, method, relpath=None, params=None, data=None, headers=None, files=None, allow_redirects=False, clear_cookies=False):
     """
     Invoke an API method.
     @return: Raw body or JSON dictionary (if response content type is JSON).

+ 1 - 2
desktop/libs/metadata/src/metadata/navigator_client.py

@@ -178,8 +178,7 @@ class NavigatorApi(object):
     try:
       # TODO: Check permissions of entity
       data = json.dumps(metadata)
-      return self._root.put('entities/%s' % entity_id, params=self.__params, data=data, allow_redirects=True,
-                            clear_cookies=True)
+      return self._root.put('entities/%s' % entity_id, params=self.__params, data=data, allow_redirects=True, clear_cookies=True)
     except RestException, e:
       msg = 'Failed to update entity %s: %s' % (entity_id, str(e))
       LOG.exception(msg)