1
2
3
4
5
6
7 import mimetypes
8 import os
9 import re
10 import urllib
11
12
13 from restkit.util import to_bytestring, url_quote
14
15 MIME_BOUNDARY = 'END_OF_PART'
16 CRLF = '\r\n'
17
24
25
27 - def __init__(self, name, value, fname=None, filetype=None, filesize=None):
28 self.name = url_quote(name)
29 if value is not None and not hasattr(value, 'read'):
30 value = self.encode_unreadable_value(value)
31 self.size = len(value)
32 self.value = value
33 if fname is not None:
34 if isinstance(fname, unicode):
35 fname = fname.encode("utf-8").encode("string_escape").replace('"', '\\"')
36 else:
37 fname = fname.encode("string_escape").replace('"', '\\"')
38 self.fname = fname
39 if filetype is not None:
40 filetype = to_bytestring(filetype)
41 self.filetype = filetype
42
43 if isinstance(value, file) and filesize is None:
44 try:
45 value.flush()
46 except IOError:
47 pass
48 self.size = int(os.fstat(value.fileno())[6])
49
50 self._encoded_hdr = None
51 self._encoded_bdr = None
52
54 """Returns the header of the encoding of this parameter"""
55 if not self._encoded_hdr or self._encoded_bdr != boundary:
56 boundary = url_quote(boundary)
57 self._encoded_bdr = boundary
58 headers = ["--%s" % boundary]
59 if self.fname:
60 disposition = 'form-data; name="%s"; filename="%s"' % (self.name,
61 self.fname)
62 else:
63 disposition = 'form-data; name="%s"' % self.name
64 headers.append("Content-Disposition: %s" % disposition)
65 if self.filetype:
66 filetype = self.filetype
67 else:
68 filetype = "text/plain; charset=utf-8"
69 headers.append("Content-Type: %s" % filetype)
70 headers.append("Content-Length: %i" % self.size)
71 headers.append("")
72 headers.append("")
73 self._encoded_hdr = CRLF.join(headers)
74 return self._encoded_hdr
75
77 """Returns the string encoding of this parameter"""
78 value = self.value
79 if re.search("^--%s$" % re.escape(boundary), value, re.M):
80 raise ValueError("boundary found in encoded string")
81
82 return "%s%s%s" % (self.encode_hdr(boundary), value, CRLF)
83
85 if not hasattr(self.value, "read"):
86 yield self.encode(boundary)
87 else:
88 yield self.encode_hdr(boundary)
89 while True:
90 block = self.value.read(blocksize)
91 if not block:
92 yield CRLF
93 return
94 yield block
95
98
99
141
142
150