aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAldo Cortesi <aldo@nullcube.com>2012-06-24 21:10:10 +1200
committerAldo Cortesi <aldo@nullcube.com>2012-06-24 21:10:10 +1200
commit90c6fb394de8b56c55aee3db7c7ea6ff72903456 (patch)
tree5985fc18ad5b384c6bc55af831c037fdc18ec187
parent8bec99f858deb8aaf35b6502355e3e00a98ffed7 (diff)
downloadmitmproxy-90c6fb394de8b56c55aee3db7c7ea6ff72903456.tar.gz
mitmproxy-90c6fb394de8b56c55aee3db7c7ea6ff72903456.tar.bz2
mitmproxy-90c6fb394de8b56c55aee3db7c7ea6ff72903456.zip
Sketch out pathoc commandline interaction.
-rw-r--r--libpathod/pathoc.py22
-rwxr-xr-xpathoc25
-rwxr-xr-xpathod2
-rw-r--r--test/test_rparse.py1
4 files changed, 48 insertions, 2 deletions
diff --git a/libpathod/pathoc.py b/libpathod/pathoc.py
new file mode 100644
index 00000000..5ad1bd26
--- /dev/null
+++ b/libpathod/pathoc.py
@@ -0,0 +1,22 @@
+from netlib import tcp, http
+import rparse
+
+
+class PathocError(Exception): pass
+
+
+class Pathoc(tcp.TCPClient):
+ def __init__(self, ssl, host, port, clientcert):
+ try:
+ tcp.TCPClient.__init__(self, ssl, host, port, clientcert)
+ except tcp.NetLibError, v:
+ raise PathocError(v)
+
+ def request(self, spec):
+ r = rparse.parse_request({}, spec)
+ r.serve(self.wfile)
+ self.wfile.flush()
+
+ line = self.rfile.readline()
+ print line
+
diff --git a/pathoc b/pathoc
new file mode 100755
index 00000000..12edc34a
--- /dev/null
+++ b/pathoc
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+import argparse, sys
+from libpathod import pathoc, version
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description='A perverse HTTP client.')
+ parser.add_argument('--port', type=int, default=None, help="Port. Defaults to 80, or 443 if SSL is active.")
+ parser.add_argument('--ssl', action="store_true", default=False, help="Connect with SSL.")
+ parser.add_argument('host', type=str, help='Host to connect to')
+ parser.add_argument('request', type=str, nargs="+", help='Request specification')
+
+ args = parser.parse_args()
+
+ if args.port is None:
+ port = 443 if args.ssl else 80
+ else:
+ port = args.port
+
+ try:
+ p = pathoc.Pathoc(args.ssl, args.host, port, None)
+ for i in args.request:
+ p.request(i)
+ except pathoc.PathocError, v:
+ print >> sys.stderr, str(v)
+ sys.exit(1)
diff --git a/pathod b/pathod
index 3c8cc08d..b4ee7eb3 100755
--- a/pathod
+++ b/pathod
@@ -3,7 +3,7 @@ import argparse, sys
from libpathod import pathod, utils, version
if __name__ == "__main__":
- parser = argparse.ArgumentParser(description='Process some integers.')
+ parser = argparse.ArgumentParser(description='A pathological HTTP/S daemon.')
parser.add_argument("-p", dest='port', default=9999, type=int, help='Port. Specify 0 to pick an arbitrary empty port.')
parser.add_argument("-l", dest='address', default="0.0.0.0", type=str, help='Listening address.')
parser.add_argument(
diff --git a/test/test_rparse.py b/test/test_rparse.py
index a25bbc74..9f330f51 100644
--- a/test/test_rparse.py
+++ b/test/test_rparse.py
@@ -211,7 +211,6 @@ class TestParseRequest:
assert str(r)
-
class TestParseResponse:
def test_parse_err(self):
tutils.raises(rparse.ParseException, rparse.parse_response, {}, "400:msg,b:")