aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libpathod/cmdline.py11
-rw-r--r--libpathod/pathod.py49
2 files changed, 35 insertions, 25 deletions
diff --git a/libpathod/cmdline.py b/libpathod/cmdline.py
index d75e4330..67d5646a 100644
--- a/libpathod/cmdline.py
+++ b/libpathod/cmdline.py
@@ -322,9 +322,12 @@ def args_pathod(argv, stdout=sys.stdout, stderr=sys.stderr):
help="SSL cipher specification"
)
group.add_argument(
- "--sans", dest="sans", type=str, default="",
- help="""Comma-separated list of subject Altnernate Names to add to
- the server certificate."""
+ "--san", dest="sans", type=str, default=[], action="append",
+ metavar="SAN",
+ help="""
+ Subject Altnernate Name to add to the server certificate.
+ May be passed multiple times.
+ """
)
group.add_argument(
"--sslversion", dest="sslversion", type=int, default=4,
@@ -362,8 +365,6 @@ def args_pathod(argv, stdout=sys.stdout, stderr=sys.stderr):
)
args = parser.parse_args(argv[1:])
- args.sans = args.sans.split(",")
-
certs = []
for i in args.ssl_certs:
parts = i.split("=", 1)
diff --git a/libpathod/pathod.py b/libpathod/pathod.py
index ebf758c1..7e318ca1 100644
--- a/libpathod/pathod.py
+++ b/libpathod/pathod.py
@@ -102,6 +102,20 @@ class PathodHandler(tcp.BaseHandler):
return None, response_log
return self.handle_http_request, response_log
+ def handle_websocket(self):
+ lr = self.rfile if self.server.logreq else None
+ lw = self.wfile if self.server.logresp else None
+ with log.Log(self.logfp, self.server.hexdump, lr, lw) as lg:
+ while 1:
+ try:
+ frm = websockets.Frame.from_file(self.rfile)
+ break
+ except tcp.NetLibTimeout:
+ pass
+ print frm.human_readable()
+ return self.handle_websocket, None
+
+
def handle_http_request(self):
"""
Returns a (handler, log) tuple.
@@ -115,7 +129,7 @@ class PathodHandler(tcp.BaseHandler):
line = http.get_request_line(self.rfile)
if not line:
# Normal termination
- return None
+ return None, None
m = utils.MemBool()
if m(http.parse_init_connect(line)):
@@ -142,9 +156,8 @@ class PathodHandler(tcp.BaseHandler):
except tcp.NetLibError as v:
s = str(v)
lg(s)
- self.addlog(dict(type="error", msg=s))
- return None
- return self.handle_http_request
+ return None, dict(type="error", msg=s)
+ return self.handle_http_request, None
elif m(http.parse_init_proxy(line)):
method, _, _, _, path, httpversion = m.v
elif m(http.parse_init_http(line)):
@@ -152,15 +165,13 @@ class PathodHandler(tcp.BaseHandler):
else:
s = "Invalid first line: %s" % repr(line)
lg(s)
- self.addlog(dict(type="error", msg=s))
- return None
+ return None, dict(type="error", msg=s)
headers = http.read_headers(self.rfile)
if headers is None:
s = "Invalid headers"
lg(s)
- self.addlog(dict(type="error", msg=s))
- return None
+ return None, dict(type="error", msg=s)
clientcert = None
if self.clientcert:
@@ -197,15 +208,13 @@ class PathodHandler(tcp.BaseHandler):
except http.HttpError as s:
s = str(s)
lg(s)
- self.addlog(dict(type="error", msg=s))
- return None
+ return None, dict(type="error", msg=s)
for i in self.server.anchors:
if i[0].match(path):
lg("crafting anchor: %s" % path)
nexthandler, retlog["response"] = self.serve_crafted(i[1])
- self.addlog(retlog)
- return nexthandler
+ return nexthandler, retlog
if not self.server.nocraft and utils.matchpath(
path,
@@ -224,17 +233,15 @@ class PathodHandler(tcp.BaseHandler):
"Parse Error",
"Error parsing response spec: %s\n" % v.msg + v.marked()
)
- nexthandler, retlog["response"] = self.serve_crafted(crafted)
- self.addlog(retlog)
- return nexthandler
+ _, retlog["response"] = self.serve_crafted(crafted)
+ return self.handle_websocket, retlog
elif self.server.noweb:
crafted = language.http.make_error_response("Access Denied")
language.serve(crafted, self.wfile, self.settings)
- self.addlog(dict(
+ return None, dict(
type="error",
msg="Access denied: web interface disabled"
- ))
- return None
+ )
else:
lg("app: %s %s" % (method, path))
req = wsgi.Request("http", method, path, headers, content)
@@ -247,7 +254,7 @@ class PathodHandler(tcp.BaseHandler):
version.NAMEVERSION
)
a.serve(flow, self.wfile)
- return self.handle_http_request
+ return self.handle_http_request, None
def addlog(self, log):
# FIXME: The bytes in the log should not be escaped. We do this at the
@@ -286,7 +293,9 @@ class PathodHandler(tcp.BaseHandler):
self.settimeout(self.server.timeout)
handler = self.handle_http_request
while not self.finished:
- handler = handler()
+ handler, log = handler()
+ if log:
+ self.addlog(log)
if not handler:
return