mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-29 11:03:13 +00:00
Body Editing Fixes (#4853)
* clarify that `IS_WINDOWS` includes WSL * windows: fix file editing tornado's asnycio patch does not take nonexisting file descriptors very well, so we need to catch errors here. * body editing: better editor guessing, fix #4798
This commit is contained in:
commit
aa2ec224c7
@ -444,7 +444,10 @@ class Screen(BaseScreen, RealTerminal):
|
|||||||
self._input_thread = None
|
self._input_thread = None
|
||||||
|
|
||||||
for handle in self._current_event_loop_handles:
|
for handle in self._current_event_loop_handles:
|
||||||
event_loop.remove_watch_file(handle)
|
try:
|
||||||
|
event_loop.remove_watch_file(handle)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
if self._input_timeout:
|
if self._input_timeout:
|
||||||
event_loop.remove_alarm(self._input_timeout)
|
event_loop.remove_alarm(self._input_timeout)
|
||||||
|
@ -14,7 +14,7 @@ from mitmproxy.utils import human, emoji
|
|||||||
from mitmproxy.tcp import TCPFlow
|
from mitmproxy.tcp import TCPFlow
|
||||||
|
|
||||||
# Detect Windows Subsystem for Linux and Windows
|
# Detect Windows Subsystem for Linux and Windows
|
||||||
IS_WINDOWS = "Microsoft" in platform.platform() or "Windows" in platform.platform()
|
IS_WINDOWS_OR_WSL = "Microsoft" in platform.platform() or "Windows" in platform.platform()
|
||||||
|
|
||||||
|
|
||||||
def is_keypress(k):
|
def is_keypress(k):
|
||||||
|
@ -4,6 +4,7 @@ import mimetypes
|
|||||||
import os
|
import os
|
||||||
import os.path
|
import os.path
|
||||||
import shlex
|
import shlex
|
||||||
|
import shutil
|
||||||
import signal
|
import signal
|
||||||
import stat
|
import stat
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -24,7 +25,6 @@ from mitmproxy.addons import intercept
|
|||||||
from mitmproxy.addons import eventstore
|
from mitmproxy.addons import eventstore
|
||||||
from mitmproxy.addons import readfile
|
from mitmproxy.addons import readfile
|
||||||
from mitmproxy.addons import view
|
from mitmproxy.addons import view
|
||||||
from mitmproxy.tools.console import common
|
|
||||||
from mitmproxy.tools.console import consoleaddons
|
from mitmproxy.tools.console import consoleaddons
|
||||||
from mitmproxy.tools.console import defaultkeys
|
from mitmproxy.tools.console import defaultkeys
|
||||||
from mitmproxy.tools.console import keymap
|
from mitmproxy.tools.console import keymap
|
||||||
@ -116,13 +116,26 @@ class ConsoleMaster(master.Master):
|
|||||||
self.loop.screen_size = None
|
self.loop.screen_size = None
|
||||||
self.loop.draw_screen()
|
self.loop.draw_screen()
|
||||||
|
|
||||||
|
def get_editor(self) -> str:
|
||||||
|
# based upon https://github.com/pallets/click/blob/main/src/click/_termui_impl.py
|
||||||
|
if m := os.environ.get("MITMPROXY_EDITOR"):
|
||||||
|
return m
|
||||||
|
if m := os.environ.get("EDITOR"):
|
||||||
|
return m
|
||||||
|
for editor in "sensible-editor", "nano", "vim":
|
||||||
|
if shutil.which(editor):
|
||||||
|
return editor
|
||||||
|
if os.name == "nt":
|
||||||
|
return "notepad"
|
||||||
|
else:
|
||||||
|
return "vi"
|
||||||
|
|
||||||
def spawn_editor(self, data):
|
def spawn_editor(self, data):
|
||||||
text = not isinstance(data, bytes)
|
text = not isinstance(data, bytes)
|
||||||
fd, name = tempfile.mkstemp('', "mproxy", text=text)
|
fd, name = tempfile.mkstemp('', "mitmproxy", text=text)
|
||||||
with open(fd, "w" if text else "wb") as f:
|
with open(fd, "w" if text else "wb") as f:
|
||||||
f.write(data)
|
f.write(data)
|
||||||
# if no EDITOR is set, assume 'vi'
|
c = self.get_editor()
|
||||||
c = os.environ.get("MITMPROXY_EDITOR") or os.environ.get("EDITOR") or "vi"
|
|
||||||
cmd = shlex.split(c)
|
cmd = shlex.split(c)
|
||||||
cmd.append(name)
|
cmd.append(name)
|
||||||
with self.uistopped():
|
with self.uistopped():
|
||||||
@ -203,7 +216,7 @@ class ConsoleMaster(master.Master):
|
|||||||
["console_palette", "console_palette_transparent"]
|
["console_palette", "console_palette_transparent"]
|
||||||
)
|
)
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
if common.IS_WINDOWS:
|
if isinstance(loop, getattr(asyncio, "ProactorEventLoop", tuple())):
|
||||||
# fix for https://bugs.python.org/issue37373
|
# fix for https://bugs.python.org/issue37373
|
||||||
loop = AddThreadSelectorEventLoop(loop)
|
loop = AddThreadSelectorEventLoop(loop)
|
||||||
self.loop = urwid.MainLoop(
|
self.loop = urwid.MainLoop(
|
||||||
|
@ -324,7 +324,7 @@ class Window(urwid.Frame):
|
|||||||
class Screen(raw_display.Screen):
|
class Screen(raw_display.Screen):
|
||||||
|
|
||||||
def write(self, data):
|
def write(self, data):
|
||||||
if common.IS_WINDOWS:
|
if common.IS_WINDOWS_OR_WSL:
|
||||||
# replace urwid's SI/SO, which produce artifacts under WSL.
|
# replace urwid's SI/SO, which produce artifacts under WSL.
|
||||||
# at some point we may figure out what they actually do.
|
# at some point we may figure out what they actually do.
|
||||||
data = re.sub("[\x0e\x0f]", "", data)
|
data = re.sub("[\x0e\x0f]", "", data)
|
||||||
|
Loading…
Reference in New Issue
Block a user