Mercurial > p > roundup > code
diff roundup/cgi/wsgi_handler.py @ 6084:3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
different purposes (but have a separate RequestHandler)
| author | Christof Meerwald <cmeerw@cmeerw.org> |
|---|---|
| date | Sat, 08 Feb 2020 09:56:04 +0000 |
| parents | f74d078cfd9a |
| children | 979cecdb70f8 |
line wrap: on
line diff
--- a/roundup/cgi/wsgi_handler.py Sat Feb 08 00:29:13 2020 +0000 +++ b/roundup/cgi/wsgi_handler.py Sat Feb 08 09:56:04 2020 +0000 @@ -54,6 +54,25 @@ return self.write(data) +class RequestHandler(object): + def __init__(self, environ, start_response): + self.__start_response = start_response + self.__wfile = None + self.headers = Headers(environ) + self.rfile, self.wfile = None, Writer(self) + + def start_response(self, headers, response_code): + """Set HTTP response code""" + message, explain = BaseHTTPRequestHandler.responses[response_code] + self.__wfile = self.__start_response('%d %s' % (response_code, + message), headers) + + def get_wfile(self): + if self.__wfile is None: + raise ValueError('start_response() not called') + return self.__wfile + + class RequestDispatcher(object): def __init__(self, home, debug=False, timing=False, lang=None): assert os.path.isdir(home), '%r is not a directory' % (home,) @@ -68,13 +87,7 @@ def __call__(self, environ, start_response): """Initialize with `apache.Request` object""" - self.environ = environ - request = RequestDispatcher(self.home, self.debug, self.timing) - request.__start_response = start_response - - request.wfile = Writer(request) - request.__wfile = None - request.headers = Headers(environ) + request = RequestHandler(environ, start_response) if environ['REQUEST_METHOD'] == 'OPTIONS': if environ["PATH_INFO"][:5] == "/rest": @@ -89,25 +102,22 @@ request.wfile.write(s2b(DEFAULT_ERROR_MESSAGE % locals())) return [] - tracker = roundup.instance.open(self.home, not self.debug) + # need to strip the leading '/' + environ["PATH_INFO"] = environ["PATH_INFO"][1:] + if self.timing: + environ["CGI_SHOW_TIMING"] = self.timing - with self.get_tracker() as tracker: - # need to strip the leading '/' - environ["PATH_INFO"] = environ["PATH_INFO"][1:] - if request.timing: - environ["CGI_SHOW_TIMING"] = request.timing - + if environ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"): + # these methods have no data. When we init tracker.Client + # set form to None to get a properly initialized empty + # form. + form = None + else: form = BinaryFieldStorage(fp=environ['wsgi.input'], environ=environ) - if environ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"): - # these methods have no data. When we init tracker.Client - # set form to None and request.rfile to None to get a - # properly initialized empty form. - form = None - request.rfile = None - + with self.get_tracker() as tracker: client = tracker.Client(tracker, request, environ, form, - request.translator) + self.translator) try: client.main() except roundup.cgi.client.NotFound: @@ -118,17 +128,6 @@ # all body data has been written using wfile return [] - def start_response(self, headers, response_code): - """Set HTTP response code""" - message, explain = BaseHTTPRequestHandler.responses[response_code] - self.__wfile = self.__start_response('%d %s' % (response_code, - message), headers) - - def get_wfile(self): - if self.__wfile is None: - raise ValueError('start_response() not called') - return self.__wfile - @contextmanager def get_tracker(self): # get a new instance for each request
