X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=python3%2Fscgi-wsgi3;h=a8fccf04f21dec1a380b0574540c384a4f6cee7e;hp=946513e7d55f522d6aa7bcc7179231995a15fc80;hb=HEAD;hpb=c67f9f8bb7c20ab7c5a6fef9d69d3606f0ff144a diff --git a/python3/scgi-wsgi3 b/python3/scgi-wsgi3 index 946513e..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,14 +122,26 @@ 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() + +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()