Updated Branches:
  refs/heads/trunk 21ac363ba -> 08a79e4d1

Only send Content-Length: 0 even if "data" is None.

Fixes LIBCLOUD-390.


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/08a79e4d
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/08a79e4d
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/08a79e4d

Branch: refs/heads/trunk
Commit: 08a79e4d17d694477194d2c957db0ea5f67e8648
Parents: 21ac363
Author: Tomaz Muraus <[email protected]>
Authored: Wed Sep 4 10:58:44 2013 +0200
Committer: Tomaz Muraus <[email protected]>
Committed: Wed Sep 4 11:07:31 2013 +0200

----------------------------------------------------------------------
 CHANGES                          |  2 +-
 libcloud/common/base.py          | 12 ++++++------
 libcloud/test/test_connection.py | 37 +++++++++++++----------------------
 3 files changed, 21 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/08a79e4d/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index a956f87..e7a2217 100644
--- a/CHANGES
+++ b/CHANGES
@@ -14,7 +14,7 @@ Changes with Apache Libcloud in development
       [Tomaz Muraus]
 
     - Fix a regression introduced in 0.13.0 and make sure to include
-      Content-Length 0 with PUT and POST requests. (LIBCLOUD-362)
+      Content-Length 0 with PUT and POST requests. (LIBCLOUD-362, LIBCLOUD-390)
       [Tomaz Muraus]
 
  *) Compute

http://git-wip-us.apache.org/repos/asf/libcloud/blob/08a79e4d/libcloud/common/base.py
----------------------------------------------------------------------
diff --git a/libcloud/common/base.py b/libcloud/common/base.py
index 529bdbe..101e66c 100644
--- a/libcloud/common/base.py
+++ b/libcloud/common/base.py
@@ -571,14 +571,14 @@ class Connection(object):
         else:
             headers.update({'Host': self.host})
 
-        # Encode data if provided
         if data:
+            # Encode data if provided
             data = self.encode_data(data)
-
-        # Only send Content-Length 0 with POST and PUT request
-        if data is not None:
-            if len(data) > 0 or (len(data) == 0 and method in ['POST', 'PUT']):
-                headers.update({'Content-Length': str(len(data))})
+            headers.update({'Content-Length': str(len(data))})
+        else:
+            # Only send Content-Length 0 with POST and PUT request
+            if method.upper() in ['POST', 'PUT']:
+                headers.update({'Content-Length': '0'})
 
         params, headers = self.pre_connect_hook(params, headers)
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/08a79e4d/libcloud/test/test_connection.py
----------------------------------------------------------------------
diff --git a/libcloud/test/test_connection.py b/libcloud/test/test_connection.py
index 938e170..798f7ec 100644
--- a/libcloud/test/test_connection.py
+++ b/libcloud/test/test_connection.py
@@ -49,39 +49,30 @@ class ConnectionClassTestCase(unittest.TestCase):
         call_kwargs = con.connection.request.call_args[1]
         self.assertTrue('Content-Length' not in call_kwargs['headers'])
 
-        # 'a' as data, content length should be present (data is GET is not
+        # 'a' as data, content length should be present (data in GET is not
         # corect, but anyways)
         con.request('/test', method='GET', data='a')
         call_kwargs = con.connection.request.call_args[1]
         self.assertEqual(call_kwargs['headers']['Content-Length'], '1')
 
         ## POST, PUT method
-        # No data, no content length should be present
-        con.request('/test', method='POST', data=None)
-        call_kwargs = con.connection.request.call_args[1]
-        self.assertTrue('Content-Length' not in call_kwargs['headers'])
-
-        con.request('/test', method='PUT', data=None)
-        call_kwargs = con.connection.request.call_args[1]
-        self.assertTrue('Content-Length' not in call_kwargs['headers'])
+        # No data, content length should be present
+        for method in ['POST', 'PUT', 'post', 'put']:
+            con.request('/test', method=method, data=None)
+            call_kwargs = con.connection.request.call_args[1]
+            self.assertEqual(call_kwargs['headers']['Content-Length'], '0')
 
         # '' as data, content length should be present
-        con.request('/test', method='POST', data='')
-        call_kwargs = con.connection.request.call_args[1]
-        self.assertEqual(call_kwargs['headers']['Content-Length'], '0')
-
-        con.request('/test', method='PUT', data='')
-        call_kwargs = con.connection.request.call_args[1]
-        self.assertEqual(call_kwargs['headers']['Content-Length'], '0')
+        for method in ['POST', 'PUT', 'post', 'put']:
+            con.request('/test', method=method, data='')
+            call_kwargs = con.connection.request.call_args[1]
+            self.assertEqual(call_kwargs['headers']['Content-Length'], '0')
 
         # 'a' as data, content length should be present
-        con.request('/test', method='POST', data='a')
-        call_kwargs = con.connection.request.call_args[1]
-        self.assertEqual(call_kwargs['headers']['Content-Length'], '1')
-
-        con.request('/test', method='PUT', data='a')
-        call_kwargs = con.connection.request.call_args[1]
-        self.assertEqual(call_kwargs['headers']['Content-Length'], '1')
+        for method in ['POST', 'PUT', 'post', 'put']:
+            con.request('/test', method=method, data='a')
+            call_kwargs = con.connection.request.call_args[1]
+            self.assertEqual(call_kwargs['headers']['Content-Length'], '1')
 
 
 if __name__ == '__main__':

Reply via email to