diff options
author | Maximilian Hils <git@maximilianhils.com> | 2019-11-15 19:04:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-15 19:04:47 +0100 |
commit | 698f7e2e177baf313e6af62ec0f79a26693e430b (patch) | |
tree | 3976db70da1c8f3bb1a38e4db6a3e5c400c6a7fe /mitmproxy/net | |
parent | a79e0a0868f68aa0decaf2a67dd563c68cad8da9 (diff) | |
parent | 580ba356adf4e11241725005eb79d47f3468e092 (diff) | |
download | mitmproxy-698f7e2e177baf313e6af62ec0f79a26693e430b.tar.gz mitmproxy-698f7e2e177baf313e6af62ec0f79a26693e430b.tar.bz2 mitmproxy-698f7e2e177baf313e6af62ec0f79a26693e430b.zip |
Merge pull request #3420 from rjt-gupta/multipart-fix
multipart-fix
Diffstat (limited to 'mitmproxy/net')
-rw-r--r-- | mitmproxy/net/http/multipart.py | 55 | ||||
-rw-r--r-- | mitmproxy/net/http/request.py | 3 |
2 files changed, 47 insertions, 11 deletions
diff --git a/mitmproxy/net/http/multipart.py b/mitmproxy/net/http/multipart.py index a854d47f..4edf76ac 100644 --- a/mitmproxy/net/http/multipart.py +++ b/mitmproxy/net/http/multipart.py @@ -1,8 +1,43 @@ import re - +import mimetypes +from urllib.parse import quote from mitmproxy.net.http import headers +def encode(head, l): + + k = head.get("content-type") + if k: + k = headers.parse_content_type(k) + if k is not None: + try: + boundary = k[2]["boundary"].encode("ascii") + boundary = quote(boundary) + except (KeyError, UnicodeError): + return b"" + hdrs = [] + for key, value in l: + file_type = mimetypes.guess_type(str(key))[0] or "text/plain; charset=utf-8" + + if key: + hdrs.append(b"--%b" % boundary.encode('utf-8')) + disposition = b'form-data; name="%b"' % key + hdrs.append(b"Content-Disposition: %b" % disposition) + hdrs.append(b"Content-Type: %b" % file_type.encode('utf-8')) + hdrs.append(b'') + hdrs.append(value) + hdrs.append(b'') + + if value is not None: + # If boundary is found in value then raise ValueError + if re.search(rb"^--%b$" % re.escape(boundary.encode('utf-8')), value): + raise ValueError(b"boundary found in encoded string") + + hdrs.append(b"--%b--\r\n" % boundary.encode('utf-8')) + temp = b"\r\n".join(hdrs) + return temp + + def decode(hdrs, content): """ Takes a multipart boundary encoded string and returns list of (key, value) tuples. @@ -19,14 +54,14 @@ def decode(hdrs, content): 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)) + if content is not None: + 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 [] diff --git a/mitmproxy/net/http/request.py b/mitmproxy/net/http/request.py index 1569ea72..ba699e2a 100644 --- a/mitmproxy/net/http/request.py +++ b/mitmproxy/net/http/request.py @@ -472,7 +472,8 @@ class Request(message.Message): return () def _set_multipart_form(self, value): - raise NotImplementedError() + self.content = mitmproxy.net.http.multipart.encode(self.headers, value) + self.headers["content-type"] = "multipart/form-data" @property def multipart_form(self): |