diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-03-22 10:00:47 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-03-22 10:00:47 +0000 |
commit | 4f57f815b3847c9f4a2edc20784a770b806f4045 (patch) | |
tree | ddac8e3539db128b35b5ca867b954ee874ad44eb | |
parent | 42fa4568f1f973bc8992b705f749cf0bdc6e56ed (diff) | |
parent | d90b768e509e41a2ab4f8d26b1093fd329167102 (diff) | |
download | python-swiftclient-4f57f815b3847c9f4a2edc20784a770b806f4045.tar.gz |
Merge "Enhance put_object to inform when chunk is ignored"
-rw-r--r-- | swiftclient/client.py | 15 | ||||
-rw-r--r-- | tests/test_swiftclient.py | 21 |
2 files changed, 33 insertions, 3 deletions
diff --git a/swiftclient/client.py b/swiftclient/client.py index 1ffd1b4..3005a57 100644 --- a/swiftclient/client.py +++ b/swiftclient/client.py @@ -21,6 +21,7 @@ import socket import os import sys import logging +import warnings from functools import wraps from urllib import quote as _quote @@ -764,7 +765,7 @@ def head_object(url, token, container, name, http_conn=None): def put_object(url, token=None, container=None, name=None, contents=None, - content_length=None, etag=None, chunk_size=65536, + content_length=None, etag=None, chunk_size=None, content_type=None, headers=None, http_conn=None, proxy=None): """ Put an object @@ -782,7 +783,9 @@ def put_object(url, token=None, container=None, name=None, contents=None, computed via the contents or chunked transfer encoding will be used :param etag: etag of contents; if None, no etag will be sent - :param chunk_size: chunk size of data to write; default 65536 + :param chunk_size: chunk size of data to write; it defaults to 65536; + used only if the the contents object has a 'read' + method, eg. file-like objects, ignored otherwise :param content_type: value to send as content-type header; if None, no content-type will be set (remote end will likely try to auto-detect it) @@ -822,6 +825,8 @@ def put_object(url, token=None, container=None, name=None, contents=None, if not contents: headers['Content-Length'] = '0' if hasattr(contents, 'read'): + if chunk_size is None: + chunk_size = 65536 conn.putrequest('PUT', path) for header, value in headers.iteritems(): conn.putheader(header, value) @@ -844,6 +849,10 @@ def put_object(url, token=None, container=None, name=None, contents=None, conn.send(chunk) left -= len(chunk) else: + if chunk_size is not None: + warn_msg = '%s object has no \"read\" method, ignoring chunk_size'\ + % type(contents).__name__ + warnings.warn(warn_msg, stacklevel=2) conn.request('PUT', path, contents, headers) resp = conn.getresponse() body = resp.read() @@ -1082,7 +1091,7 @@ class Connection(object): resp_chunk_size=resp_chunk_size) def put_object(self, container, obj, contents, content_length=None, - etag=None, chunk_size=65536, content_type=None, + etag=None, chunk_size=None, content_type=None, headers=None): """Wrapper for :func:`put_object`""" diff --git a/tests/test_swiftclient.py b/tests/test_swiftclient.py index 8f147f8..8e4289e 100644 --- a/tests/test_swiftclient.py +++ b/tests/test_swiftclient.py @@ -17,6 +17,7 @@ import socket import StringIO import testtools +import warnings from urlparse import urlparse # TODO: mock http connection class with more control over headers @@ -472,6 +473,26 @@ class TestPutObject(MockHttpTest): self.assertTrue("a-b: .x:yz mn:fg:lp" in resp.buffer[0], "[a-b: .x:yz mn:fg:lp] header is missing") + def test_chunk_warning(self): + conn = c.http_connection('http://www.test.com/') + file = StringIO.StringIO('asdf') + args = ('asdf', 'asdf', 'asdf', 'asdf', file) + resp = MockHttpResponse() + conn[1].getresponse = resp.fake_response + conn[1].send = resp.fake_send + with warnings.catch_warnings(record=True) as w: + c.put_object(*args, chunk_size=20, headers={}, http_conn=conn) + self.assertEquals(len(w), 0) + + body = 'c' * 60 + c.http_connection = self.fake_http_connection(200, body=body) + args = ('http://www.test.com', 'asdf', 'asdf', 'asdf', 'asdf') + with warnings.catch_warnings(record=True) as w: + c.put_object(*args, chunk_size=20) + self.assertEquals(len(w), 1) + self.assertTrue(issubclass(w[-1].category, UserWarning)) + + def test_server_error(self): body = 'c' * 60 c.http_connection = self.fake_http_connection(500, body=body) |