mitmproxy/pathod
2012-06-24 21:10:10 +12:00

67 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python
import argparse, sys
from libpathod import pathod, utils, version
if __name__ == "__main__":
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(
"-a", dest='anchors', default=[], type=str, action="append", metavar="ANCHOR",
help='Add an anchor. Specified as a string with the form pattern=pagespec'
)
parser.add_argument(
"-d", dest='staticdir', default=None, type=str,
help='Directory for static files.'
)
parser.add_argument(
"-s", dest='ssl', default=False,
action="store_true",
help='Serve with SSL.'
)
parser.add_argument(
"--keyfile", dest='ssl_keyfile', default=None,
type=str,
help='SSL key file. If not specified, a default key is used.'
)
parser.add_argument(
"--certfile", dest='ssl_certfile', default=None,
type=str,
help='SSL cert file. If not specified, a default cert is used.'
)
args = parser.parse_args()
sl = [args.ssl_keyfile, args.ssl_certfile]
if any(sl) and not all(sl):
parser.error("Both --certfile and --keyfile must be specified.")
if args.ssl:
ssl = dict(
keyfile = args.ssl_keyfile or utils.data.path("resources/server.key"),
certfile = args.ssl_certfile or utils.data.path("resources/server.crt"),
)
else:
ssl = None
alst = []
for i in args.anchors:
parts = utils.parse_anchor_spec(i)
if not parts:
parser.error("Invalid anchor specification: %s"%i)
alst.append(parts)
try:
pd = pathod.Pathod(
(args.address, args.port),
ssloptions = ssl,
staticdir = args.staticdir,
anchors = alst
)
except pathod.PathodError, v:
parser.error(str(v))
try:
print "%s listening on port %s"%(version.NAMEVERSION, pd.port)
pd.serve_forever()
except KeyboardInterrupt:
pass