(self, data, files, json=None)
Prepares the given HTTP body data.
Prepares the given HTTP body data.
Prepares the given HTTP body data .
def prepare_body(self, data, files, json=None):
        """Prepares the given HTTP body data."""

        # Check if file, fo, generator, iterator.
        # If not, run through normal process.

        # Nottin' on you.
        body = None
        content_type = None

        if not data and json is not None:
            # urllib3 requires a bytes-like body. Python 2's json.dumps
            # provides this natively, but Python 3 gives a Unicode string.
            content_type = 'application/json'
            body = complexjson.dumps(json)
            if not isinstance(body, bytes):
                body = body.encode('utf-8')

        is_stream = all([
            hasattr(data, '__iter__'),
            not isinstance(data, (basestring, list, tuple, Mapping))
        ])

        try:
            length = super_len(data)
        except (TypeError, AttributeError, UnsupportedOperation):
            length = None

        if is_stream:
            body = data

            if getattr(body, 'tell', None) is not None:
                # Record the current file position before reading.
                # This will allow us to rewind a file in the event
                # of a redirect.
                try:
                    self._body_position = body.tell()
                except (IOError, OSError):
                    # This differentiates from None, allowing us to catch
                    # a failed `tell()` later when trying to rewind the body
                    self._body_position = object()

            if files:
                raise NotImplementedError('Streamed bodies and files are mutually exclusive.')

            if length:
                self.headers['Content-Length'] = builtin_str(length)
            else:
                self.headers['Transfer-Encoding'] = 'chunked'
        else:
            # Multi-part file uploads.
            if files:
                (body, content_type) = self._encode_files(files, data)
            else:
                if data:
                    body = self._encode_params(data)
                    if isinstance(data, basestring) or hasattr(data, 'read'):
                        content_type = None
                    else:
                        content_type = 'application/x-www-form-urlencoded'

            self.prepare_content_length(body)

            # Add content-type if it wasn't explicitly provided.
            if content_type and ('content-type' not in self.headers):
                self.headers['Content-Type'] = content_type

        self.body = body
def prepare_body ( self , data , files , json = None ) : # Check if file, fo, generator, iterator. # If not, run through normal process. # Nottin' on you. body = None content_type = None if not data and json is not None : # urllib3 requires a bytes-like body. Python 2's json.dumps # provides this natively, but Python 3 gives a Unicode string. content_type = 'application/json' body = complexjson . dumps ( json ) if not isinstance ( body , bytes ) : body = body . encode ( 'utf-8' ) is_stream = all ( [ hasattr ( data , '__iter__' ) , not isinstance ( data , ( basestring , list , tuple , Mapping ) ) ] ) try : length = super_len ( data ) except ( TypeError , AttributeError , UnsupportedOperation ) : length = None if is_stream : body = data if getattr ( body , 'tell' , None ) is not None : # Record the current file position before reading. # This will allow us to rewind a file in the event # of a redirect. try : self . _body_position = body . tell ( ) except ( IOError , OSError ) : # This differentiates from None, allowing us to catch # a failed `tell()` later when trying to rewind the body self . _body_position = object ( ) if files : raise NotImplementedError ( 'Streamed bodies and files are mutually exclusive.' ) if length : self . headers [ 'Content-Length' ] = builtin_str ( length ) else : self . headers [ 'Transfer-Encoding' ] = 'chunked' else : # Multi-part file uploads. if files : ( body , content_type ) = self . _encode_files ( files , data ) else : if data : body = self . _encode_params ( data ) if isinstance ( data , basestring ) or hasattr ( data , 'read' ) : content_type = None else : content_type = 'application/x-www-form-urlencoded' self . prepare_content_length ( body ) # Add content-type if it wasn't explicitly provided. if content_type and ( 'content-type' not in self . headers ) : self . headers [ 'Content-Type' ] = content_type self . body = body