'Upload an object using an iterator.
If a provider supports it, chunked transfer encoding is used and you
don\'t need to know in advance the amount of data to be uploaded.
Otherwise if a provider doesn\'t support it, iterator will be exhausted
so a total size for data to be uploaded can be determined.
Note: Exhausting the iterator means that the whole data must be
buffered in memory which might result in memory exhausting when
uploading a very large object.
If a file is located on a disk you are advised to use upload_object
function which uses fs.stat function to determine the file size and it
doesn\'t need to buffer whole object in the memory.
:param iterator: An object which implements the iterator interface.
:type iterator: :class:`object`
:param container: Destination container.
:type container: :class:`Container`
:param object_name: Object name.
:type object_name: ``str``
:param extra: (optional) Extra attributes (driver specific). Note:
This dictionary must contain a \'content_type\' key which represents
a content type of the stored object.
:type extra: ``dict``
:param headers: (optional) Additional request headers,
such as CORS headers. For example:
headers = {\'Access-Control-Allow-Origin\': \'http://mozilla.com\'}
:type headers: ``dict``
:rtype: ``object``'

def upload_object_via_stream(self, iterator, container, object_name, extra=None, headers=None):

    raise NotImplementedError('upload_object_via_stream    not    implemented    for    this    driver')
