diff options
author | Helmut Grohne <helmut@subdivi.de> | 2009-02-26 17:25:54 +0100 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2009-02-26 17:25:54 +0100 |
commit | 413f01607ba7110d297512eee59b8bb45b930450 (patch) | |
tree | 8eb91a560fa780937c671196cde910512c88faf8 /wsgitools/scgi | |
parent | abba17cd18527a1ae92ab433c5236c1cd81e3eaa (diff) | |
download | wsgitools-413f01607ba7110d297512eee59b8bb45b930450.tar.gz |
made scgi.forkpool wsgi compliant in handling exc_info
Diffstat (limited to 'wsgitools/scgi')
-rw-r--r-- | wsgitools/scgi/forkpool.py | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/wsgitools/scgi/forkpool.py b/wsgitools/scgi/forkpool.py index 90c836a..26de9ef 100644 --- a/wsgitools/scgi/forkpool.py +++ b/wsgitools/scgi/forkpool.py @@ -326,15 +326,42 @@ class SCGIServer: value = data.pop(0) environ[key] = value + # elements: + # 0 -> None: no headers set + # 0 -> False: set but unsent + # 0 -> True: sent + # 1 -> status string + # 2 -> header list + response_head = [None, None, None] + + def sendheaders(): + assert response_head[0] is not None # headers set + if response_head[0] != True: + response_head[0] = True + try: + con.sendall('Status: %s\r\n%s\r\n\r\n' % (response_head[1], + '\r\n'.join(map("%s: %s".__mod__, + response_head[2])))) + except socket.error: + pass + def dumbsend(data): + sendheaders() try: con.sendall(data) except socket.error: pass def start_response(status, headers, exc_info=None): - dumbsend('Status: %s\r\n%s\r\n\r\n' % (status, - '\r\n'.join(map("%s: %s".__mod__, headers)))) + if exc_info and response_head[0]: + try: + raise exc_info[0], exc_info[1], exc_info[2] + finally: + exc_info = None + assert not response_head[0] # unset or not sent + response_head[0] = False # set but nothing sent + response_head[1] = status + response_head[2] = headers return dumbsend if not environ.get("CONTENT_LENGTH", "bad").isdigit(): @@ -360,9 +387,13 @@ class SCGIServer: result = self.wsgiapp(environ, start_response) assert hasattr(result, "__iter__") - for data in result: + assert response_head[0] is not None + result_iter = iter(result) + for data in result_iter: assert isinstance(data, str) dumbsend(data) + if response_head[0] != True: + sendheaders() if hasattr(result, "close"): result.close() sfw.close() |