aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2013-12-08 01:05:33 -0800
committerAldo Cortesi <aldo@corte.si>2013-12-08 01:05:33 -0800
commit73791f986a4b4dabd984b7fa7891801d71ab52dc (patch)
treea589b73f03ef7cd5d52c36e84cbe2134b1972c3e
parent4816cae98cca649676216ba88ee7d9595787005a (diff)
parent65d1ed1b3c54985b4b4b0bec919de0ad7a86e342 (diff)
downloadmitmproxy-73791f986a4b4dabd984b7fa7891801d71ab52dc.tar.gz
mitmproxy-73791f986a4b4dabd984b7fa7891801d71ab52dc.tar.bz2
mitmproxy-73791f986a4b4dabd984b7fa7891801d71ab52dc.zip
Merge pull request #166 from ghjc/forward-proxy
Added -F http[s]://server:port option that allows MITM to forward traffi...
-rw-r--r--libmproxy/cmdline.py5
-rw-r--r--libmproxy/proxy.py18
2 files changed, 21 insertions, 2 deletions
diff --git a/libmproxy/cmdline.py b/libmproxy/cmdline.py
index a394d7f3..5e120ce1 100644
--- a/libmproxy/cmdline.py
+++ b/libmproxy/cmdline.py
@@ -190,6 +190,11 @@ def common_options(parser):
help="Reverse proxy to upstream server: http[s]://host[:port]"
)
parser.add_argument(
+ "-F",
+ action="store", dest="forward_proxy", default=None,
+ help="Proxy to unconditionally forward to: http[s]://host[:port]"
+ )
+ parser.add_argument(
"-q",
action="store_true", dest="quiet",
help="Quiet."
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py
index eaccf6ba..1fc289ed 100644
--- a/libmproxy/proxy.py
+++ b/libmproxy/proxy.py
@@ -23,13 +23,14 @@ class Log:
class ProxyConfig:
- def __init__(self, certfile = None, cacert = None, clientcerts = None, no_upstream_cert=False, body_size_limit = None, reverse_proxy=None, transparent_proxy=None, authenticator=None):
+ def __init__(self, certfile = None, cacert = None, clientcerts = None, no_upstream_cert=False, body_size_limit = None, reverse_proxy=None, forward_proxy=None, transparent_proxy=None, authenticator=None):
self.certfile = certfile
self.cacert = cacert
self.clientcerts = clientcerts
self.no_upstream_cert = no_upstream_cert
self.body_size_limit = body_size_limit
self.reverse_proxy = reverse_proxy
+ self.forward_proxy = forward_proxy
self.transparent_proxy = transparent_proxy
self.authenticator = authenticator
self.certstore = certutils.CertStore()
@@ -220,7 +221,12 @@ class ProxyHandler(tcp.BaseHandler):
# the case, we want to reconnect without sending an error
# to the client.
while 1:
- sc = self.get_server_connection(cc, scheme, host, port, self.sni)
+ if self.config.forward_proxy:
+ forward_scheme, forward_host, forward_port = self.config.forward_proxy
+ sc = self.get_server_connection(cc, forward_scheme, forward_host, forward_port, self.sni)
+ else:
+ sc = self.get_server_connection(cc, scheme, host, port, self.sni)
+
sc.send(request)
if sc.requestcount == 1: # add timestamps only for first request (others are not directly affected)
request.tcp_setup_timestamp = sc.tcp_setup_timestamp
@@ -592,6 +598,13 @@ def process_proxy_options(parser, options):
else:
rp = None
+ if options.forward_proxy:
+ fp = utils.parse_proxy_spec(options.forward_proxy)
+ if not fp:
+ return parser.error("Invalid forward proxy specification: %s"%options.forward_proxy)
+ else:
+ fp = None
+
if options.clientcerts:
options.clientcerts = os.path.expanduser(options.clientcerts)
if not os.path.exists(options.clientcerts) or not os.path.isdir(options.clientcerts):
@@ -621,6 +634,7 @@ def process_proxy_options(parser, options):
body_size_limit = body_size_limit,
no_upstream_cert = options.no_upstream_cert,
reverse_proxy = rp,
+ forward_proxy = fp,
transparent_proxy = trans,
authenticator = authenticator
)