diff options
| -rw-r--r-- | libpathod/cmdline.py | 11 | ||||
| -rw-r--r-- | libpathod/pathod.py | 49 | 
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 | 
