diff options
| author | Aldo Cortesi <aldo@corte.si> | 2012-02-16 22:57:58 -0800 | 
|---|---|---|
| committer | Aldo Cortesi <aldo@corte.si> | 2012-02-16 22:57:58 -0800 | 
| commit | fcc874fa183971c1985578dca66e4b4e49e17f43 (patch) | |
| tree | 9d9d0fc261ba8986da7ceab3f0a1512afaa380e1 | |
| parent | f25156a6377b89ea34899fb61a94694361a7e511 (diff) | |
| parent | a3509b7f229eafdcbdd545e49de8ad2ac728e034 (diff) | |
| download | mitmproxy-fcc874fa183971c1985578dca66e4b4e49e17f43.tar.gz mitmproxy-fcc874fa183971c1985578dca66e4b4e49e17f43.tar.bz2 mitmproxy-fcc874fa183971c1985578dca66e4b4e49e17f43.zip | |
Merge pull request #29 from hessu/master
Reverse proxy mode for mitmproxy
| -rw-r--r-- | libmproxy/cmdline.py | 5 | ||||
| -rw-r--r-- | libmproxy/proxy.py | 15 | 
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      ) | 
