aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-07-23 21:39:31 +1200
committerAldo Cortesi <aldo@nullcube.com>2012-07-23 21:39:31 +1200
commit190392ea13f998fe298d48738131779f522d62e9 (patch)
treefe5db29feb06d8f50161f17acd9126a911d4d6dc
parent622a2b560753f2e4aa96bfb4e97bfcac4d0bedbd (diff)
downloadmitmproxy-190392ea13f998fe298d48738131779f522d62e9.tar.gz
mitmproxy-190392ea13f998fe298d48738131779f522d62e9.tar.bz2
mitmproxy-190392ea13f998fe298d48738131779f522d62e9.zip
Add a --nocraft option to pathod that turns off crafting.
-rw-r--r--libpathod/pathod.py63
-rwxr-xr-xpathod7
2 files changed, 38 insertions, 32 deletions
diff --git a/libpathod/pathod.py b/libpathod/pathod.py
index c95a8ed0..4d1f9e2c 100644
--- a/libpathod/pathod.py
+++ b/libpathod/pathod.py
@@ -18,6 +18,19 @@ class PathodHandler(tcp.BaseHandler):
def handle_sni(self, connection):
self.sni = connection.get_servername()
+ def serve_crafted(self, crafted, request_log):
+ response_log = crafted.serve(self.wfile, self.server.check_size)
+ self.server.add_log(
+ dict(
+ type = "crafted",
+ request=request_log,
+ response=response_log
+ )
+ )
+ if response_log["disconnect"]:
+ return False
+ return True
+
def handle_request(self):
"""
Returns True if handling should continue.
@@ -39,9 +52,18 @@ class PathodHandler(tcp.BaseHandler):
)
)
return
- method, path, httpversion = parts
+ method, path, httpversion = parts
headers = http.read_headers(self.rfile)
+ request_log = dict(
+ path = path,
+ method = method,
+ headers = headers.lst,
+ httpversion = httpversion,
+ sni = self.sni,
+ remote_address = self.client_address,
+ )
+
try:
content = http.read_http_body_request(
self.rfile, self.wfile, headers, httpversion, None
@@ -57,45 +79,23 @@ class PathodHandler(tcp.BaseHandler):
)
return
- crafted = None
for i in self.server.anchors:
if i[0].match(path):
- crafted = i[1]
+ return self.serve_crafted(i[1], request_log)
- if not crafted and path.startswith(self.server.prefix):
+ if not self.server.nocraft and path.startswith(self.server.prefix):
spec = urllib.unquote(path)[len(self.server.prefix):]
try:
crafted = rparse.parse_response(self.server.request_settings, spec)
except rparse.ParseException, v:
crafted = rparse.PathodErrorResponse(
- "Parse Error",
- "Error parsing response spec: %s\n"%v.msg + v.marked()
- )
+ "Parse Error",
+ "Error parsing response spec: %s\n"%v.msg + v.marked()
+ )
except rparse.FileAccessDenied:
crafted = rparse.PathodErrorResponse("Access Denied")
-
- request_log = dict(
- path = path,
- method = method,
- headers = headers.lst,
- sni = self.sni,
- remote_address = self.client_address,
- httpversion = httpversion,
- )
- if crafted:
- response_log = crafted.serve(self.wfile, self.server.check_size)
- self.server.add_log(
- dict(
- type = "crafted",
- request=request_log,
- response=response_log
- )
- )
- if response_log["disconnect"]:
- return False
- return True
-
- if self.server.noweb:
+ return self.serve_crafted(crafted, request_log)
+ elif self.server.noweb:
crafted = rparse.PathodErrorResponse("Access Denied")
crafted.serve(self.wfile, self.server.check_size)
return False
@@ -150,7 +150,7 @@ class Pathod(tcp.TCPServer):
LOGBUF = 500
def __init__( self,
addr, ssloptions=None, prefix="/p/", staticdir=None, anchors=None,
- sizelimit=None, noweb=False
+ sizelimit=None, noweb=False, nocraft=False
):
"""
addr: (address, port) tuple. If port is 0, a free port will be
@@ -168,6 +168,7 @@ class Pathod(tcp.TCPServer):
self.sizelimit = sizelimit
self.app = app.app
self.noweb = noweb
+ self.nocraft = nocraft
self.app.config["pathod"] = self
self.log = []
self.logid = 0
diff --git a/pathod b/pathod
index d2635ff5..0bb8da31 100755
--- a/pathod
+++ b/pathod
@@ -31,6 +31,10 @@ if __name__ == "__main__":
help='Disable web interface and API.'
)
parser.add_argument(
+ "--nocraft", dest='nocraft', default=False, action="store_true",
+ help='Disable response crafting. If anchors are specified, they still work.'
+ )
+ parser.add_argument(
"--keyfile", dest='ssl_keyfile', default=None, type=str,
help='SSL key file. If not specified, a default key is used.'
)
@@ -85,7 +89,8 @@ if __name__ == "__main__":
staticdir = args.staticdir,
anchors = alst,
sizelimit = sizelimit,
- noweb = args.noweb
+ noweb = args.noweb,
+ nocraft = args.nocraft
)
except pathod.PathodError, v:
parser.error(str(v))