You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.3 KiB
74 lines
2.3 KiB
# 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
|
|
|
|
try:
|
|
from mimetools import choose_boundary
|
|
except ImportError:
|
|
from .packages.mimetools_choose_boundary import choose_boundary
|
|
|
|
from io import BytesIO
|
|
|
|
from .packages import six
|
|
from .packages.six import b
|
|
|
|
writer = codecs.lookup('utf-8')[3]
|
|
|
|
|
|
def get_content_type(filename):
|
|
return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
|
|
|
|
|
|
def encode_multipart_formdata(fields, boundary=None):
|
|
"""
|
|
Encode a dictionary of ``fields`` using the multipart/form-data mime format.
|
|
|
|
:param fields:
|
|
Dictionary of fields. The key is treated as the field name, and the
|
|
value as the body of the form-data. If the value is a tuple of two
|
|
elements, then the first element is treated as the filename of the
|
|
form-data section.
|
|
|
|
: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 six.iteritems(fields):
|
|
body.write(b('--%s\r\n' % (boundary)))
|
|
|
|
if isinstance(value, tuple):
|
|
filename, data = value
|
|
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' %
|
|
(get_content_type(filename))))
|
|
else:
|
|
data = value
|
|
writer(body).write('Content-Disposition: form-data; name="%s"\r\n'
|
|
% (fieldname))
|
|
body.write(b'Content-Type: text/plain\r\n\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 = b('multipart/form-data; boundary=%s' % boundary)
|
|
|
|
return body.getvalue(), content_type
|
|
|