python: Support PDM in ashd-wsgi.
[ashd.git] / python3 / ashd-wsgi3
index da60cfa..0e562ec 100755 (executable)
@@ -1,14 +1,18 @@
 #!/usr/bin/python3
 
 import sys, os, getopt, threading, time, locale, collections
-import ashd.proto, ashd.util
+import ashd.proto, ashd.util, ashd.perf
+try:
+    import pdm.srv
+except:
+    pdm = None
 
 def usage(out):
-    out.write("usage: ashd-wsgi3 [-hA] [-p MODPATH] [-l REQLIMIT] HANDLER-MODULE [ARGS...]\n")
+    out.write("usage: ashd-wsgi3 [-hA] [-m PDM-SPEC] [-p MODPATH] [-l REQLIMIT] HANDLER-MODULE [ARGS...]\n")
 
 reqlimit = 0
 modwsgi_compat = False
-opts, args = getopt.getopt(sys.argv[1:], "+hAp:l:")
+opts, args = getopt.getopt(sys.argv[1:], "+hAp:l:m:")
 for o, a in opts:
     if o == "-h":
         usage(sys.stdout)
@@ -19,6 +23,9 @@ for o, a in opts:
         modwsgi_compat = True
     elif o == "-l":
         reqlimit = int(a)
+    elif o == "-m":
+        if pdm is not None:
+            pdm.srv.listen(a)
 if len(args) < 1:
     usage(sys.stderr)
     sys.exit(1)
@@ -178,18 +185,21 @@ def dowsgi(req):
         resp[:] = status, headers
         return write
 
-    respiter = handler(env, startreq)
-    try:
+    with ashd.perf.request(env) as reqevent:
+        respiter = handler(env, startreq)
         try:
-            for data in respiter:
-                write(data)
-            if resp:
-                flushreq()
-        except closed:
-            pass
-    finally:
-        if hasattr(respiter, "close"):
-            respiter.close()
+            try:
+                for data in respiter:
+                    write(data)
+                if resp:
+                    flushreq()
+            except closed:
+                pass
+        finally:
+            if hasattr(respiter, "close"):
+                respiter.close()
+        if resp:
+            reqevent.response(resp)
 
 flightlock = threading.Condition()
 inflight = 0