mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2025-01-30 14:58:38 +00:00
Re-enable simple multipart form parsing and preview.
This commit is contained in:
parent
62e51018d0
commit
74c51df580
@ -1,3 +1,4 @@
|
|||||||
|
import re
|
||||||
import urwid
|
import urwid
|
||||||
import common
|
import common
|
||||||
from .. import utils, encoding, flow
|
from .. import utils, encoding, flow
|
||||||
@ -18,18 +19,21 @@ VIEW_CONTENT_PRETTY_TYPE_AUTO = 0
|
|||||||
VIEW_CONTENT_PRETTY_TYPE_JSON = 1
|
VIEW_CONTENT_PRETTY_TYPE_JSON = 1
|
||||||
VIEW_CONTENT_PRETTY_TYPE_XML = 2
|
VIEW_CONTENT_PRETTY_TYPE_XML = 2
|
||||||
VIEW_CONTENT_PRETTY_TYPE_URLENCODED = 3
|
VIEW_CONTENT_PRETTY_TYPE_URLENCODED = 3
|
||||||
|
VIEW_CONTENT_PRETTY_TYPE_MULTIPART = 4
|
||||||
|
|
||||||
CONTENT_PRETTY_NAMES = {
|
CONTENT_PRETTY_NAMES = {
|
||||||
VIEW_CONTENT_PRETTY_TYPE_JSON: "JSON",
|
VIEW_CONTENT_PRETTY_TYPE_JSON: "JSON",
|
||||||
VIEW_CONTENT_PRETTY_TYPE_XML: "XML",
|
VIEW_CONTENT_PRETTY_TYPE_XML: "XML",
|
||||||
VIEW_CONTENT_PRETTY_TYPE_URLENCODED: "URL-encoded"
|
VIEW_CONTENT_PRETTY_TYPE_URLENCODED: "URL-encoded",
|
||||||
|
VIEW_CONTENT_PRETTY_TYPE_MULTIPART: "Multipart Form"
|
||||||
}
|
}
|
||||||
|
|
||||||
CONTENT_TYPES_MAP = {
|
CONTENT_TYPES_MAP = {
|
||||||
"text/html": VIEW_CONTENT_PRETTY_TYPE_XML,
|
"text/html": VIEW_CONTENT_PRETTY_TYPE_XML,
|
||||||
"application/json": VIEW_CONTENT_PRETTY_TYPE_JSON,
|
"application/json": VIEW_CONTENT_PRETTY_TYPE_JSON,
|
||||||
"text/xml": VIEW_CONTENT_PRETTY_TYPE_XML,
|
"text/xml": VIEW_CONTENT_PRETTY_TYPE_XML,
|
||||||
"multipart/form-data": VIEW_CONTENT_PRETTY_TYPE_URLENCODED
|
"multipart/form-data": VIEW_CONTENT_PRETTY_TYPE_MULTIPART,
|
||||||
|
"application/x-www-form-urlencoded": VIEW_CONTENT_PRETTY_TYPE_URLENCODED,
|
||||||
}
|
}
|
||||||
|
|
||||||
def trailer(clen, txt):
|
def trailer(clen, txt):
|
||||||
@ -95,30 +99,38 @@ def view_json(hdrs, content):
|
|||||||
return "JSON", txt
|
return "JSON", txt
|
||||||
|
|
||||||
|
|
||||||
# FIXME
|
def view_multipart(hdrs, content):
|
||||||
def view_formdata(content, boundary):
|
v = hdrs.get("content-type")
|
||||||
rx = re.compile(r'\bname="([^"]+)"')
|
if v:
|
||||||
keys = []
|
v = utils.parse_content_type(v[0])
|
||||||
vals = []
|
if not v:
|
||||||
|
return
|
||||||
|
boundary = v[2].get("boundary")
|
||||||
|
if not boundary:
|
||||||
|
return
|
||||||
|
|
||||||
for i in content.split("--" + boundary):
|
rx = re.compile(r'\bname="([^"]+)"')
|
||||||
parts = i.splitlines()
|
keys = []
|
||||||
if len(parts) > 1 and parts[0][0:2] != "--":
|
vals = []
|
||||||
match = rx.search(parts[1])
|
|
||||||
if match:
|
for i in content.split("--" + boundary):
|
||||||
keys.append(match.group(1) + ":")
|
parts = i.splitlines()
|
||||||
vals.append(utils.cleanBin(
|
if len(parts) > 1 and parts[0][0:2] != "--":
|
||||||
"\n".join(parts[3+parts[2:].index(""):])
|
match = rx.search(parts[1])
|
||||||
))
|
if match:
|
||||||
r = [
|
keys.append(match.group(1) + ":")
|
||||||
urwid.Text(("highlight", "Form data:\n")),
|
vals.append(utils.cleanBin(
|
||||||
]
|
"\n".join(parts[3+parts[2:].index(""):])
|
||||||
r.extend(common.format_keyvals(
|
))
|
||||||
zip(keys, vals),
|
r = [
|
||||||
key = "header",
|
urwid.Text(("highlight", "Form data:\n")),
|
||||||
val = "text"
|
]
|
||||||
))
|
r.extend(common.format_keyvals(
|
||||||
return r
|
zip(keys, vals),
|
||||||
|
key = "header",
|
||||||
|
val = "text"
|
||||||
|
))
|
||||||
|
return "Multipart form", r
|
||||||
|
|
||||||
|
|
||||||
def view_urlencoded(hdrs, content):
|
def view_urlencoded(hdrs, content):
|
||||||
@ -135,7 +147,8 @@ def view_urlencoded(hdrs, content):
|
|||||||
PRETTY_FUNCTION_MAP = {
|
PRETTY_FUNCTION_MAP = {
|
||||||
VIEW_CONTENT_PRETTY_TYPE_XML: view_xmlish,
|
VIEW_CONTENT_PRETTY_TYPE_XML: view_xmlish,
|
||||||
VIEW_CONTENT_PRETTY_TYPE_JSON: view_json,
|
VIEW_CONTENT_PRETTY_TYPE_JSON: view_json,
|
||||||
VIEW_CONTENT_PRETTY_TYPE_URLENCODED: view_urlencoded
|
VIEW_CONTENT_PRETTY_TYPE_URLENCODED: view_urlencoded,
|
||||||
|
VIEW_CONTENT_PRETTY_TYPE_MULTIPART: view_multipart,
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_view_func(viewmode, pretty_type, hdrs, content):
|
def get_view_func(viewmode, pretty_type, hdrs, content):
|
||||||
|
@ -78,6 +78,32 @@ class uContentView(libpry.AutoTree):
|
|||||||
def test_view_raw(self):
|
def test_view_raw(self):
|
||||||
assert cv.view_hex([], "foo")
|
assert cv.view_hex([], "foo")
|
||||||
|
|
||||||
|
def test_view_multipart(self):
|
||||||
|
v = """
|
||||||
|
--AaB03x
|
||||||
|
Content-Disposition: form-data; name="submit-name"
|
||||||
|
|
||||||
|
Larry
|
||||||
|
--AaB03x
|
||||||
|
""".strip()
|
||||||
|
h = flow.ODictCaseless(
|
||||||
|
[("Content-Type", "multipart/form-data; boundary=AaB03x")]
|
||||||
|
)
|
||||||
|
assert cv.view_multipart(h, v)
|
||||||
|
|
||||||
|
h = flow.ODictCaseless()
|
||||||
|
assert not cv.view_multipart(h, v)
|
||||||
|
|
||||||
|
h = flow.ODictCaseless(
|
||||||
|
[("Content-Type", "multipart/form-data")]
|
||||||
|
)
|
||||||
|
assert not cv.view_multipart(h, v)
|
||||||
|
|
||||||
|
h = flow.ODictCaseless(
|
||||||
|
[("Content-Type", "unparseable")]
|
||||||
|
)
|
||||||
|
assert not cv.view_multipart(h, v)
|
||||||
|
|
||||||
def test_get_content_view(self):
|
def test_get_content_view(self):
|
||||||
r = cv.get_content_view(
|
r = cv.get_content_view(
|
||||||
cv.VIEW_CONTENT_RAW,
|
cv.VIEW_CONTENT_RAW,
|
||||||
|
Loading…
Reference in New Issue
Block a user