annotate roundup/cgi/wsgi_handler.py @ 8126:f7bd22bdef9d permission-performance

Move permission check code to hyperdb Now the hyperdb has a method filter_with_permissions that performs the permission checks before (for filtering on sort/group/filterspec arguments) and after a call to hyperdb.filter. This also fixes possible problems on the unfiltered sort/group/filterspec arguments in roundup/rest.py and roundup/cgi/templating.py
author Ralf Schlatterbeck <rsc@runtux.com>
date Mon, 21 Oct 2024 18:12:03 +0200
parents dbeb6bf056c7
children 14c7c07b32d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 # WSGI interface for Roundup Issue Tracker
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # This module is free software, you may redistribute it
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 # and/or modify under the same terms as Python.
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 #
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 import os
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
8 from contextlib import contextmanager
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
9
7820
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
10 import roundup.instance
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
11 from roundup.anypy import http_
5837
883c9e90b403 Fix problem with cgi.escape being depricated a different way. This way
John Rouillard <rouilj@ieee.org>
parents: 5823
diff changeset
12 from roundup.anypy.html import html_escape
7820
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
13 from roundup.anypy.strings import s2b
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14 from roundup.cgi import TranslationService
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
15 from roundup.cgi.client import BinaryFieldStorage
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
16
5409
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
17 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler
277e91bf7936 Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5378
diff changeset
18 DEFAULT_ERROR_MESSAGE = http_.server.DEFAULT_ERROR_MESSAGE
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19
7556
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
20 try:
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
21 # python2 is missing this definition
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
22 http_.server.BaseHTTPRequestHandler.responses[429]
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
23 except KeyError:
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
24 http_.server.BaseHTTPRequestHandler.responses[429] = (
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
25 'Too Many Requests',
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
26 'The user has sent too many requests in '
7820
da4c51effdfd chore(lint): fix imports, normalize trailing , on list/tuple
John Rouillard <rouilj@ieee.org>
parents: 7819
diff changeset
27 'a given amount of time ("rate limiting")',
7556
273c8c2b5042 fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents: 7228
diff changeset
28 )
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
29
7834
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
30
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
31 class Headers(object):
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
32 """ Idea more or less stolen from the 'apache.py' in same directory.
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
33 Except that wsgi stores http headers in environment.
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
34 """
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
35 def __init__(self, environ):
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
36 self.environ = environ
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
37
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
38 def mangle_name(self, name):
5823
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
39 """ Content-Type is handled specially, it doesn't have a HTTP_
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
40 prefix in cgi.
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
41 """
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
42 n = name.replace('-', '_').upper()
5823
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
43 if n == 'CONTENT_TYPE':
edd9e2c67785 Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5821
diff changeset
44 return n
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
45 return 'HTTP_' + n
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
46
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
47 def get(self, name, default=None):
5821
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
48 return self.environ.get(self.mangle_name(name), default)
e7b30ab60941 Fix REST API for WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents: 5800
diff changeset
49 getheader = get
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
51
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 class Writer(object):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 '''Perform a start_response if need be when we start writing.'''
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 def __init__(self, request):
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
55 self.request = request # weakref.ref(request)
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
56
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 def write(self, data):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 f = self.request.get_wfile()
6083
f74d078cfd9a issue2551019 needs to be handled in the action code itself, not the WSGI handler
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6080
diff changeset
59 self.write = f
5609
dccf9b7e5ee4 Fix CSV export with WSGI and Python 3 (issue2551019).
Tom Ekberg <tekberg@uw.edu>
parents: 5539
diff changeset
60 return self.write(data)
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
62
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
63 class RequestHandler(object):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
64 def __init__(self, environ, start_response):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
65 self.__start_response = start_response
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
66 self.__wfile = None
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
67 self.headers = Headers(environ)
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
68 self.rfile, self.wfile = None, Writer(self)
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
69
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
70 def start_response(self, headers, response_code):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
71 """Set HTTP response code"""
7834
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
72 message, _explain = BaseHTTPRequestHandler.responses[response_code]
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
73 self.__wfile = self.__start_response('%d %s' % (response_code,
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
74 message), headers)
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
75
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
76 def get_wfile(self):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
77 if self.__wfile is None:
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
78 raise ValueError('start_response() not called')
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
79 return self.__wfile
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
80
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
81
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 class RequestDispatcher(object):
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
83 def __init__(self, home, debug=False, timing=False, lang=None,
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
84 feature_flags=None):
7834
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
85 if not os.path.isdir(home):
dbeb6bf056c7 chore(lint): _ unused var; replace assert wth if/raise; whitespace
John Rouillard <rouilj@ieee.org>
parents: 7820
diff changeset
86 raise ValueError('%r is not a directory' % (home,))
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 self.home = home
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 self.debug = debug
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 self.timing = timing
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
90 self.feature_flags = feature_flags or {}
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
91 self.tracker = None
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 if lang:
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
93 self.translator = TranslationService.get_translation(
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
94 lang,
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 tracker_home=home)
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 else:
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 self.translator = None
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
98
7819
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
99 if "cache_tracker" not in self.feature_flags or \
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
100 self.feature_flags["cache_tracker"] is not False:
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
101 self.tracker = roundup.instance.open(self.home, not self.debug)
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
102 else:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
103 self.preload()
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 def __call__(self, environ, start_response):
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 """Initialize with `apache.Request` object"""
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
107 request = RequestHandler(environ, start_response)
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
109 if environ['REQUEST_METHOD'] == 'OPTIONS':
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
110 if environ["PATH_INFO"][:5] == "/rest":
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
111 # rest does support options
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
112 # This I hope will result in self.form=None
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
113 environ['CONTENT_LENGTH'] = 0
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
114 else:
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
115 code = 501
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
116 message, explain = BaseHTTPRequestHandler.responses[code]
6387
0da655d1498d Remove Connection: close header for 501 error handling rest
John Rouillard <rouilj@ieee.org>
parents: 6326
diff changeset
117 request.start_response([('Content-Type', 'text/html')],
0da655d1498d Remove Connection: close header for 501 error handling rest
John Rouillard <rouilj@ieee.org>
parents: 6326
diff changeset
118 code)
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
119 request.wfile.write(s2b(DEFAULT_ERROR_MESSAGE % locals()))
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
120 return []
6061
82816000aef3 Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents: 5945
diff changeset
121
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
122 # need to strip the leading '/'
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
123 environ["PATH_INFO"] = environ["PATH_INFO"][1:]
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
124 if self.timing:
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
125 environ["CGI_SHOW_TIMING"] = self.timing
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126
6084
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
127 if environ['REQUEST_METHOD'] in ("OPTIONS", "DELETE"):
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
128 # these methods have no data. When we init tracker.Client
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
129 # set form to None to get a properly initialized empty
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
130 # form.
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
131 form = None
3cba8949bfe0 reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6083
diff changeset
132 else:
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
133 form = BinaryFieldStorage(fp=environ['wsgi.input'], environ=environ)
5945
40f5b20d1e70 issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents: 5837
diff changeset
134
7819
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
135 if "cache_tracker" not in self.feature_flags or \
0fe2b9f6e19f issue2551212 - enable wsgi cache_tracker by default
John Rouillard <rouilj@ieee.org>
parents: 7556
diff changeset
136 self.feature_flags["cache_tracker"] is not False:
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
137 client = self.tracker.Client(self.tracker, request, environ, form,
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
138 self.translator)
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
139 try:
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
140 client.main()
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
141 except roundup.cgi.client.NotFound:
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
142 request.start_response([('Content-Type', 'text/html')], 404)
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
143 request.wfile.write(s2b('Not found: %s' %
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
144 html_escape(client.path)))
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
145 else:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
146 with self.get_tracker() as tracker:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
147 client = tracker.Client(tracker, request, environ, form,
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
148 self.translator)
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
149 try:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
150 client.main()
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
151 except roundup.cgi.client.NotFound:
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
152 request.start_response([('Content-Type', 'text/html')], 404)
7228
07ce4e4110f5 flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents: 6747
diff changeset
153 request.wfile.write(s2b('Not found: %s' %
6747
d32d43e4a5ba wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents: 6387
diff changeset
154 html_escape(client.path)))
3736
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 # all body data has been written using wfile
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 return []
a2d22d0de0bc WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158
6326
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
159 def preload(self):
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
160 """ Trigger pre-loading of imports and templates """
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
161 with self.get_tracker():
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
162 pass
0343b6fea4b9 Factor preloading into a preload method
Ralf Schlatterbeck <rsc@runtux.com>
parents: 6321
diff changeset
163
6080
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
164 @contextmanager
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
165 def get_tracker(self):
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
166 # get a new instance for each request
274c2c082f68 factor out get_tracker so we can potentially customise if we want to reuse
Christof Meerwald <cmeerw@cmeerw.org>
parents: 6061
diff changeset
167 yield roundup.instance.open(self.home, not self.debug)

Roundup Issue Tracker: http://roundup-tracker.org/