X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=python3%2Fscgi-wsgi3;h=a8fccf04f21dec1a380b0574540c384a4f6cee7e;hp=1f5495dda630de1bfc97d18dd50e3dd4d1b32447;hb=HEAD;hpb=c9aa6b2889e6de7f82e5f44ab5bbcd0ef90099bd diff --git a/python3/scgi-wsgi3 b/python3/scgi-wsgi3 index 1f5495d..a8fccf0 100755 --- a/python3/scgi-wsgi3 +++ b/python3/scgi-wsgi3 @@ -2,19 +2,20 @@ import sys, os, getopt, logging, collections import socket -import ashd.scgi, ashd.perf, ashd.serve +import ashd.scgi, ashd.serve try: import pdm.srv except: pdm = None def usage(out): - out.write("usage: scgi-wsgi3 [-hAL] [-m PDM-SPEC] [-p MODPATH] [-T [HOST:]PORT] HANDLER-MODULE [ARGS...]\n") + out.write("usage: scgi-wsgi3 [-hAL] [-m PDM-SPEC] [-p MODPATH] [-t REQUEST-HANDLER[:PAR[=VAL](,PAR[=VAL])...]] [-T [HOST:]PORT] HANDLER-MODULE [ARGS...]\n") sk = None +hspec = "free", {} modwsgi_compat = False setlog = True -opts, args = getopt.getopt(sys.argv[1:], "+hALp:T:m:") +opts, args = getopt.getopt(sys.argv[1:], "+hALp:t:T:m:") for o, a in opts: if o == "-h": usage(sys.stdout) @@ -40,6 +41,8 @@ for o, a in opts: elif o == "-m": if pdm is not None: pdm.srv.listen(a) + elif o == "-t": + hspec = ashd.serve.parsehspec(a) if len(args) < 1: usage(sys.stderr) sys.exit(1) @@ -95,25 +98,20 @@ def recode(thing): else: return str(thing).encode("latin-1") -reqhandler = ashd.serve.freethread() - class request(ashd.serve.wsgirequest): def __init__(self, *, sk, **kw): super().__init__(**kw) - self.sk = sk.dup() + self.bsk = sk.dup() + self.sk = self.bsk.makefile("rwb") def mkenv(self): - fsk = self.sk.dup().makefile("rwb") - try: - return mkenv(ashd.scgi.readhead(fsk), fsk) - finally: - fsk.close() + return mkenv(ashd.scgi.readhead(self.sk), self.sk) def handlewsgi(self, env, startreq): return handler(env, startreq) def fileno(self): - return self.sk.fileno() + return self.bsk.fileno() def writehead(self, status, headers): w = self.buffer.extend @@ -124,17 +122,32 @@ class request(ashd.serve.wsgirequest): def flush(self): try: - ret = self.sk.send(self.buffer, socket.MSG_DONTWAIT) + ret = self.bsk.send(self.buffer, socket.MSG_DONTWAIT) self.buffer[:ret] = b"" except IOError: raise ashd.serve.closed() def close(self): self.sk.close() + self.bsk.close() -while True: - nsk, addr = sk.accept() - try: - reqhandler.handle(request(sk=nsk, handler=reqhandler)) - finally: - nsk.close() +if hspec[0] not in ashd.serve.names: + sys.stderr.write("scgi-wsgi3: no such request handler: %s\n" % hspec[0]) + sys.exit(1) +hclass = ashd.serve.names[hspec[0]] +try: + hargs = hclass.parseargs(**hspec[1]) +except ValueError as exc: + sys.stderr.write("scgi-wsgi3: %s\n" % exc) + sys.exit(1) + +reqhandler = hclass(**hargs) +try: + while True: + nsk, addr = sk.accept() + try: + reqhandler.handle(request(sk=nsk, handler=reqhandler)) + finally: + nsk.close() +finally: + reqhandler.close()