improve clipboard UX

This commit is contained in:
Maximilian Hils 2015-02-06 23:32:22 +01:00
parent c871a12ea4
commit 02e0bad684
3 changed files with 86 additions and 91 deletions

View File

@ -165,87 +165,104 @@ def raw_format_flow(f, focus, extended, padding):
pile.append(urwid.Columns(resp, dividechars=1))
return urwid.Pile(pile)
## common save body parts
def save_body(path, master, state, content):
# Save file to disk
def save_data(path, data, master, state):
if not path:
return
state.last_saveload = path
path = os.path.expanduser(path)
try:
with file(path, "wb") as f:
f.write(content)
f.write(data)
except IOError, v:
master.statusbar.message(v.strerror)
def ask_save_body(k, master, state, content):
if k == "y":
master.path_prompt(
"Save message content: ",
state.last_saveload,
save_body,
master,
state,
content,
)
def which_body_save(k, master, state, flow):
if k == "q":
master.path_prompt(
"Save request content: ",
state.last_saveload,
save_body,
master,
state,
flow.request.get_decoded_content(),
)
elif k == "r":
if flow.response:
master.path_prompt(
"Save response content: ",
state.last_saveload,
save_body,
def ask_save_path(prompt, data, master, state):
master.path_prompt(
prompt,
state.last_saveload,
save_data,
data,
master,
state
)
def ask_save_body(part, master, state, flow):
"""
Save either the request or the response body to disk.
part can either be "q" (request), "s" (response) or None (ask user if necessary).
"""
request_has_content = flow.request and flow.request.content
response_has_content = flow.response and flow.response.content
if part is None:
# We first need to determine whether we want to save the request or the response content.
if request_has_content and response_has_content:
master.prompt_onekey(
"Save",
(
("request", "q"),
("response", "s"),
),
ask_save_body,
master,
state,
flow.response.get_decoded_content(),
flow
)
elif response_has_content:
ask_save_body("s", master, state, flow)
else:
master.statusbar.message("Flow has no response")
ask_save_body("q", master, state, flow)
## common copy_message parts
def copy_message( k, master, state, message):
elif part == "q" and request_has_content:
ask_save_path("Save request content: ", flow.request.get_decoded_content(), master, state)
elif part == "s" and response_has_content:
ask_save_path("Save response content: ", flow.response.get_decoded_content(), master, state)
else:
master.statusbar.message("No content to save.")
# common copy_message parts
def copy_message(k, master, state, message):
if not pyperclip:
master.statusbar.message("No clipboard support on your system, sorry.")
return None
if not message:
# only response could be None
master.statusbar.message("Flow has no response")
master.statusbar.message("Flow has no response")
return
if pyperclip:
if k == "c":
try:
pyperclip.copy(message.get_decoded_content())
except TypeError:
master.prompt_onekey(
"Cannot copy binary data to clipboard. Save as file?",
(
("yes", "y"),
("no", "n"),
),
ask_save_body,
master,
state,
message.get_decoded_content(),
)
elif k == "h":
try:
pyperclip.copy(message.headers)
except TypeError:
master.statusbar.message("Error converting headers to text")
elif k == "u":
try:
pyperclip.copy(message.url)
except TypeError:
master.statusbar.message("Error copying url to clipboard")
else:
master.statusbar.message("No clipboard support on your system, sorry.")
data = None
if k == "c":
data = message.get_decoded_content()
elif k == "h":
data = message.headers
elif k == "u":
data = message.url
if not data:
master.statusbar.message("No content to copy.")
return
try:
pyperclip.copy(data)
except TypeError:
def save(k):
if k == "y":
ask_save_path("Save data: ", data, master, state)
master.prompt_onekey(
"Cannot copy binary data to clipboard. Save as file?",
(
("yes", "y"),
("no", "n"),
),
save
)
class FlowCache:
@utils.LRUCache(200)

View File

@ -217,7 +217,7 @@ class ConnectionItem(common.WWrap):
common.copy_message,
self.master,
self.state,
self.flow.response,
self.flow.response
)
elif key == "G":
self.master.prompt_onekey(
@ -230,20 +230,10 @@ class ConnectionItem(common.WWrap):
common.copy_message,
self.master,
self.state,
self.flow.request,
self.flow.request
)
elif key == "b":
self.master.prompt_onekey(
"Save",
(
("request", "q"),
("response", "r"),
),
common.which_body_save,
self.master,
self.state,
self.flow,
)
common.ask_save_body(None, self.master, self.state, self.flow)
else:
return key

View File

@ -675,22 +675,10 @@ class FlowView(common.WWrap):
self.master.accept_all()
self.master.view_flow(self.flow)
elif key == "b":
if conn:
if self.state.view_flow_mode == common.VIEW_FLOW_REQUEST:
msg = "Save request body: "
content = self.flow.request.content
else:
msg = "Save response body: "
content = self.flow.response.content
self.master.path_prompt(
msg,
self.state.last_saveload,
common.save_body,
self.master,
self.state,
content,
)
if self.state.view_flow_mode == common.VIEW_FLOW_REQUEST:
common.ask_save_body("q", self.master, self.state, self.flow)
else:
common.ask_save_body("s", self.master, self.state, self.flow)
elif key == "d":
if self.state.flow_count() == 1:
self.master.view_flowlist()