Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

import codecs 

 

from uuid import uuid4 

from io import BytesIO 

 

from .packages import six 

from .packages.six import b 

from .fields import RequestField 

 

writer = codecs.lookup('utf-8')[3] 

 

 

def choose_boundary(): 

    """ 

    Our embarassingly-simple replacement for mimetools.choose_boundary. 

    """ 

    return uuid4().hex 

 

 

def iter_field_objects(fields): 

    """ 

    Iterate over fields. 

 

    Supports list of (k, v) tuples and dicts, and lists of 

    :class:`~urllib3.fields.RequestField`. 

 

    """ 

    if isinstance(fields, dict): 

        i = six.iteritems(fields) 

    else: 

        i = iter(fields) 

 

    for field in i: 

        if isinstance(field, RequestField): 

            yield field 

        else: 

            yield RequestField.from_tuples(*field) 

 

 

def iter_fields(fields): 

    """ 

    .. deprecated:: 1.6 

 

    Iterate over fields. 

 

    The addition of :class:`~urllib3.fields.RequestField` makes this function 

    obsolete. Instead, use :func:`iter_field_objects`, which returns 

    :class:`~urllib3.fields.RequestField` objects. 

 

    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, :class:`~urllib3.fields.RequestField`). 

 

    :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 field in iter_field_objects(fields): 

        body.write(b('--%s\r\n' % (boundary))) 

 

        writer(body).write(field.render_headers()) 

        data = field.data 

 

        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