| Index: third_party/requests/packages/urllib3/filepost.py
|
| diff --git a/third_party/requests/packages/urllib3/filepost.py b/third_party/requests/packages/urllib3/filepost.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..470309a0066e6ace43d0730fe4a76e7d67a4c538
|
| --- /dev/null
|
| +++ b/third_party/requests/packages/urllib3/filepost.py
|
| @@ -0,0 +1,98 @@
|
| +# urllib3/filepost.py
|
| +# Copyright 2008-2012 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
|
| +#
|
| +# This module is part of urllib3 and is released under
|
| +# the MIT License: http://www.opensource.org/licenses/mit-license.php
|
| +
|
| +import codecs
|
| +import mimetypes
|
| +
|
| +from uuid import uuid4
|
| +from io import BytesIO
|
| +
|
| +from .packages import six
|
| +from .packages.six import b
|
| +
|
| +writer = codecs.lookup('utf-8')[3]
|
| +
|
| +
|
| +def choose_boundary():
|
| + """
|
| + Our embarassingly-simple replacement for mimetools.choose_boundary.
|
| + """
|
| + return uuid4().hex
|
| +
|
| +
|
| +def get_content_type(filename):
|
| + return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
|
| +
|
| +
|
| +def iter_fields(fields):
|
| + """
|
| + Iterate over fields.
|
| +
|
| + Supports list of (k, v) tuples and dicts.
|
| + """
|
| + if isinstance(fields, dict):
|
| + return ((k, v) for k, v in six.iteritems(fields))
|
| +
|
| + return ((k, v) for k, v in fields)
|
| +
|
| +
|
| +def encode_multipart_formdata(fields, boundary=None):
|
| + """
|
| + Encode a dictionary of ``fields`` using the multipart/form-data MIME format.
|
| +
|
| + :param fields:
|
| + Dictionary of fields or list of (key, value) or (key, value, MIME type)
|
| + field tuples. The key is treated as the field name, and the value as
|
| + the body of the form-data bytes. If the value is a tuple of two
|
| + elements, then the first element is treated as the filename of the
|
| + form-data section and a suitable MIME type is guessed based on the
|
| + filename. If the value is a tuple of three elements, then the third
|
| + element is treated as an explicit MIME type of the form-data section.
|
| +
|
| + Field names and filenames must be unicode.
|
| +
|
| + :param boundary:
|
| + If not specified, then a random boundary will be generated using
|
| + :func:`mimetools.choose_boundary`.
|
| + """
|
| + body = BytesIO()
|
| + if boundary is None:
|
| + boundary = choose_boundary()
|
| +
|
| + for fieldname, value in iter_fields(fields):
|
| + body.write(b('--%s\r\n' % (boundary)))
|
| +
|
| + if isinstance(value, tuple):
|
| + if len(value) == 3:
|
| + filename, data, content_type = value
|
| + else:
|
| + filename, data = value
|
| + content_type = get_content_type(filename)
|
| + writer(body).write('Content-Disposition: form-data; name="%s"; '
|
| + 'filename="%s"\r\n' % (fieldname, filename))
|
| + body.write(b('Content-Type: %s\r\n\r\n' %
|
| + (content_type,)))
|
| + else:
|
| + data = value
|
| + writer(body).write('Content-Disposition: form-data; name="%s"\r\n'
|
| + % (fieldname))
|
| + body.write(b'\r\n')
|
| +
|
| + if isinstance(data, int):
|
| + data = str(data) # Backwards compatibility
|
| +
|
| + if isinstance(data, six.text_type):
|
| + writer(body).write(data)
|
| + else:
|
| + body.write(data)
|
| +
|
| + body.write(b'\r\n')
|
| +
|
| + body.write(b('--%s--\r\n' % (boundary)))
|
| +
|
| + content_type = str('multipart/form-data; boundary=%s' % boundary)
|
| +
|
| + return body.getvalue(), content_type
|
|
|