aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoriroiro123 <user1@cygwin>2015-06-18 23:53:27 +0900
committeriroiro123 <user1@cygwin>2015-06-18 23:53:27 +0900
commit59ec291b6cff1dfa83b316401418b6308df93aac (patch)
tree23a7b348104f17366518f28bc6bea71b97864912
parente9fecbf83077ec18b764b2b4c0065698a023f762 (diff)
downloadmitmproxy-59ec291b6cff1dfa83b316401418b6308df93aac.tar.gz
mitmproxy-59ec291b6cff1dfa83b316401418b6308df93aac.tar.bz2
mitmproxy-59ec291b6cff1dfa83b316401418b6308df93aac.zip
HTTP Transparent Proxy
-rw-r--r--libmproxy/cmdline.py5
-rw-r--r--libmproxy/protocol/http.py15
-rw-r--r--libmproxy/proxy/config.py7
-rw-r--r--libmproxy/proxy/primitives.py8
4 files changed, 33 insertions, 2 deletions
diff --git a/libmproxy/cmdline.py b/libmproxy/cmdline.py
index eb24bed7..d0e54dfe 100644
--- a/libmproxy/cmdline.py
+++ b/libmproxy/cmdline.py
@@ -363,6 +363,11 @@ def common_options(parser):
help="Set transparent proxy mode."
)
group.add_argument(
+ "-H", "--http-transparent",
+ action="store_true", dest="http_transparent_proxy", default=False,
+ help="Use the Host header to connect to server."
+ )
+ group.add_argument(
"-U", "--upstream",
action="store",
type=parse_server_spec,
diff --git a/libmproxy/protocol/http.py b/libmproxy/protocol/http.py
index 9c143386..c7479b76 100644
--- a/libmproxy/protocol/http.py
+++ b/libmproxy/protocol/http.py
@@ -1328,7 +1328,20 @@ class HTTPHandler(ProtocolHandler):
# value at flow.server_conn
self.c.set_server_address((request.host, request.port))
flow.server_conn = self.c.server_conn
-
+
+ elif request.form_in == "relative":
+ if self.c.config.mode == "httptransparent":
+ h = request.headers.get_first("host")
+ if h is None:
+ raise http.HttpError(
+ 400,
+ "Invalid request: No Host header"
+ )
+ p = http.parse_url("http://" + h)
+ request.host, request.port = p[1], p[2]
+ self.c.set_server_address((request.host, request.port))
+ flow.server_conn = self.c.server_conn
+
return None
raise http.HttpError(
400, "Invalid HTTP request form (expected: %s, got: %s)" % (
diff --git a/libmproxy/proxy/config.py b/libmproxy/proxy/config.py
index 3f579669..2074d0bf 100644
--- a/libmproxy/proxy/config.py
+++ b/libmproxy/proxy/config.py
@@ -4,7 +4,7 @@ import re
from OpenSSL import SSL
from netlib import http_auth, certutils, tcp
from .. import utils, platform, version
-from .primitives import RegularProxyMode, TransparentProxyMode, UpstreamProxyMode, ReverseProxyMode, Socks5ProxyMode
+from .primitives import RegularProxyMode, HTTPTransparentProxyMode, TransparentProxyMode, UpstreamProxyMode, ReverseProxyMode, Socks5ProxyMode
TRANSPARENT_SSL_PORTS = [443, 8443]
CONF_BASENAME = "mitmproxy"
@@ -70,6 +70,8 @@ class ProxyConfig:
self.mode = ReverseProxyMode(upstream_server)
elif mode == "upstream":
self.mode = UpstreamProxyMode(upstream_server)
+ elif mode == "httptransparent":
+ self.mode = HTTPTransparentProxyMode()
else:
self.mode = RegularProxyMode()
@@ -144,6 +146,9 @@ def process_proxy_options(parser, options):
c += 1
mode = "upstream"
upstream_server = options.upstream_proxy
+ if options.http_transparent_proxy:
+ c += 1
+ mode = "httptransparent"
if c > 1:
return parser.error(
"Transparent, SOCKS5, reverse and upstream proxy mode "
diff --git a/libmproxy/proxy/primitives.py b/libmproxy/proxy/primitives.py
index 9e7dae9a..a9718051 100644
--- a/libmproxy/proxy/primitives.py
+++ b/libmproxy/proxy/primitives.py
@@ -51,6 +51,14 @@ class RegularProxyMode(ProxyMode):
return None
+class HTTPTransparentProxyMode(ProxyMode):
+ http_form_in = "relative"
+ http_form_out = "relative"
+
+ def get_upstream_server(self, client_conn):
+ return None
+
+
class TransparentProxyMode(ProxyMode):
http_form_in = "relative"
http_form_out = "relative"