From 244ef243d75145a01d9029589de65be51299b3f3 Mon Sep 17 00:00:00 2001 From: Krzysztof Bielicki Date: Tue, 10 Mar 2015 10:44:06 +0100 Subject: [#514] Add support for ignoring payload params in multipart/form-data --- libmproxy/flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 43580109..0e9e481c 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -236,7 +236,7 @@ class ServerPlaybackState: ] if not self.ignore_content: - form_contents = r.get_form_urlencoded() + form_contents = r.get_form() if self.ignore_payload_params and form_contents: key.extend( p for p in form_contents -- cgit v1.2.3 From ab7281ec0452049ff053128ba741afbd9d1cfdb3 Mon Sep 17 00:00:00 2001 From: Marcelo Glezer Date: Wed, 25 Mar 2015 17:40:25 -0300 Subject: fix #530 set client_playback to None when client_playback is done --- libmproxy/flow.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 8343c183..bdf49133 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -771,6 +771,8 @@ class FlowMaster(controller.Master): if all(e): self.shutdown() self.client_playback.tick(self) + if self.client_playback.done(): + self.client_playback = None return super(FlowMaster, self).tick(q, timeout) -- cgit v1.2.3 From 9854379046a5464f4fd638785bafca87b91a495a Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 26 Mar 2015 18:17:30 +0100 Subject: web: backup flows on edit --- libmproxy/flow.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 8343c183..9aa2a179 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -593,6 +593,10 @@ class State(object): def accept_all(self, master): self.flows.accept_all(master) + def backup(self, f): + f.backup() + self.update_flow(f) + def revert(self, f): f.revert() self.update_flow(f) -- cgit v1.2.3 From 6a24a4e3c5f6011c23a8408e83912cbd9a815664 Mon Sep 17 00:00:00 2001 From: Terry Long Date: Thu, 2 Apr 2015 22:10:01 -0700 Subject: Keep blank query values for flow hashing --- libmproxy/flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index eb8ee16a..9154a2f2 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -232,7 +232,7 @@ class ServerPlaybackState: r = flow.request _, _, path, _, query, _ = urlparse.urlparse(r.url) - queriesArray = urlparse.parse_qsl(query) + queriesArray = urlparse.parse_qsl(query, keep_blank_values=True) key = [ str(r.port), -- cgit v1.2.3 From 0d6de19b070789405ed2713b6d973b06ea7922fc Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Mon, 6 Apr 2015 17:27:46 +1200 Subject: console: sticky cookies and auth to options screen --- libmproxy/flow.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index eb8ee16a..680b6a20 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -736,7 +736,7 @@ class FlowMaster(controller.Master): ignore_payload_params: list of content params to ignore in server replay ignore_host: true if request host should be ignored in server replay """ - self.server_playback = ServerPlaybackState(headers, flows, exit, nopop, + self.server_playback = ServerPlaybackState(headers, flows, exit, nopop, ignore_params, ignore_content, ignore_payload_params, ignore_host) self.kill_nonreplay = kill @@ -786,7 +786,7 @@ class FlowMaster(controller.Master): def create_request(self, method, scheme, host, port, path): """ this method creates a new artificial and minimalist request also adds it to flowlist - """ + """ c = ClientConnection.from_state(dict( address=dict(address=(host, port), use_ipv6=False), clientcert=None @@ -802,7 +802,7 @@ class FlowMaster(controller.Master): )) f = http.HTTPFlow(c,s); headers = ODictCaseless() - + req = http.HTTPRequest("absolute", method, scheme, host, port, path, (1, 1), headers, None, None, None, None) f.request = req -- cgit v1.2.3 From bea0bd236a60e3e6c80027448e51b7802394304a Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 14 Apr 2015 11:58:10 +1200 Subject: Housekeeping and cleanups - No output to stdout on load in examples - they muck up the test suite. - Use the odict module directly, rather than aliasing it. The small convenience this gives to scripters is not worth it. - Move the cookie tests from the flow test module to the protocol_http test module. --- libmproxy/flow.py | 3 --- 1 file changed, 3 deletions(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 49c72faf..a010bb39 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -17,9 +17,6 @@ from .proxy.config import HostMatcher from .proxy.connection import ClientConnection, ServerConnection import urlparse -ODict = odict.ODict -ODictCaseless = odict.ODictCaseless - class AppRegistry: def __init__(self): -- cgit v1.2.3 From 5ff430312440d9ed95a003a2d3afc018669dfb6f Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Wed, 15 Apr 2015 10:29:57 +1200 Subject: Adjust for ODict interface change --- libmproxy/flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index a010bb39..553bfd84 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -268,7 +268,7 @@ class ServerPlaybackState: # to prevent a mismatch between unicode/non-unicode. v = [str(x) for x in v] hdrs.append((i, v)) - key.append(repr(hdrs)) + key.append(hdrs) return hashlib.sha256(repr(key)).digest() def next_flow(self, request): -- cgit v1.2.3 From 1a106f4080d89a236a193f2cb007a00aa195a1ad Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Fri, 29 May 2015 11:36:56 +1200 Subject: Ensure that flow/view state is consistent. Fixes #595 and #592 --- libmproxy/flow.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 553bfd84..4893b725 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -459,8 +459,9 @@ class FlowStore(FlowList): Notifies the state that a flow has been updated. The flow must be present in the state. """ - for view in self.views: - view._update(f) + if f in self: + for view in self.views: + view._update(f) def _remove(self, f): """ -- cgit v1.2.3 From a05a70d8168a07c92b2a3ecbbb1958d85532efe3 Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Sat, 30 May 2015 12:03:28 +1200 Subject: Add coding style check, reformat. --- libmproxy/flow.py | 96 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 68 insertions(+), 28 deletions(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 4893b725..6154e3d7 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -162,7 +162,8 @@ class StreamLargeBodies(object): r.headers, is_request, flow.request.method, code ) if not (0 <= expected_size <= self.max_size): - r.stream = r.stream or True # r.stream may already be a callable, which we want to preserve. + # r.stream may already be a callable, which we want to preserve. + r.stream = r.stream or True class ClientPlaybackState: @@ -200,8 +201,16 @@ class ClientPlaybackState: class ServerPlaybackState: - def __init__(self, headers, flows, exit, nopop, ignore_params, ignore_content, - ignore_payload_params, ignore_host): + def __init__( + self, + headers, + flows, + exit, + nopop, + ignore_params, + ignore_content, + ignore_payload_params, + ignore_host): """ headers: Case-insensitive list of request headers that should be included in request-response matching. @@ -532,7 +541,8 @@ class State(object): def flow_count(self): return len(self.flows) - # TODO: All functions regarding flows that don't cause side-effects should be moved into FlowStore. + # TODO: All functions regarding flows that don't cause side-effects should + # be moved into FlowStore. def index(self, f): return self.flows.index(f) @@ -660,7 +670,7 @@ class FlowMaster(controller.Master): """ try: s = script.Script(command, self) - except script.ScriptError, v: + except script.ScriptError as v: return v.args[0] self.scripts.append(s) @@ -724,8 +734,17 @@ class FlowMaster(controller.Master): def stop_client_playback(self): self.client_playback = None - def start_server_playback(self, flows, kill, headers, exit, nopop, ignore_params, - ignore_content, ignore_payload_params, ignore_host): + def start_server_playback( + self, + flows, + kill, + headers, + exit, + nopop, + ignore_params, + ignore_content, + ignore_payload_params, + ignore_host): """ flows: List of flows. kill: Boolean, should we kill requests not part of the replay? @@ -734,9 +753,15 @@ class FlowMaster(controller.Master): ignore_payload_params: list of content params to ignore in server replay ignore_host: true if request host should be ignored in server replay """ - self.server_playback = ServerPlaybackState(headers, flows, exit, nopop, - ignore_params, ignore_content, - ignore_payload_params, ignore_host) + self.server_playback = ServerPlaybackState( + headers, + flows, + exit, + nopop, + ignore_params, + ignore_content, + ignore_payload_params, + ignore_host) self.kill_nonreplay = kill def stop_server_playback(self): @@ -786,23 +811,36 @@ class FlowMaster(controller.Master): this method creates a new artificial and minimalist request also adds it to flowlist """ c = ClientConnection.from_state(dict( - address=dict(address=(host, port), use_ipv6=False), - clientcert=None - )) + address=dict(address=(host, port), use_ipv6=False), + clientcert=None + )) s = ServerConnection.from_state(dict( - address=dict(address=(host, port), use_ipv6=False), - state=[], - source_address=None, #source_address=dict(address=(host, port), use_ipv6=False), - cert=None, - sni=host, - ssl_established=True - )) - f = http.HTTPFlow(c,s); + address=dict(address=(host, port), use_ipv6=False), + state=[], + source_address=None, + # source_address=dict(address=(host, port), use_ipv6=False), + cert=None, + sni=host, + ssl_established=True + )) + f = http.HTTPFlow(c, s) headers = ODictCaseless() - req = http.HTTPRequest("absolute", method, scheme, host, port, path, (1, 1), headers, None, - None, None, None) + req = http.HTTPRequest( + "absolute", + method, + scheme, + host, + port, + path, + (1, + 1), + headers, + None, + None, + None, + None) f.request = req return self.load_flow(f) @@ -813,7 +851,8 @@ class FlowMaster(controller.Master): if self.server and self.server.config.mode == "reverse": f.request.host, f.request.port = self.server.config.mode.dst[2:] - f.request.scheme = "https" if self.server.config.mode.dst[1] else "http" + f.request.scheme = "https" if self.server.config.mode.dst[ + 1] else "http" f.reply = controller.DummyReply() if f.request: @@ -840,7 +879,7 @@ class FlowMaster(controller.Master): try: f = file(path, "rb") freader = FlowReader(f) - except IOError, v: + except IOError as v: raise FlowReadError(v.strerror) return self.load_flows(freader) @@ -881,7 +920,8 @@ class FlowMaster(controller.Master): f.backup() f.request.is_replay = True if f.request.content: - f.request.headers["Content-Length"] = [str(len(f.request.content))] + f.request.headers[ + "Content-Length"] = [str(len(f.request.content))] f.response = None f.error = None self.process_new_request(f) @@ -1032,7 +1072,7 @@ class FlowReader: """ off = 0 try: - while 1: + while True: data = tnetstring.load(self.fo) if tuple(data["version"][:2]) != version.IVERSION[:2]: v = ".".join(str(i) for i in data["version"]) @@ -1041,7 +1081,7 @@ class FlowReader: ) off = self.fo.tell() yield handle.protocols[data["type"]]["flow"].from_state(data) - except ValueError, v: + except ValueError as v: # Error is due to EOF if self.fo.tell() == off and self.fo.read() == '': return -- cgit v1.2.3 From 083b404bbac49307b9fab5f2d57a1f3889070786 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 8 Jun 2015 18:26:02 +0200 Subject: fix #618 --- libmproxy/flow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libmproxy/flow.py') diff --git a/libmproxy/flow.py b/libmproxy/flow.py index 6154e3d7..1a052f51 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -825,7 +825,7 @@ class FlowMaster(controller.Master): ssl_established=True )) f = http.HTTPFlow(c, s) - headers = ODictCaseless() + headers = odict.ODictCaseless() req = http.HTTPRequest( "absolute", -- cgit v1.2.3