mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2025-02-02 00:05:27 +00:00
Merge branch 'master' into opts
This commit is contained in:
commit
3a766a420c
@ -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 **
|
||||
|
@ -159,13 +159,17 @@ 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])
|
||||
|
||||
# comma marks the beginning of a new cookie
|
||||
if off < len(s) and s[off] == ",":
|
||||
cookies.append(pairs)
|
||||
pairs = []
|
||||
elif lhs:
|
||||
pairs.append([lhs, rhs])
|
||||
|
||||
# comma marks the beginning of a new cookie
|
||||
if off < len(s) and s[off] == ",":
|
||||
cookies.append(pairs)
|
||||
pairs = []
|
||||
|
||||
off += 1
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,17 +122,16 @@ class ConsoleMaster(master.Master):
|
||||
c = os.environ.get("EDITOR") or "vi"
|
||||
cmd = shlex.split(c)
|
||||
cmd.append(name)
|
||||
self.ui.stop()
|
||||
try:
|
||||
subprocess.call(cmd)
|
||||
except:
|
||||
signals.status_message.send(
|
||||
message="Can't start editor: %s" % " ".join(c)
|
||||
)
|
||||
else:
|
||||
with open(name, "r" if text else "rb") as f:
|
||||
data = f.read()
|
||||
self.ui.start()
|
||||
with self.uistopped():
|
||||
try:
|
||||
subprocess.call(cmd)
|
||||
except:
|
||||
signals.status_message.send(
|
||||
message="Can't start editor: %s" % " ".join(c)
|
||||
)
|
||||
else:
|
||||
with open(name, "r" if text else "rb") as f:
|
||||
data = f.read()
|
||||
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()
|
||||
try:
|
||||
subprocess.call(cmd, shell=shell)
|
||||
except:
|
||||
signals.status_message.send(
|
||||
message="Can't start external viewer: %s" % " ".join(c)
|
||||
)
|
||||
self.ui.start()
|
||||
with self.uistopped():
|
||||
try:
|
||||
subprocess.call(cmd, shell=shell)
|
||||
except:
|
||||
signals.status_message.send(
|
||||
message="Can't start external viewer: %s" % " ".join(c)
|
||||
)
|
||||
os.unlink(name)
|
||||
|
||||
def set_palette(self, opts, updated):
|
||||
|
2
setup.py
2
setup.py
@ -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",
|
||||
|
@ -142,6 +142,27 @@ def test_cookie_roundtrips():
|
||||
|
||||
def test_parse_set_cookie_pairs():
|
||||
pairs = [
|
||||
[
|
||||
"=",
|
||||
[[
|
||||
["", ""]
|
||||
]]
|
||||
],
|
||||
[
|
||||
"=;foo=bar",
|
||||
[[
|
||||
["", ""],
|
||||
["foo", "bar"]
|
||||
]]
|
||||
],
|
||||
[
|
||||
"=;=;foo=bar",
|
||||
[[
|
||||
["", ""],
|
||||
["", ""],
|
||||
["foo", "bar"]
|
||||
]]
|
||||
],
|
||||
[
|
||||
"=uno",
|
||||
[[
|
||||
|
@ -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())
|
||||
|
Loading…
Reference in New Issue
Block a user