Add support for image size in v2 api upload
Some backend stores e.g. RBD, will fail if told to create an image without a valid size (RBD will fail to write to a zero-size image). Here we add support to allow the image size to be provided when doing an upload. The result is that the upload content-length will be set if available either from checking the supplied file object or as provided by user. Closes-Bug: 1220197 Change-Id: Ia1f2ea5680a139750d931591949b3e0058148b4b
This commit is contained in:
@@ -280,12 +280,36 @@ class HTTPClient(object):
|
||||
kwargs.setdefault('headers', {})
|
||||
kwargs['headers'].setdefault('Content-Type',
|
||||
'application/octet-stream')
|
||||
if 'body' in kwargs:
|
||||
if (hasattr(kwargs['body'], 'read')
|
||||
and method.lower() in ('post', 'put')):
|
||||
|
||||
if 'content_length' in kwargs:
|
||||
content_length = kwargs.pop('content_length')
|
||||
else:
|
||||
content_length = None
|
||||
|
||||
if (('body' in kwargs) and (hasattr(kwargs['body'], 'read') and
|
||||
method.lower() in ('post', 'put'))):
|
||||
|
||||
# NOTE(dosaboy): only use chunked transfer if not setting a
|
||||
# content length since setting it will implicitly disable
|
||||
# chunking.
|
||||
|
||||
file_content_length = utils.get_file_size(kwargs['body'])
|
||||
if content_length is None:
|
||||
content_length = file_content_length
|
||||
elif (file_content_length and
|
||||
(content_length != file_content_length)):
|
||||
errmsg = ("supplied content-length (%s) does not match "
|
||||
"length of supplied data (%s)" %
|
||||
(content_length, file_content_length))
|
||||
raise AttributeError(errmsg)
|
||||
|
||||
if content_length is None:
|
||||
# We use 'Transfer-Encoding: chunked' because
|
||||
# body size may not always be known in advance.
|
||||
kwargs['headers']['Transfer-Encoding'] = 'chunked'
|
||||
else:
|
||||
kwargs['headers']['Content-Length'] = str(content_length)
|
||||
|
||||
return self._http_request(url, method, **kwargs)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user