From 7a154e1ae18f12056447ef030b2bb321cfb13111 Mon Sep 17 00:00:00 2001 From: Pedro Worcel Date: Sat, 22 Feb 2014 15:00:10 +1300 Subject: add basic backwards search --- libmproxy/console/flowview.py | 74 ++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 25 deletions(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index 6c4a2651..25871b8d 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -273,7 +273,19 @@ class FlowView(common.WWrap): return False - def search(self, search_string): + def search_again(self, backwards=False): + """ + runs the previous search again, forwards or backwards. + """ + last_search_string = self.state.get_flow_setting(self.flow, "last_search_string") + if last_search_string: + message = self.search(last_search_string, backwards) + if message: + self.master.statusbar.message(message) + else: + self.master.statusbar.message("no previous searches have been made") + + def search(self, search_string, backwards=False): """ similar to view_response or view_request, but instead of just displaying the conn, it highlights a word that the user is @@ -301,7 +313,7 @@ class FlowView(common.WWrap): # generate the body, highlight the words and get focus headers, msg, body = self.conn_text_raw(text) try: - body, focus_position = self.search_highlight_text(body, search_string) + body, focus_position = self.search_highlight_text(body, search_string, backwards=backwards) except SearchError: return "Search not supported in this view." @@ -344,7 +356,7 @@ class FlowView(common.WWrap): return (start_line, start_index) - def search_highlight_text(self, text_objects, search_string, looping = False): + def search_highlight_text(self, text_objects, search_string, looping = False, backwards = False): start_line, start_index = self.search_get_start(search_string) i = start_line @@ -352,40 +364,39 @@ class FlowView(common.WWrap): text_objects = copy.deepcopy(text_objects) for text_object in text_objects[start_line:]: if i != start_line: - start_index = 0 + start_index = None try: text, style = text_object.get_text() except AttributeError: raise SearchError() - find_index = text.find(search_string, start_index) + + if backwards == False: + find_index = text.find(search_string, start_index) + else: + if start_index != 0: + start_index -= len(search_string) + + find_index = text.rfind(search_string, 0, start_index) + + # Found text in line, do the highlight highlight. if find_index != -1: - before = text[:find_index] - after = text[find_index+len(search_string):] - new_text = urwid.Text( - [ - before, - (self.highlight_color, search_string), - after, - ] - ) + new_text = self.search_highlight_object(text, find_index, search_string) + text_objects[i] = new_text self.state.add_flow_setting(self.flow, "last_search_index", find_index) self.state.add_flow_setting(self.flow, "last_find_line", i) - text_objects[i] = new_text - found = True - break i += 1 + # handle search WRAP if found: focus_pos = i else : - # loop from the beginning, but not forever. if (start_line == 0 and start_index == 0) or looping: focus_pos = None else: @@ -395,6 +406,23 @@ class FlowView(common.WWrap): return text_objects, focus_pos + def search_highlight_object(self, text_object, find_index, search_string): + """ + just a little abstraction + """ + before = text_object[:find_index] + after = text_object[find_index+len(search_string):] + + new_text = urwid.Text( + [ + before, + (self.highlight_color, search_string), + after, + ] + ) + + return new_text + def view_request(self): self.state.view_flow_mode = common.VIEW_FLOW_REQUEST body = self.conn_text(self.flow.request) @@ -761,13 +789,9 @@ class FlowView(common.WWrap): None, self.search) elif key == "n": - last_search_string = self.state.get_flow_setting(self.flow, "last_search_string") - if last_search_string: - message = self.search(last_search_string) - if message: - self.master.statusbar.message(message) - else: - self.master.statusbar.message("no previous searches have been made") + self.search_again(backwards=False) + elif key == "N": + self.search_again(backwards=True) else: return key -- cgit v1.2.3 From 3c02865e8b5839d536bc9982e4c0e6e699fd1943 Mon Sep 17 00:00:00 2001 From: Pedro Worcel Date: Sat, 22 Feb 2014 15:32:35 +1300 Subject: add multi-line support --- libmproxy/console/flowview.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index 25871b8d..9cdd2923 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -356,13 +356,22 @@ class FlowView(common.WWrap): return (start_line, start_index) + def search_get_range(self, len_text_objects, start_line, backwards): + if not backwards: + loop_range = range(start_line, len_text_objects) + else: + loop_range = range(start_line, 0, -1) + + return loop_range + def search_highlight_text(self, text_objects, search_string, looping = False, backwards = False): start_line, start_index = self.search_get_start(search_string) i = start_line found = False text_objects = copy.deepcopy(text_objects) - for text_object in text_objects[start_line:]: + for i in self.search_get_range(len(text_objects), start_line, backwards): + text_object = text_objects[i] if i != start_line: start_index = None @@ -391,8 +400,6 @@ class FlowView(common.WWrap): found = True break - i += 1 - # handle search WRAP if found: focus_pos = i -- cgit v1.2.3 From 4284fd3614561fe5e2c53154defb3774f14c589c Mon Sep 17 00:00:00 2001 From: Pedro Worcel Date: Sat, 22 Feb 2014 16:32:22 +1300 Subject: add multi-line support to backwards search --- libmproxy/console/flowview.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index 9cdd2923..624cf95d 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -330,7 +330,7 @@ class FlowView(common.WWrap): self.last_displayed_body = list_box - if self.search_wrapped_around(last_find_line, last_search_index): + if not backwards and self.search_wrapped_around(last_find_line, last_search_index): return "search hit BOTTOM, continuing at TOP" def search_get_start(self, search_string): @@ -358,9 +358,9 @@ class FlowView(common.WWrap): def search_get_range(self, len_text_objects, start_line, backwards): if not backwards: - loop_range = range(start_line, len_text_objects) + loop_range = xrange(start_line, len_text_objects) else: - loop_range = range(start_line, 0, -1) + loop_range = xrange(start_line, -1, -1) return loop_range @@ -370,10 +370,11 @@ class FlowView(common.WWrap): found = False text_objects = copy.deepcopy(text_objects) - for i in self.search_get_range(len(text_objects), start_line, backwards): + loop_range = self.search_get_range(len(text_objects), start_line, backwards) + for i in loop_range: text_object = text_objects[i] if i != start_line: - start_index = None + start_index = 0 try: text, style = text_object.get_text() @@ -385,16 +386,18 @@ class FlowView(common.WWrap): else: if start_index != 0: start_index -= len(search_string) + else: + start_index = None find_index = text.rfind(search_string, 0, start_index) - # Found text in line, do the highlight highlight. if find_index != -1: new_text = self.search_highlight_object(text, find_index, search_string) text_objects[i] = new_text self.state.add_flow_setting(self.flow, "last_search_index", find_index) + self.state.add_flow_setting(self.flow, "last_find_line", i) found = True @@ -409,7 +412,8 @@ class FlowView(common.WWrap): else: self.state.add_flow_setting(self.flow, "last_search_index", 0) self.state.add_flow_setting(self.flow, "last_find_line", 0) - text_objects, focus_pos = self.search_highlight_text(text_objects, search_string, True) + text_objects, focus_pos = self.search_highlight_text(text_objects, + search_string, looping=True, backwards=backwards) return text_objects, focus_pos -- cgit v1.2.3 From 9fe6b8fd268c95fc1a93148c6e2f4cd4d8a5bb05 Mon Sep 17 00:00:00 2001 From: Pedro Worcel Date: Sat, 22 Feb 2014 16:36:35 +1300 Subject: add docs --- libmproxy/console/flowview.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index 624cf95d..990dc967 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -68,7 +68,8 @@ def _mkhelp(): ("space", "next flow"), ("|", "run script on this flow"), ("/", "search in response body (case sensitive)"), - ("n", "repeat previous search"), + ("n", "repeat search forward"), + ("N", "repeat search backwards"), ] text.extend(common.format_keyvals(keys, key="key", val="text", indent=4)) return text -- cgit v1.2.3 From 3e500344282a364f1fbd7245c49d980fe0bfab11 Mon Sep 17 00:00:00 2001 From: Pedro Worcel Date: Sat, 22 Feb 2014 17:15:37 +1300 Subject: fix the wrapping on backward searches --- libmproxy/console/flowview.py | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index 990dc967..8f4cb1eb 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -365,6 +365,19 @@ class FlowView(common.WWrap): return loop_range + def search_find(self, text, search_string, start_index, backwards): + if backwards == False: + find_index = text.find(search_string, start_index) + else: + if start_index != 0: + start_index -= len(search_string) + else: + start_index = None + + find_index = text.rfind(search_string, 0, start_index) + + return find_index + def search_highlight_text(self, text_objects, search_string, looping = False, backwards = False): start_line, start_index = self.search_get_start(search_string) i = start_line @@ -374,45 +387,43 @@ class FlowView(common.WWrap): loop_range = self.search_get_range(len(text_objects), start_line, backwards) for i in loop_range: text_object = text_objects[i] - if i != start_line: - start_index = 0 try: text, style = text_object.get_text() except AttributeError: raise SearchError() - if backwards == False: - find_index = text.find(search_string, start_index) - else: - if start_index != 0: - start_index -= len(search_string) - else: - start_index = None + if i != start_line: + start_index = 0 - find_index = text.rfind(search_string, 0, start_index) + find_index = self.search_find(text, search_string, start_index, backwards) if find_index != -1: new_text = self.search_highlight_object(text, find_index, search_string) text_objects[i] = new_text + found = True self.state.add_flow_setting(self.flow, "last_search_index", find_index) - self.state.add_flow_setting(self.flow, "last_find_line", i) - found = True break + # handle search WRAP if found: focus_pos = i else : - if (start_line == 0 and start_index == 0) or looping: + if looping: focus_pos = None else: - self.state.add_flow_setting(self.flow, "last_search_index", 0) - self.state.add_flow_setting(self.flow, "last_find_line", 0) + if not backwards: + self.state.add_flow_setting(self.flow, "last_search_index", 0) + self.state.add_flow_setting(self.flow, "last_find_line", 0) + else: + self.state.add_flow_setting(self.flow, "last_search_index", None) + self.state.add_flow_setting(self.flow, "last_find_line", len(text_objects) - 1) + text_objects, focus_pos = self.search_highlight_text(text_objects, search_string, looping=True, backwards=backwards) -- cgit v1.2.3 From cffae49e348a444466b46ea08cd982e099cdabc3 Mon Sep 17 00:00:00 2001 From: Pedro Worcel Date: Sat, 22 Feb 2014 18:04:56 +1300 Subject: add helpful messages on wrap --- libmproxy/console/flowview.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index 8f4cb1eb..f95f2ded 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -256,7 +256,7 @@ class FlowView(common.WWrap): ) return f - def search_wrapped_around(self, last_find_line, last_search_index): + def search_wrapped_around(self, last_find_line, last_search_index, backwards): """ returns true if search wrapped around the bottom. """ @@ -266,13 +266,22 @@ class FlowView(common.WWrap): current_search_index = self.state.get_flow_setting(self.flow, "last_search_index") - if current_find_line <= last_find_line: - return True - elif current_find_line == last_find_line: - if current_search_index <= last_search_index: - return True + if not backwards: + message = "search hit BOTTOM, continuing at TOP" + if current_find_line <= last_find_line: + return True, message + elif current_find_line == last_find_line: + if current_search_index <= last_search_index: + return True, message + else: + message = "search hit TOP, continuing at BOTTOM" + if current_find_line >= last_find_line: + return True, message + elif current_find_line == last_find_line: + if current_search_index >= last_search_index: + return True, message - return False + return False, "" def search_again(self, backwards=False): """ @@ -284,7 +293,10 @@ class FlowView(common.WWrap): if message: self.master.statusbar.message(message) else: - self.master.statusbar.message("no previous searches have been made") + message = "no previous searches have been made" + self.master.statusbar.message(message) + + return message def search(self, search_string, backwards=False): """ @@ -331,8 +343,11 @@ class FlowView(common.WWrap): self.last_displayed_body = list_box - if not backwards and self.search_wrapped_around(last_find_line, last_search_index): - return "search hit BOTTOM, continuing at TOP" + wrapped, wrapped_message = self.search_wrapped_around(last_find_line, last_search_index, backwards) + + if wrapped: + print(wrapped, wrapped_message) + return wrapped_message def search_get_start(self, search_string): start_line = 0 @@ -409,7 +424,6 @@ class FlowView(common.WWrap): break - # handle search WRAP if found: focus_pos = i -- cgit v1.2.3 From a34a4831843d5745e200c1df58672973a57aebb0 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sun, 2 Mar 2014 15:14:22 +1300 Subject: Adapt for new pathod and netlib APIs. --- libmproxy/console/flowview.py | 1 - 1 file changed, 1 deletion(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index f95f2ded..3486f57e 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -346,7 +346,6 @@ class FlowView(common.WWrap): wrapped, wrapped_message = self.search_wrapped_around(last_find_line, last_search_index, backwards) if wrapped: - print(wrapped, wrapped_message) return wrapped_message def search_get_start(self, search_string): -- cgit v1.2.3 From edac95028a9e0371c4c22069f2a2603046bc3694 Mon Sep 17 00:00:00 2001 From: Sergey Chipiga Date: Wed, 5 Mar 2014 21:00:29 +0400 Subject: remove redundant codeline --- libmproxy/console/__init__.py | 1 - 1 file changed, 1 deletion(-) (limited to 'libmproxy/console') diff --git a/libmproxy/console/__init__.py b/libmproxy/console/__init__.py index 4f298698..4a58e771 100644 --- a/libmproxy/console/__init__.py +++ b/libmproxy/console/__init__.py @@ -77,7 +77,6 @@ class PathEdit(urwid.Edit, _PathCompleter): class ActionBar(common.WWrap): def __init__(self): self.message("") - self.expire = None def selectable(self): return True -- cgit v1.2.3