From dc142682cb930cb3903a2fc66d4785bd5367360b Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Thu, 6 Nov 2014 11:25:03 +0100 Subject: fix #399 --- libmproxy/console/__init__.py | 3 ++- libmproxy/console/flowlist.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libmproxy/console/__init__.py b/libmproxy/console/__init__.py index ffd9eda8..fc6600c1 100644 --- a/libmproxy/console/__init__.py +++ b/libmproxy/console/__init__.py @@ -516,7 +516,8 @@ class ConsoleMaster(flow.FlowMaster): self.start_server_playback( ret, self.killextra, self.rheaders, - False, self.nopop + False, self.nopop, + self.options.replay_ignore_params, self.options.replay_ignore_content ) def spawn_editor(self, data): diff --git a/libmproxy/console/flowlist.py b/libmproxy/console/flowlist.py index e0330171..3eb4eb1a 100644 --- a/libmproxy/console/flowlist.py +++ b/libmproxy/console/flowlist.py @@ -120,13 +120,15 @@ class ConnectionItem(common.WWrap): self.master.start_server_playback( [i.copy() for i in self.master.state.view], self.master.killextra, self.master.rheaders, - False, self.master.nopop + False, self.master.nopop, + self.master.options.replay_ignore_params, self.master.options.replay_ignore_content ) elif k == "t": self.master.start_server_playback( [self.flow.copy()], self.master.killextra, self.master.rheaders, - False, self.master.nopop + False, self.master.nopop, + self.master.options.replay_ignore_params, self.master.options.replay_ignore_content ) else: self.master.path_prompt( -- cgit v1.2.3 From c3ec5515466fe7ba970bc7cb2578dad4c845e5bc Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Fri, 7 Nov 2014 09:52:46 +0100 Subject: fix #401 --- libmproxy/protocol/http.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/libmproxy/protocol/http.py b/libmproxy/protocol/http.py index 1472f2ca..c8974d25 100644 --- a/libmproxy/protocol/http.py +++ b/libmproxy/protocol/http.py @@ -434,11 +434,9 @@ class HTTPRequest(HTTPMessage): self.host, self.port)] - if self.content: + # If content is defined (i.e. not None or CONTENT_MISSING), we always add a content-length header. + if self.content or self.content == "": headers["Content-Length"] = [str(len(self.content))] - elif 'Transfer-Encoding' in self.headers: - # content-length for e.g. chuncked transfer-encoding with no content - headers["Content-Length"] = ["0"] return str(headers) @@ -761,11 +759,9 @@ class HTTPResponse(HTTPMessage): if not preserve_transfer_encoding: del headers['Transfer-Encoding'] - if self.content: + # If content is defined (i.e. not None or CONTENT_MISSING), we always add a content-length header. + if self.content or self.content == "": headers["Content-Length"] = [str(len(self.content))] - # add content-length for chuncked transfer-encoding with no content - elif not preserve_transfer_encoding and 'Transfer-Encoding' in self.headers: - headers["Content-Length"] = ["0"] return str(headers) -- cgit v1.2.3 From 4d090e09c7b6440176a22b541e37a0b1a0a08570 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Fri, 7 Nov 2014 09:59:11 +0100 Subject: fix tests --- test/test_protocol_http.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/test/test_protocol_http.py b/test/test_protocol_http.py index db262950..16870777 100644 --- a/test/test_protocol_http.py +++ b/test/test_protocol_http.py @@ -31,7 +31,9 @@ class TestHTTPRequest: f.request.host = f.server_conn.address.host f.request.port = f.server_conn.address.port f.request.scheme = "http" - assert f.request.assemble() == "OPTIONS * HTTP/1.1\r\nHost: address:22\r\n\r\n" + assert f.request.assemble() == ("OPTIONS * HTTP/1.1\r\n" + "Host: address:22\r\n" + "Content-Length: 0\r\n\r\n") def test_relative_form_in(self): s = StringIO("GET /foo\xff HTTP/1.1") @@ -58,7 +60,9 @@ class TestHTTPRequest: s = StringIO("CONNECT address:22 HTTP/1.1") r = HTTPRequest.from_stream(s) r.scheme, r.host, r.port = "http", "address", 22 - assert r.assemble() == "CONNECT address:22 HTTP/1.1\r\nHost: address:22\r\n\r\n" + assert r.assemble() == ("CONNECT address:22 HTTP/1.1\r\n" + "Host: address:22\r\n" + "Content-Length: 0\r\n\r\n") assert r.pretty_url(False) == "address:22" def test_absolute_form_in(self): @@ -66,7 +70,7 @@ class TestHTTPRequest: tutils.raises("Bad HTTP request line", HTTPRequest.from_stream, s) s = StringIO("GET http://address:22/ HTTP/1.1") r = HTTPRequest.from_stream(s) - assert r.assemble() == "GET http://address:22/ HTTP/1.1\r\nHost: address:22\r\n\r\n" + assert r.assemble() == "GET http://address:22/ HTTP/1.1\r\nHost: address:22\r\nContent-Length: 0\r\n\r\n" def test_http_options_relative_form_in(self): """ @@ -77,9 +81,9 @@ class TestHTTPRequest: r.host = 'address' r.port = 80 r.scheme = "http" - assert r.assemble() == ("OPTIONS " - "/secret/resource " - "HTTP/1.1\r\nHost: address\r\n\r\n") + assert r.assemble() == ("OPTIONS /secret/resource HTTP/1.1\r\n" + "Host: address\r\n" + "Content-Length: 0\r\n\r\n") def test_http_options_absolute_form_in(self): s = StringIO("OPTIONS http://address/secret/resource HTTP/1.1") @@ -87,9 +91,9 @@ class TestHTTPRequest: r.host = 'address' r.port = 80 r.scheme = "http" - assert r.assemble() == ("OPTIONS " - "http://address:80/secret/resource " - "HTTP/1.1\r\nHost: address\r\n\r\n") + assert r.assemble() == ("OPTIONS http://address:80/secret/resource HTTP/1.1\r\n" + "Host: address\r\n" + "Content-Length: 0\r\n\r\n") def test_assemble_unknown_form(self): -- cgit v1.2.3 From 6f5883a4d19caee30a89729ef5f0f4e50da8359c Mon Sep 17 00:00:00 2001 From: Lucas Cimon Date: Fri, 7 Nov 2014 17:01:58 +0100 Subject: Using uppercase C to 'clear' display mode, because lowercase 'c' is used for css --- libmproxy/console/flowview.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index b2c46147..bf0070fc 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -637,11 +637,10 @@ class FlowView(common.WWrap): return self._view_nextprev_flow("prev", flow) def change_this_display_mode(self, t): - self.state.add_flow_setting( - self.flow, - (self.state.view_flow_mode, "prettyview"), - contentview.get_by_shortcut(t) - ) + key = (self.state.view_flow_mode, "prettyview") + value = contentview.get_by_shortcut(t) + if value: + self.state.add_flow_setting(self.flow, key, value) self.master.refresh_flow(self.flow) def delete_body(self, t): @@ -749,7 +748,7 @@ class FlowView(common.WWrap): self.master.statusbar.message("") elif key == "m": p = list(contentview.view_prompts) - p.insert(0, ("clear", "c")) + p.insert(0, ("Clear", "C")) self.master.prompt_onekey( "Display mode", p, -- cgit v1.2.3 From 476d7da17c7d22415cbd16b625ba8e443a750f0f Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 10 Nov 2014 15:51:26 +0100 Subject: update change_upstream_proxy example --- examples/change_upstream_proxy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/change_upstream_proxy.py b/examples/change_upstream_proxy.py index e063ca4f..74a43bd0 100644 --- a/examples/change_upstream_proxy.py +++ b/examples/change_upstream_proxy.py @@ -1,7 +1,7 @@ -# This scripts demonstrates how mitmproxy can switch to a different upstream proxy +# This scripts demonstrates how mitmproxy can switch to a second/different upstream proxy # in upstream proxy mode. # -# Usage: mitmdump -s "change_upstream_proxy.py host" +# Usage: mitmdump -U http://default-upstream-proxy.local:8080/ -s "change_upstream_proxy.py host" from libmproxy.protocol.http import send_connect_request alternative_upstream_proxy = ("localhost", 8082) -- cgit v1.2.3 From cece3700df02144dc2bd26a55fe4d6076fd7ea22 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 10 Nov 2014 17:11:36 +0100 Subject: fix #402 --- libmproxy/flow.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libmproxy/flow.py b/libmproxy/flow.py index bd35e864..1826af3d 100644 --- a/libmproxy/flow.py +++ b/libmproxy/flow.py @@ -192,6 +192,7 @@ class ClientPlaybackState: """ if self.flows and not self.current: n = self.flows.pop(0) + n.response = None n.reply = controller.DummyReply() self.current = master.handle_request(n) if not testing and not self.current.response: @@ -615,7 +616,7 @@ class FlowMaster(controller.Master): ] if all(e): self.shutdown() - self.client_playback.tick(self, timeout) + self.client_playback.tick(self) return controller.Master.tick(self, q, timeout) -- cgit v1.2.3 From 6f3b4eee3c3e30b391be457e38fb5ac67f8ef682 Mon Sep 17 00:00:00 2001 From: Maximilian Hils Date: Mon, 10 Nov 2014 17:35:28 +0100 Subject: fix clear key --- libmproxy/console/flowview.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libmproxy/console/flowview.py b/libmproxy/console/flowview.py index bf0070fc..3dceff70 100644 --- a/libmproxy/console/flowview.py +++ b/libmproxy/console/flowview.py @@ -637,10 +637,11 @@ class FlowView(common.WWrap): return self._view_nextprev_flow("prev", flow) def change_this_display_mode(self, t): - key = (self.state.view_flow_mode, "prettyview") - value = contentview.get_by_shortcut(t) - if value: - self.state.add_flow_setting(self.flow, key, value) + self.state.add_flow_setting( + self.flow, + (self.state.view_flow_mode, "prettyview"), + contentview.get_by_shortcut(t) + ) self.master.refresh_flow(self.flow) def delete_body(self, t): -- cgit v1.2.3