Mercurial > p > roundup > code
annotate roundup/cgi/wsgi_handler.py @ 7556:273c8c2b5042
fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
Failed API login rate limiting with expiring lockout added.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Wed, 19 Jul 2023 20:37:45 -0400 |
| parents | 07ce4e4110f5 |
| children | 0fe2b9f6e19f |
| 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 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
8 import weakref |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
9 |
|
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
|
10 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
|
11 |
|
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 |
|
5800
1a835db41674
Call cgi.escape only on python 2. Replace with html.escapeif it can be
John Rouillard <rouilj@ieee.org>
parents:
5664
diff
changeset
|
13 |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
14 import roundup.instance |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
15 from roundup.cgi import TranslationService |
|
5409
277e91bf7936
Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
16 from roundup.anypy import http_ |
|
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
|
17 from roundup.anypy.strings import s2b |
|
5945
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
18 |
|
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
19 from roundup.cgi.client import BinaryFieldStorage |
|
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
20 |
|
5409
277e91bf7936
Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
21 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler |
|
277e91bf7936
Python 3 preparation: update BaseHTTPServer imports.
Joseph Myers <jsm@polyomino.org.uk>
parents:
5378
diff
changeset
|
22 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
|
23 |
|
7556
273c8c2b5042
fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents:
7228
diff
changeset
|
24 try: |
|
273c8c2b5042
fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents:
7228
diff
changeset
|
25 # 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
|
26 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
|
27 except KeyError: |
|
273c8c2b5042
fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents:
7228
diff
changeset
|
28 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
|
29 'Too Many Requests', |
|
273c8c2b5042
fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents:
7228
diff
changeset
|
30 'The user has sent too many requests in ' |
|
273c8c2b5042
fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents:
7228
diff
changeset
|
31 'a given amount of time ("rate limiting")' |
|
273c8c2b5042
fix(api): - issue2551063 - Rest/Xmlrpc interfaces needs failed login protection.
John Rouillard <rouilj@ieee.org>
parents:
7228
diff
changeset
|
32 ) |
|
6061
82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents:
5945
diff
changeset
|
33 |
| 5821 | 34 class Headers(object): |
| 35 """ Idea more or less stolen from the 'apache.py' in same directory. | |
| 36 Except that wsgi stores http headers in environment. | |
| 37 """ | |
| 38 def __init__(self, environ): | |
| 39 self.environ = environ | |
| 40 | |
| 41 def mangle_name(self, name): | |
|
5823
edd9e2c67785
Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5821
diff
changeset
|
42 """ 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
|
43 prefix in cgi. |
|
edd9e2c67785
Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5821
diff
changeset
|
44 """ |
| 5821 | 45 n = name.replace('-', '_').upper() |
|
5823
edd9e2c67785
Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5821
diff
changeset
|
46 if n == 'CONTENT_TYPE': |
|
edd9e2c67785
Make REST-API updates work with WSGI
Ralf Schlatterbeck <rsc@runtux.com>
parents:
5821
diff
changeset
|
47 return n |
| 5821 | 48 return 'HTTP_' + n |
| 49 | |
|
6061
82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents:
5945
diff
changeset
|
50 def get(self, name, default=None): |
| 5821 | 51 return self.environ.get(self.mangle_name(name), default) |
| 52 getheader = get | |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
53 |
|
6061
82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents:
5945
diff
changeset
|
54 |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 class Writer(object): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 '''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
|
57 def __init__(self, request): |
|
7228
07ce4e4110f5
flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents:
6747
diff
changeset
|
58 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
|
59 |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
60 def write(self, data): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
61 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
|
62 self.write = f |
|
5609
dccf9b7e5ee4
Fix CSV export with WSGI and Python 3 (issue2551019).
Tom Ekberg <tekberg@uw.edu>
parents:
5539
diff
changeset
|
63 return self.write(data) |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 |
|
6061
82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents:
5945
diff
changeset
|
65 |
|
6084
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
66 class RequestHandler(object): |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
67 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
|
68 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
|
69 self.__wfile = None |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
70 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
|
71 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
|
72 |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
73 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
|
74 """Set HTTP response code""" |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
75 message, explain = BaseHTTPRequestHandler.responses[response_code] |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
76 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
|
77 message), headers) |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
78 |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
79 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
|
80 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
|
81 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
|
82 return self.__wfile |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
83 |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
84 |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
85 class RequestDispatcher(object): |
|
6747
d32d43e4a5ba
wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents:
6387
diff
changeset
|
86 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
|
87 feature_flags=None): |
|
6061
82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents:
5945
diff
changeset
|
88 assert os.path.isdir(home), '%r is not a directory' % (home,) |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
89 self.home = home |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
90 self.debug = debug |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
91 self.timing = timing |
|
7228
07ce4e4110f5
flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents:
6747
diff
changeset
|
92 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
|
93 self.tracker = None |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
94 if lang: |
|
7228
07ce4e4110f5
flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents:
6747
diff
changeset
|
95 self.translator = TranslationService.get_translation( |
|
07ce4e4110f5
flake8 fixes: whitespace, remove unused imports
John Rouillard <rouilj@ieee.org>
parents:
6747
diff
changeset
|
96 lang, |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
97 tracker_home=home) |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
98 else: |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
99 self.translator = None |
|
6747
d32d43e4a5ba
wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents:
6387
diff
changeset
|
100 |
|
d32d43e4a5ba
wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents:
6387
diff
changeset
|
101 if "cache_tracker" in self.feature_flags: |
|
d32d43e4a5ba
wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents:
6387
diff
changeset
|
102 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
|
103 else: |
|
d32d43e4a5ba
wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents:
6387
diff
changeset
|
104 self.preload() |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
105 |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
106 def __call__(self, environ, start_response): |
|
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
107 """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
|
108 request = RequestHandler(environ, start_response) |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
109 |
|
6061
82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents:
5945
diff
changeset
|
110 if environ['REQUEST_METHOD'] == 'OPTIONS': |
|
5945
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
111 if environ["PATH_INFO"][:5] == "/rest": |
|
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
112 # rest does support options |
|
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
113 # 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
|
114 environ['CONTENT_LENGTH'] = 0 |
|
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
115 else: |
|
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
116 code = 501 |
|
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
117 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
|
118 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
|
119 code) |
|
5945
40f5b20d1e70
issue2551047: Fix crashes in DELETE, OPTIONS, PATCH
John Rouillard <rouilj@ieee.org>
parents:
5837
diff
changeset
|
120 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
|
121 return [] |
|
6061
82816000aef3
Flake8 whitespace changes, removal of unused import cgi.
John Rouillard <rouilj@ieee.org>
parents:
5945
diff
changeset
|
122 |
|
6084
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
123 # 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
|
124 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
|
125 if self.timing: |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
126 environ["CGI_SHOW_TIMING"] = self.timing |
|
3736
a2d22d0de0bc
WSGI support via roundup.cgi.wsgi_handler
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
127 |
|
6084
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
128 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
|
129 # 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
|
130 # 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
|
131 # form. |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
132 form = None |
|
3cba8949bfe0
reworked WSGI interface to not use the RequestDispatcher class for two
Christof Meerwald <cmeerw@cmeerw.org>
parents:
6083
diff
changeset
|
133 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
|
134 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
|
135 |
|
6747
d32d43e4a5ba
wsgi can cache tracker instance enabled by feature flag.
John Rouillard <rouilj@ieee.org>
parents:
6387
diff
changeset
|
136 if "cache_tracker" in self.feature_flags: |
|
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) |
