From 641f5e9bb3aa4af14539630fc4cb2d5c7f7b0066 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Thu, 26 May 2016 18:08:04 +0000 Subject: [PATCH] Refactor QuixoteHandler(), remove conn.close() call. We should not close the connection inside the handle_connection() method, the caller will call shutdown() and then close(). Refactor so that 'input' and 'output' file descriptors are closed on errors. --- quixote/server/scgi_server.py | 36 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/quixote/server/scgi_server.py b/quixote/server/scgi_server.py index 0a92a34..ff45f9e 100755 --- a/quixote/server/scgi_server.py +++ b/quixote/server/scgi_server.py @@ -10,29 +10,31 @@ class QuixoteHandler(scgi_server.SCGIHandler): self.publisher = create_publisher() self.script_name = script_name + def _set_script_name(self, env): + # mod_scgi doesn't know SCRIPT_NAME :-( + prefix = self.script_name + path = env['SCRIPT_NAME'] + assert path[:len(prefix)] == prefix, ( + "path %r doesn't start with script_name %r" % (path, prefix)) + env['SCRIPT_NAME'] = prefix + env['PATH_INFO'] = path[len(prefix):] + env.get('PATH_INFO', '') + def handle_connection(self, conn): input = conn.makefile("rb") output = conn.makefile("wb") - env = self.read_env(input) - - if self.script_name is not None: - # mod_scgi doesn't know SCRIPT_NAME :-( - prefix = self.script_name - path = env['SCRIPT_NAME'] - assert path[:len(prefix)] == prefix, ( - "path %r doesn't start with script_name %r" % (path, prefix)) - env['SCRIPT_NAME'] = prefix - env['PATH_INFO'] = path[len(prefix):] + env.get('PATH_INFO', '') - - response = self.publisher.process(input, env) try: - response.write(output) + env = self.read_env(input) + if self.script_name is not None: + self._set_script_name(env) + response = self.publisher.process(input, env) + try: + response.write(output) + except IOError as err: + self.publisher.log("IOError while sending response " + "ignored: %s" % err) + finally: input.close() output.close() - conn.close() - except IOError as err: - self.publisher.log("IOError while sending response " - "ignored: %s" % err) def run(create_publisher, host='localhost', port=3000, script_name=None,