Merge branch 'master' into opts

This commit is contained in:
Aldo Cortesi 2018-02-24 16:47:58 +13:00 committed by GitHub
commit 3a766a420c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 98 additions and 28 deletions

View File

@ -1,3 +1,7 @@
23 February 2018: mitmproxy 3.0
* Fix a quote-related issue affecting the mitmproxy console command prompt
22 February 2018: mitmproxy 3.0
** Major Changes **

View File

@ -159,7 +159,11 @@ def _read_set_cookie_pairs(s: str, off=0) -> Tuple[List[TPairs], int]:
if len(rhs) <= 3:
trail, off = _read_value(s, off + 1, ";,")
rhs = rhs + "," + trail
if rhs or lhs:
# as long as there's a "=", we consider it a pair
pairs.append([lhs, rhs])
elif lhs:
pairs.append([lhs, rhs])
# comma marks the beginning of a new cookie

View File

@ -68,6 +68,21 @@ class CommandBuffer:
else:
self._cursor = x
def maybequote(self, value):
if " " in value and not value.startswith("\""):
return "\"%s\"" % value
return value
def parse_quoted(self, txt):
parts, remhelp = self.master.commands.parse_partial(txt)
for i, p in enumerate(parts):
parts[i] = mitmproxy.command.ParseResult(
value = self.maybequote(p.value),
type = p.type,
valid = p.valid
)
return parts, remhelp
def render(self):
"""
This function is somewhat tricky - in order to make the cursor
@ -75,7 +90,7 @@ class CommandBuffer:
character-for-character offset match in the rendered output, up
to the cursor. Beyond that, we can add stuff.
"""
parts, remhelp = self.master.commands.parse_partial(self.text)
parts, remhelp = self.parse_quoted(self.text)
ret = []
for p in parts:
if p.valid:
@ -95,8 +110,9 @@ class CommandBuffer:
return ret
def flatten(self, txt):
parts, _ = self.master.commands.parse_partial(txt)
return " ".join([x.value for x in parts])
parts, _ = self.parse_quoted(txt)
ret = [x.value for x in parts]
return " ".join(ret)
def left(self) -> None:
self.cursor = self.cursor - 1

View File

@ -10,6 +10,7 @@ import sys
import tempfile
import traceback
import typing # noqa
import contextlib
import urwid
@ -102,6 +103,16 @@ class ConsoleMaster(master.Master):
return callback(*args)
self.loop.set_alarm_in(seconds, cb)
@contextlib.contextmanager
def uistopped(self):
self.loop.stop()
try:
yield
finally:
self.loop.start()
self.loop.screen_size = None
self.loop.draw_screen()
def spawn_editor(self, data):
text = not isinstance(data, bytes)
fd, name = tempfile.mkstemp('', "mproxy", text=text)
@ -111,7 +122,7 @@ class ConsoleMaster(master.Master):
c = os.environ.get("EDITOR") or "vi"
cmd = shlex.split(c)
cmd.append(name)
self.ui.stop()
with self.uistopped():
try:
subprocess.call(cmd)
except:
@ -121,7 +132,6 @@ class ConsoleMaster(master.Master):
else:
with open(name, "r" if text else "rb") as f:
data = f.read()
self.ui.start()
os.unlink(name)
return data
@ -153,14 +163,13 @@ class ConsoleMaster(master.Master):
c = "less"
cmd = shlex.split(c)
cmd.append(name)
self.ui.stop()
with self.uistopped():
try:
subprocess.call(cmd, shell=shell)
except:
signals.status_message.send(
message="Can't start external viewer: %s" % " ".join(c)
)
self.ui.start()
os.unlink(name)
def set_palette(self, opts, updated):

View File

@ -75,7 +75,7 @@ setup(
"pyasn1>=0.3.1,<0.5",
"pyOpenSSL>=17.5,<17.6",
"pyparsing>=2.1.3, <2.3",
"pyperclip>=1.5.22, <1.7",
"pyperclip>=1.6.0, <1.7",
"requests>=2.9.1, <3",
"ruamel.yaml>=0.13.2, <0.16",
"sortedcontainers>=1.5.4, <1.6",

View File

@ -142,6 +142,27 @@ def test_cookie_roundtrips():
def test_parse_set_cookie_pairs():
pairs = [
[
"=",
[[
["", ""]
]]
],
[
"=;foo=bar",
[[
["", ""],
["foo", "bar"]
]]
],
[
"=;=;foo=bar",
[[
["", ""],
["", ""],
["foo", "bar"]
]]
],
[
"=uno",
[[

View File

@ -211,6 +211,22 @@ class TestCommand:
],
[]
],
[
"flow \"one two",
[
command.ParseResult(value = "flow", type = mitmproxy.types.Cmd, valid = True),
command.ParseResult(value = "\"one two", type = flow.Flow, valid = False),
],
["str"]
],
[
"flow \"one two\"",
[
command.ParseResult(value = "flow", type = mitmproxy.types.Cmd, valid = True),
command.ParseResult(value = "one two", type = flow.Flow, valid = False),
],
["str"]
],
]
with taddons.context() as tctx:
tctx.master.addons.add(TAddon())