Re-enable simple multipart form parsing and preview.

This commit is contained in:
Aldo Cortesi 2012-03-25 10:10:48 +13:00
parent 62e51018d0
commit 74c51df580
2 changed files with 65 additions and 26 deletions

View File

@ -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):

View File

@ -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,