aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@corte.si>2012-02-16 22:57:58 -0800
committerAldo Cortesi <aldo@corte.si>2012-02-16 22:57:58 -0800
commitfcc874fa183971c1985578dca66e4b4e49e17f43 (patch)
tree9d9d0fc261ba8986da7ceab3f0a1512afaa380e1 /libmproxy
parentf25156a6377b89ea34899fb61a94694361a7e511 (diff)
parenta3509b7f229eafdcbdd545e49de8ad2ac728e034 (diff)
downloadmitmproxy-fcc874fa183971c1985578dca66e4b4e49e17f43.tar.gz
mitmproxy-fcc874fa183971c1985578dca66e4b4e49e17f43.tar.bz2
mitmproxy-fcc874fa183971c1985578dca66e4b4e49e17f43.zip
Merge pull request #29 from hessu/master
Reverse proxy mode for mitmproxy
Diffstat (limited to 'libmproxy')
-rw-r--r--libmproxy/cmdline.py5
-rw-r--r--libmproxy/proxy.py15
2 files changed, 18 insertions, 2 deletions
diff --git a/libmproxy/cmdline.py b/libmproxy/cmdline.py
index 6d1ffa3d..e7ca1bcf 100644
--- a/libmproxy/cmdline.py
+++ b/libmproxy/cmdline.py
@@ -65,6 +65,11 @@ def common_options(parser):
help = "Proxy service port."
)
parser.add_option(
+ "-R",
+ action="store", dest="reverse_upstream", default=None,
+ help="Reverse proxy: upstream server host:port"
+ )
+ parser.add_option(
"-q",
action="store_true", dest="quiet",
help="Quiet."
diff --git a/libmproxy/proxy.py b/libmproxy/proxy.py
index 1fce46d6..9b22c500 100644
--- a/libmproxy/proxy.py
+++ b/libmproxy/proxy.py
@@ -22,13 +22,14 @@ class ProxyError(Exception):
class ProxyConfig:
- def __init__(self, certfile = None, ciphers = None, cacert = None, cert_wait_time=0, body_size_limit = None):
+ def __init__(self, certfile = None, ciphers = None, cacert = None, cert_wait_time=0, body_size_limit = None, reverse_upstream=None):
self.certfile = certfile
self.ciphers = ciphers
self.cacert = cacert
self.certdir = None
self.cert_wait_time = cert_wait_time
self.body_size_limit = body_size_limit
+ self.reverse_upstream = reverse_upstream
def read_chunked(fp, limit):
@@ -347,6 +348,15 @@ class ProxyHandler(SocketServer.StreamRequestHandler):
self.rfile = FileLike(self.connection)
self.wfile = FileLike(self.connection)
method, scheme, host, port, path, httpminor = parse_request_line(self.rfile.readline())
+ # If we're in reverse proxy mode, we only get the path and
+ # version in the request and need to fill up host and port
+ # from the configuration. This still assumes that the client will
+ # provide the correct Host: header and we do not need to tamper
+ # with that (or will tamper using other means).
+ if self.config.reverse_upstream:
+ scheme = 'http'
+ host, port = self.config.reverse_upstream.split(':')
+ port = int(port)
if scheme is None:
scheme = "https"
headers = flow.Headers()
@@ -488,7 +498,8 @@ def process_proxy_options(parser, options):
cacert = cacert,
ciphers = options.ciphers,
cert_wait_time = options.cert_wait_time,
- body_size_limit = body_size_limit
+ body_size_limit = body_size_limit,
+ reverse_upstream = options.reverse_upstream
)