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:
Maximilian Hils 2021-10-12 00:23:35 +02:00 committed by GitHub
commit aa2ec224c7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 8 deletions

View File

@ -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:
try:
event_loop.remove_watch_file(handle) 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)

View File

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

View File

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

View File

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