aboutsummaryrefslogtreecommitdiffstats
path: root/mitmproxy
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2020-04-19 16:44:52 +0200
committerMaximilian Hils <git@maximilianhils.com>2020-04-19 16:51:16 +0200
commitca74ec3c774345bccc0e4e90fe6c231ce598663c (patch)
tree90bbd4b99c06393a256463edddc7f1333b89aa17 /mitmproxy
parent454f1779f098396b46bc8fe53a9820926a284cd4 (diff)
downloadmitmproxy-ca74ec3c774345bccc0e4e90fe6c231ce598663c.tar.gz
mitmproxy-ca74ec3c774345bccc0e4e90fe6c231ce598663c.tar.bz2
mitmproxy-ca74ec3c774345bccc0e4e90fe6c231ce598663c.zip
json contentview: minor improvements
Diffstat (limited to 'mitmproxy')
-rw-r--r--mitmproxy/contentviews/json.py62
1 files changed, 31 insertions, 31 deletions
diff --git a/mitmproxy/contentviews/json.py b/mitmproxy/contentviews/json.py
index dbe600aa..a5a7d03b 100644
--- a/mitmproxy/contentviews/json.py
+++ b/mitmproxy/contentviews/json.py
@@ -1,16 +1,39 @@
import re
import json
-from typing import Optional
+
+import typing
from mitmproxy.contentviews import base
+PARSE_ERROR = object()
+
-def pretty_json(s: bytes) -> Optional[bytes]:
+def parse_json(s: bytes) -> typing.Any:
try:
- p = json.loads(s.decode('utf-8'))
+ return json.loads(s.decode('utf-8'))
except ValueError:
- return None
- return p
+ return PARSE_ERROR
+
+
+def format_json(data: typing.Any) -> typing.Iterator[base.TViewLine]:
+ encoder = json.JSONEncoder(indent=4, sort_keys=True, ensure_ascii=False)
+ current_line: base.TViewLine = []
+ for chunk in encoder.iterencode(data):
+ if "\n" in chunk:
+ rest_of_last_line, chunk = chunk.split("\n", maxsplit=1)
+ # rest_of_last_line is a delimiter such as , or [
+ current_line.append(('text', rest_of_last_line))
+ yield current_line
+ current_line = []
+ if re.match(r'\s*"', chunk):
+ current_line.append(('json_string', chunk))
+ elif re.match(r'\s*\d', chunk):
+ current_line.append(('json_number', chunk))
+ elif re.match(r'\s*(true|null|false)', chunk):
+ current_line.append(('json_boolean', chunk))
+ else:
+ current_line.append(('text', chunk))
+ yield current_line
class ViewJSON(base.View):
@@ -21,30 +44,7 @@ class ViewJSON(base.View):
"application/vnd.api+json"
]
- @staticmethod
- def _format(pj):
- li = []
- for chunk in json.JSONEncoder(indent=4, sort_keys=True, ensure_ascii=False).iterencode(pj):
- k = re.split("\\n", chunk)
- if(len(k) > 1):
- if(len(k[0]) > 0):
- li.append(('text', k[0]))
- yield li
- li = []
- chunk = k[1]
- else:
- chunk = k[0]
- if(re.match('^\s*\".*\"$', chunk)):
- li.append(('json_string', chunk))
- elif(re.match('\s*[0-9]+[.]{0,1}[0-9]*', chunk)):
- li.append(('json_number', chunk))
- elif(re.match('\s*true|null|false', chunk)):
- li.append(('json_boolean', chunk))
- else:
- li.append(('text', chunk))
- yield li
-
def __call__(self, data, **metadata):
- pj = pretty_json(data)
- if pj is not None:
- return "JSON", self._format(pj)
+ data = parse_json(data)
+ if data is not PARSE_ERROR:
+ return "JSON", format_json(data)