test passing, UI still not working

This commit is contained in:
root 2013-12-24 14:28:20 +13:00
parent 359573a764
commit 932464d0a0
4 changed files with 99 additions and 6 deletions

View File

@ -119,7 +119,7 @@ class FlowView(common.WWrap):
def _cached_content_view(self, viewmode, hdrItems, content, limit):
return contentview.get_content_view(viewmode, hdrItems, content, limit, self.master.add_event)
def content_view(self, viewmode, conn):
def content_view(self, viewmode, conn, highlight_string = None):
full = self.state.get_flow_setting(
self.flow,
(self.state.view_flow_mode, "fullcontents"),
@ -129,7 +129,7 @@ class FlowView(common.WWrap):
limit = sys.maxint
else:
limit = contentview.VIEW_CUTOFF
return cache.callback(
description, text_object = cache.callback(
self, "_cached_content_view",
viewmode,
tuple(tuple(i) for i in conn.headers.lst),
@ -137,12 +137,20 @@ class FlowView(common.WWrap):
limit
)
def conn_text(self, conn):
if highlight_string:
text_object = self.search_highlight_text(text_object[0],
highlight_string)
text_object = [text_object]
return (description, text_object)
def conn_text(self, conn, highlight_string=""):
txt = common.format_keyvals(
[(h+":", v) for (h, v) in conn.headers.lst],
key = "header",
val = "text"
)
if conn.content is not None:
override = self.state.get_flow_setting(
self.flow,
@ -153,15 +161,16 @@ class FlowView(common.WWrap):
if conn.content == flow.CONTENT_MISSING:
msg, body = "", [urwid.Text([("error", "[content missing]")])]
else:
msg, body = self.content_view(viewmode, conn)
msg, body = self.content_view(viewmode, conn, highlight_string)
cols = [
urwid.Text(
urwid.Text(
[
("heading", msg),
]
)
]
if override is not None:
cols.append(
urwid.Text(
@ -174,11 +183,15 @@ class FlowView(common.WWrap):
align="right"
)
)
title = urwid.AttrWrap(urwid.Columns(cols), "heading")
txt.append(title)
txt.extend(body)
elif conn.content == flow.CONTENT_MISSING:
pass
print(txt)
print("\n\n\n")
return urwid.ListBox(txt)
def _tab(self, content, attr):
@ -215,6 +228,58 @@ class FlowView(common.WWrap):
)
return f
def search(self, search_string):
# two things need to happen. 1) text needs to be highlighted. 2) we
# need to focus on the highlighted text.
if self.state.view_flow_mode == common.VIEW_FLOW_REQUEST:
text = self.flow.request
const = common.VIEW_FLOW_REQUEST
else:
text = self.flow.response
const = common.VIEW_FLOW_RESPONSE
if not self.flow.response:
return "no response to search in"
# highlight
body = self.conn_text(text, search_string)
self.w = self.wrap_body(const, body)
self.master.statusbar.redraw()
def search_get_start(self, search_string):
last_search_string = self.state.get_flow_setting(self.flow, "last_search_string")
if search_string == last_search_string:
start_index = self.state.get_flow_setting(self.flow,
"last_search_index") + len(search_string)
else:
self.state.add_flow_setting(self.flow, "last_search_string",
search_string)
start_index = 0
return start_index
def search_highlight_text(self, text_object, search_string):
text, style = text_object.get_text()
start_index = self.search_get_start(search_string)
find_index = text.find(search_string, start_index)
if find_index != -1:
before = text[:find_index]
after = text[find_index+len(search_string):]
new_text = urwid.Text(
[
before,
("dark red", search_string),
after,
]
)
self.state.add_flow_setting(self.flow, "last_search_index",
find_index)
return new_text
else:
return text_object
def view_request(self):
self.state.view_flow_mode = common.VIEW_FLOW_REQUEST
body = self.conn_text(self.flow.request)
@ -574,6 +639,10 @@ class FlowView(common.WWrap):
conn
)
self.master.refresh_flow(self.flow)
elif key == "/":
self.master.prompt("Search body: ",
self.state.get_flow_setting(self.flow, "last_search_string"),
self.search)
else:
return key

View File

@ -1431,7 +1431,7 @@ class FlowMaster(controller.Master):
def run_script_hook(self, name, *args, **kwargs):
for script in self.scripts:
self.run_single_script_hook(script, name, *args, **kwargs)
def set_stickycookie(self, txt):
if txt:
flt = filt.parse(txt)

View File

@ -250,3 +250,17 @@ if cv.ViewProtobuf.is_available():
def test_get_by_shortcut():
assert cv.get_by_shortcut("h")
def test_search_highlights():
# Default text in requests is content. We will search for nt once, and
# expect the first bit to be highlighted. We will do it again and expect the
# second to be.
f = tutils.tflowview()
ui_elements = f.search("nt")
text_object = ui_elements.contents()[2]
assert text_object.get_text() == ('content', [(None, 2), ('dark red', 2)])
ui_elements = f.search("nt")
text_object = ui_elements.contents()[2]
assert text_object.get_text() == ('content', [(None, 5), ('dark red', 2)])

View File

@ -1,8 +1,11 @@
import os, shutil, tempfile
from contextlib import contextmanager
from libmproxy import flow, utils, controller
from libmproxy.console.flowview import FlowView
from libmproxy.console import ConsoleState
from netlib import certutils
from nose.plugins.skip import SkipTest
from mock import Mock
def _SkipWindows():
raise SkipTest("Skipped on Windows.")
@ -57,6 +60,13 @@ def tflow_err():
f.error = terr(f.request)
return f
def tflowview():
m = Mock()
cs = ConsoleState()
flow = tflow()
fv = FlowView(m, cs, flow)
return fv
@contextmanager
def tmpdir(*args, **kwargs):