aboutsummaryrefslogtreecommitdiffstats
path: root/netlib/http/multipart.py
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2016-05-31 19:07:55 +1200
committerAldo Cortesi <aldo@nullcube.com>2016-05-31 19:07:55 +1200
commitec34cae6181d6af0150ac730d70b96104a07e9d5 (patch)
tree875987f36e83f92ce9a38cd6e22326a948f29609 /netlib/http/multipart.py
parent15b2374ef9d6a8cbafdff7c79694921387836ff3 (diff)
downloadmitmproxy-ec34cae6181d6af0150ac730d70b96104a07e9d5.tar.gz
mitmproxy-ec34cae6181d6af0150ac730d70b96104a07e9d5.tar.bz2
mitmproxy-ec34cae6181d6af0150ac730d70b96104a07e9d5.zip
utils.multipartdecode -> http.multipart.decode
also utils.parse_content_type -> http.headers.parse_content_type
Diffstat (limited to 'netlib/http/multipart.py')
-rw-r--r--netlib/http/multipart.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/netlib/http/multipart.py b/netlib/http/multipart.py
new file mode 100644
index 00000000..a135eb86
--- /dev/null
+++ b/netlib/http/multipart.py
@@ -0,0 +1,32 @@
+import re
+
+from . import headers
+
+
+def decode(hdrs, content):
+ """
+ Takes a multipart boundary encoded string and returns list of (key, value) tuples.
+ """
+ v = hdrs.get("content-type")
+ if v:
+ v = headers.parse_content_type(v)
+ if not v:
+ return []
+ try:
+ boundary = v[2]["boundary"].encode("ascii")
+ except (KeyError, UnicodeError):
+ return []
+
+ rx = re.compile(br'\bname="([^"]+)"')
+ r = []
+
+ for i in content.split(b"--" + boundary):
+ parts = i.splitlines()
+ if len(parts) > 1 and parts[0][0:2] != b"--":
+ match = rx.search(parts[1])
+ if match:
+ key = match.group(1)
+ value = b"".join(parts[3 + parts[2:].index(b""):])
+ r.append((key, value))
+ return r
+ return []