Path: blob/master/venv/Lib/site-packages/urllib3/filepost.py
811 views
from __future__ import absolute_import1import binascii2import codecs3import os45from io import BytesIO67from .packages import six8from .packages.six import b9from .fields import RequestField1011writer = codecs.lookup("utf-8")[3]121314def choose_boundary():15"""16Our embarrassingly-simple replacement for mimetools.choose_boundary.17"""18boundary = binascii.hexlify(os.urandom(16))19if not six.PY2:20boundary = boundary.decode("ascii")21return boundary222324def iter_field_objects(fields):25"""26Iterate over fields.2728Supports list of (k, v) tuples and dicts, and lists of29:class:`~urllib3.fields.RequestField`.3031"""32if isinstance(fields, dict):33i = six.iteritems(fields)34else:35i = iter(fields)3637for field in i:38if isinstance(field, RequestField):39yield field40else:41yield RequestField.from_tuples(*field)424344def iter_fields(fields):45"""46.. deprecated:: 1.64748Iterate over fields.4950The addition of :class:`~urllib3.fields.RequestField` makes this function51obsolete. Instead, use :func:`iter_field_objects`, which returns52:class:`~urllib3.fields.RequestField` objects.5354Supports list of (k, v) tuples and dicts.55"""56if isinstance(fields, dict):57return ((k, v) for k, v in six.iteritems(fields))5859return ((k, v) for k, v in fields)606162def encode_multipart_formdata(fields, boundary=None):63"""64Encode a dictionary of ``fields`` using the multipart/form-data MIME format.6566:param fields:67Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).6869:param boundary:70If not specified, then a random boundary will be generated using71:func:`urllib3.filepost.choose_boundary`.72"""73body = BytesIO()74if boundary is None:75boundary = choose_boundary()7677for field in iter_field_objects(fields):78body.write(b("--%s\r\n" % (boundary)))7980writer(body).write(field.render_headers())81data = field.data8283if isinstance(data, int):84data = str(data) # Backwards compatibility8586if isinstance(data, six.text_type):87writer(body).write(data)88else:89body.write(data)9091body.write(b"\r\n")9293body.write(b("--%s--\r\n" % (boundary)))9495content_type = str("multipart/form-data; boundary=%s" % boundary)9697return body.getvalue(), content_type9899100