diff options
author | Maximilian Hils <git@maximilianhils.com> | 2015-08-31 00:14:42 +0200 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2015-08-31 00:14:42 +0200 |
commit | 1e9aef5b1e3e1d60a2bb94d47be03b780c10a497 (patch) | |
tree | 5ae39e8fcc183af470e25a77d10ca0bf7d0d349d /examples | |
parent | 63ad4a4f5117d34ba6e9692eef1fc88f68b19c3d (diff) | |
download | mitmproxy-1e9aef5b1e3e1d60a2bb94d47be03b780c10a497.tar.gz mitmproxy-1e9aef5b1e3e1d60a2bb94d47be03b780c10a497.tar.bz2 mitmproxy-1e9aef5b1e3e1d60a2bb94d47be03b780c10a497.zip |
fix upstream proxy server change, update example
Diffstat (limited to 'examples')
-rw-r--r-- | examples/change_upstream_proxy.py | 47 |
1 files changed, 26 insertions, 21 deletions
diff --git a/examples/change_upstream_proxy.py b/examples/change_upstream_proxy.py index 7782dd84..8f58e1f2 100644 --- a/examples/change_upstream_proxy.py +++ b/examples/change_upstream_proxy.py @@ -1,29 +1,34 @@ # This scripts demonstrates how mitmproxy can switch to a second/different upstream proxy # in upstream proxy mode. # -# 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) +# Usage: mitmdump -U http://default-upstream-proxy.local:8080/ -s change_upstream_proxy.py +# +# If you want to change the target server, you should modify flow.request.host and flow.request.port +# flow.live.set_server should only be used by inline scripts to change the upstream proxy. -def should_redirect(flow): - return flow.request.host == "example.com" +def proxy_address(flow): + # Poor man's loadbalancing: route every second domain through the alternative proxy. + if hash(flow.request.host) % 2 == 1: + return ("localhost", 8082) + else: + return ("localhost", 8081) def request(context, flow): - if flow.live and should_redirect(flow): - - # If you want to change the target server, you should modify flow.request.host and flow.request.port - # flow.live.change_server should only be used by inline scripts to change the upstream proxy, - # unless you are sure that you know what you are doing. - server_changed = flow.live.change_server( - alternative_upstream_proxy, - persistent_change=True) - if flow.request.scheme == "https" and server_changed: - send_connect_request( - flow.live.c.server_conn, - flow.request.host, - flow.request.port) - flow.live.c.establish_ssl(server=True) + if flow.request.method == "CONNECT": + # If the decision is done by domain, one could also modify the server address here. + # We do it after CONNECT here to have the request data available as well. + return + address = proxy_address(flow) + if flow.live: + if flow.request.scheme == "http": + # For a normal HTTP request, we just change the proxy server and we're done! + if address != flow.live.server_conn.address: + flow.live.set_server(address, depth=1) + else: + # If we have CONNECTed (and thereby established "destination state"), the story is + # a bit more complex. Now we don't want to change the top level address (which is + # the connect destination) but the address below that. (Notice the `.via` and depth=2). + if address != flow.live.server_conn.via.address: + flow.live.set_server(address, depth=2) |