def encode_params(self, data=None, files=None, **kwargs): """ Build the body for a multipart/form-data request. Will successfully encode files when passed as a dict or a list of tuples. Order is retained if data is a list of tuples but arbitrary if parameters are supplied as a dict. The tuples may be string (filepath), 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) or 4-tuples (filename, fileobj, contentype, custom_headers). """ if isinstance(data, basestring): raise ValueError("Data must not be a string.") # optional args boundary = kwargs.get("boundary", None) output_str = kwargs.get("output_str", self.output_str) new_fields = [] fields = to_key_val_list(data or {}) files = to_key_val_list(files or {}) for field, value in fields: ctype = None if isinstance(value, (tuple, list)) and len(value) == 2: val, ctype = value else: val = value if isinstance(val, basestring) or not hasattr(val, '__iter__'): val = [val] for v in val: # Don't call str() on bytestrings: in Py3 it all goes wrong. if not isinstance(v, bytes): v = to_string(v, lang=output_str) field = field.decode('utf-8') if isinstance(field, bytes) else field v = v.encode('utf-8') if isinstance(v, str) else v rf = RequestField(name=field, data=v) rf.make_multipart(content_type=ctype) new_fields.append(rf) for (k, v) in files: fn, fdata, ft, fh = guess_file_name_stream_type_header(v) rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) rf.make_multipart(content_type=ft) new_fields.append(rf) if boundary is None: boundary = self.boundary body, content_type = encode_multipart_formdata(new_fields, boundary=boundary) return body, content_type
def encode_params(self, data=None, **kwargs): """ Build the body for a text/plain request. Will successfully encode parameters when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. """ charset = kwargs.get("charset", self.charset) collection_format = kwargs.get("collection_format", self.collection_format) output_str = kwargs.get("output_str", self.output_str) if data is None: return b"", self.get_content_type(charset) elif isinstance(data, bytes): return data, self.get_content_type(charset) elif isinstance(data, str): return self._encode(data, charset), self.get_content_type(charset) elif hasattr(data, 'read'): return data, self.get_content_type(charset) elif collection_format == 'multi' and hasattr(data, '__iter__'): result = [] for k, vs in to_key_val_list(data): if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): vs = [vs] for v in vs: result.append(b"=".join([ self._encode(k, charset), self._encode(v, charset, output_str) ])) return b'\n'.join(result), self.get_content_type(charset) elif collection_format == 'plain' and hasattr(data, '__iter__'): results = [] for k, vs in to_key_val_dict(data).items(): results.append(b"=".join([ self._encode(k, charset), self._encode(vs, charset, output_str) ])) return b'\n'.join(results), self.get_content_type(charset) elif hasattr(data, '__iter__'): results = [] for k, vs in to_key_val_dict(data).items(): if isinstance(vs, list): v = self.COLLECTION_SEPARATORS[collection_format].join( e for e in vs) key = k + '[]' else: v = vs key = k results.append(b"=".join([ self._encode(key, charset), self._encode(v, charset, output_str) ])) return b"\n".join(results), self.get_content_type(charset) else: return str(data).encode(charset) if charset else str(data),\ self.get_content_type(charset)
def encode_params(self, data=None, **kwargs): """ Encode parameters in a piece of data. Will successfully encode parameters when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. """ collection_format = kwargs.get("collection_format", self.collection_format) output_str = kwargs.get("output_str", self.output_str) sort = kwargs.get("sort", self.sort) if data is None: return "", self.content_type elif isinstance(data, (str, bytes)): return data, self.content_type elif hasattr(data, 'read'): return data, self.content_type elif collection_format == 'multi' and hasattr(data, '__iter__'): result = [] for k, vs in to_key_val_list(data, sort=sort): if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): vs = [vs] for v in vs: result.append( (k.encode('utf-8') if isinstance(k, str) else k, v.encode('utf-8') if isinstance(v, str) else to_string(v, lang=output_str))) return urlencode(result, doseq=True), self.content_type elif collection_format == 'encoded' and hasattr(data, '__iter__'): return urlencode(data, doseq=False), self.content_type elif hasattr(data, '__iter__'): results = [] for k, vs in to_key_val_dict(data).items(): if isinstance(vs, list): v = self.COLLECTION_SEPARATORS[collection_format].join( quote_plus(e) for e in vs) key = k + '[]' else: v = quote_plus(vs) key = k results.append("%s=%s" % (key, v)) return '&'.join(results), self.content_type else: return data, self.content_type
def encode_params(self, data=None, **kwargs): """ Build the body for a text/plain request. Will successfully encode parameters when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. """ charset = kwargs.get("charset", self.charset) collection_format = kwargs.get("collection_format", self.collection_format) output_str = kwargs.get("output_str", self.output_str) if data is None: return "", self.get_content_type(charset) elif isinstance(data, (str, bytes)): return data, self.get_content_type(charset) elif hasattr(data, 'read'): return data, self.get_content_type(charset) elif collection_format == 'multi' and hasattr(data, '__iter__'): result = [] for k, vs in to_key_val_list(data): if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): vs = [vs] for v in vs: result.append(b"=".join([self._encode(k, charset), self._encode(v, charset, output_str)])) return b'\n'.join(result), self.get_content_type(charset) elif collection_format == 'plain' and hasattr(data, '__iter__'): results = [] for k, vs in to_key_val_dict(data).items(): results.append(b"=".join([self._encode(k, charset), self._encode(vs, charset, output_str)])) return b'\n'.join(results), self.get_content_type(charset) elif hasattr(data, '__iter__'): results = [] for k, vs in to_key_val_dict(data).items(): if isinstance(vs, list): v = self.COLLECTION_SEPARATORS[collection_format].join(e for e in vs) key = k + '[]' else: v = vs key = k results.append(b"=".join([self._encode(key, charset), self._encode(v, charset, output_str)])) return b"\n".join(results), self.get_content_type(charset) else: return str(data).encode(charset) if charset else str(data), self.get_content_type(charset)
def _get_11paths_serialized_headers(x_headers): """ Prepares and returns a string ready to be signed from the 11-paths specific HTTP headers received. :param x_headers: a non necessarily ordered map (array without duplicates) of the HTTP headers to be ordered. :return: string The serialized headers, an empty string if no headers are passed, or None if there's a problem such as non 11paths specific headers """ if x_headers: headers = to_key_val_list(x_headers, sort=True) serialized_headers = "" for key, value in headers: if key.lower().startswith(X_11PATHS_HEADER_PREFIX.lower()) and \ key.lower() != X_11PATHS_DATE_HEADER_NAME.lower(): serialized_headers += key.lower() + X_11PATHS_HEADER_SEPARATOR + value + " " return serialized_headers.strip() else: return ""
def _get_11paths_serialized_headers(x_headers): """ Prepares and returns a string ready to be signed from the 11-paths specific HTTP headers received. :param x_headers: a non necessarily ordered map (array without duplicates) of the HTTP headers to be ordered. :return: string The serialized headers, an empty string if no headers are passed, or None if there's a problem such as non 11paths specific headers """ if x_headers: headers = to_key_val_list(x_headers, sort=True, insensitive=True) serialized_headers = "" for key, value in headers: if key.lower().startswith(X_11PATHS_HEADER_PREFIX.lower()) and \ key.lower() != X_11PATHS_DATE_HEADER_NAME.lower(): serialized_headers += key.lower( ) + X_11PATHS_HEADER_SEPARATOR + value.replace("\n", " ") + " " return serialized_headers.strip() else: return ""
def encode_params(self, data=None, **kwargs): """ Encode parameters in a piece of data. Will successfully encode parameters when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. """ collection_format = kwargs.get("collection_format", self.collection_format) output_str = kwargs.get("output_str", self.output_str) sort = kwargs.get("sort", self.sort) if data is None: return "", self.content_type elif isinstance(data, (str, bytes)): return data, self.content_type elif hasattr(data, 'read'): return data, self.content_type elif collection_format == 'multi' and hasattr(data, '__iter__'): result = [] for k, vs in to_key_val_list(data, sort=sort): if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): vs = [vs] for v in vs: result.append( (k.encode('utf-8') if isinstance(k, str) else k, v.encode('utf-8') if isinstance(v, str) else to_string(v, lang=output_str))) return urlencode(result, doseq=True), self.content_type elif collection_format == 'encoded' and hasattr(data, '__iter__'): return urlencode(data, doseq=False), self.content_type elif hasattr(data, '__iter__'): results = [] for k, vs in to_key_val_dict(data).items(): if isinstance(vs, list): v = self.COLLECTION_SEPARATORS[collection_format].join(quote_plus(e) for e in vs) key = k + '[]' else: v = quote_plus(vs) key = k results.append("%s=%s" % (key, v)) return '&'.join(results), self.content_type else: return data, self.content_type
def test_to_key_val_list(self): test_list = {'key1': 'val1', 'key0': 'val0'} res = to_key_val_list(test_list) self.assertTrue((res == [('key1', 'val1'), ('key0', 'val0')]) or (res == [('key0', 'val0'), ('key1', 'val1')]))
def test_to_key_val_list_exception(self): try: to_key_val_list(1) self.assertTrue(False) except ValueError: pass
def test_to_key_val_list_none(self): res = to_key_val_list(None) self.assertIsNone(res)
def test_to_key_val_list_sorted_sensitive(self): test_list = {'Key1': 'val1', 'key0': 'val0'} res = to_key_val_list(test_list, sort=True, insensitive=False) self.assertEqual(res, [('Key1', 'val1'), ('key0', 'val0')])
def test_to_key_val_list_sorted(self): test_list = {'key1': 'val1', 'key0': 'val0'} res = to_key_val_list(test_list, sort=True) self.assertEqual(res, [('key0', 'val0'), ('key1', 'val1')])
def encode_params(self, data=None, files=None, **kwargs): """ Build the body for a multipart/form-data request. Will successfully encode files when passed as a dict or a list of tuples. Order is retained if data is a list of tuples but arbitrary if parameters are supplied as a dict. The tuples may be string (filepath), 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) or 4-tuples (filename, fileobj, contentype, custom_headers). """ if isinstance(data, basestring): raise ValueError("Data must not be a string.") # optional args boundary = kwargs.get("boundary", None) output_str = kwargs.get("output_str", self.output_str) new_fields = [] fields = to_key_val_list(data or {}) files = to_key_val_list(files or {}) for field, value in fields: ctype = None if isinstance(value, (tuple, list)) and len(value) == 2: val, ctype = value else: val = value if isinstance(val, basestring) or not hasattr(val, '__iter__'): val = [val] for v in val: # Don't call str() on bytestrings: in Py3 it all goes wrong. if not isinstance(v, bytes): v = to_string(v, lang=output_str) field = field.decode('utf-8') if isinstance(field, bytes) else field v = v.encode('utf-8') if isinstance(v, str) else v rf = RequestField(name=field, data=v) rf.make_multipart(content_type=ctype) new_fields.append(rf) for (k, v) in files: # support for explicit filename ft = None fh = None if isinstance(v, (tuple, list)): if len(v) == 2: fn, fp = v elif len(v) == 3: fn, fp, ft = v else: fn, fp, ft, fh = v else: fn, fp = guess_filename_stream(v) ft = guess_content_type(fn) if isinstance(fp, (str, bytes, bytearray)): fdata = fp else: fdata = fp.read() rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) rf.make_multipart(content_type=ft) new_fields.append(rf) if boundary is None: boundary = self.boundary body, content_type = encode_multipart_formdata(new_fields, boundary=boundary) return body, content_type